Сначала убедитесь, что LLVM скомпилирован с включенными параметрами отладки, что в основном является настройкой по умолчанию. Если вы не скомпилировали LLVM с опциями не по умолчанию, тогда ваша текущая сборка должна быть в порядке.
Все проходы LLVM запускаются с использованием инструмента opt
(оптимизатора) LLVM. Проходы компилируются в общие объектные файлы, то есть файл LLVMHello.so
в build/lib
, а затем загружаются инструментом opt
. Чтобы отладить или пройти через этап, мы должны остановить LLVM до того, как он начнет выполнять файл .so
, потому что нет способа поставить точку останова в общем объектном файле. Вместо этого мы можем поставить разрыв в коде до того, как вызовет проход.
Мы собираемся установить точку останова в llvm/lib/IR/Pass.cpp
Вот как это сделать:
Перейдите в build / bin и откройте терминал и введите gdb opt
. Если вы скомпилировали llvm с добавленными символами отладки, тогда gdb потребуется некоторое время для загрузки символов отладки, в противном случае GDB скажет loading debugging symbols ... (no debugging symbols found)
.
Теперь нам нужно установить точку останова в методе void Pass::preparePassManager(PMStack &)
в Pass.cpp
. Вероятно, это первый (или один из первых) методов загрузки прохода.
Вы можете сделать это, набрав break llvm::Pass::preparePassManager
в терминале.
Запуск перевала. У меня есть файл битового кода с именем trial.bc
и тот же пропуск LLVMHello.so
, поэтому я запускаю его с
run -load ~/llvm/build/lib/LLVMHello.so -hello < ~/llvmexamples/trial.bc > /dev/null
GDB теперь остановится на Pass::preparePassManager
, и с этого момента мы можем использовать step и next для отслеживания выполнения.