Отладка прохода llvm с помощью gdb - PullRequest
5 голосов
/ 09 февраля 2010

Можно ли отладить проход llvm с помощью gdb? Я не смог найти никаких документов на сайте llvm.

Ответы [ 3 ]

6 голосов
/ 09 февраля 2010

Да. Сборка LLVM в режиме без релиза (по умолчанию). Это занимает немного больше времени, чем сборка релиза, но вы можете использовать gdb для отладки результирующего объектного файла.

Одно предостережение: мне пришлось обновить мой Linux-модуль до 3 ГБ памяти, чтобы разумное время соединения в режиме отладки LLVM.

2 голосов
/ 10 августа 2015

Сначала убедитесь, что LLVM скомпилирован с включенными параметрами отладки, что в основном является настройкой по умолчанию. Если вы не скомпилировали LLVM с опциями не по умолчанию, тогда ваша текущая сборка должна быть в порядке.

Все проходы LLVM запускаются с использованием инструмента opt (оптимизатора) LLVM. Проходы компилируются в общие объектные файлы, то есть файл LLVMHello.so в build/lib, а затем загружаются инструментом opt. Чтобы отладить или пройти через этап, мы должны остановить LLVM до того, как он начнет выполнять файл .so, потому что нет способа поставить точку останова в общем объектном файле. Вместо этого мы можем поставить разрыв в коде до того, как вызовет проход.

Мы собираемся установить точку останова в llvm/lib/IR/Pass.cpp

Вот как это сделать:

  1. Перейдите в build / bin и откройте терминал и введите gdb opt. Если вы скомпилировали llvm с добавленными символами отладки, тогда gdb потребуется некоторое время для загрузки символов отладки, в противном случае GDB скажет loading debugging symbols ... (no debugging symbols found).

  2. Теперь нам нужно установить точку останова в методе void Pass::preparePassManager(PMStack &) в Pass.cpp. Вероятно, это первый (или один из первых) методов загрузки прохода. Вы можете сделать это, набрав break llvm::Pass::preparePassManager в терминале.

  3. Запуск перевала. У меня есть файл битового кода с именем trial.bc и тот же пропуск LLVMHello.so, поэтому я запускаю его с

    run -load ~/llvm/build/lib/LLVMHello.so  -hello < ~/llvmexamples/trial.bc > /dev/null
    

    GDB теперь остановится на Pass::preparePassManager, и с этого момента мы можем использовать step и next для отслеживания выполнения.

0 голосов
/ 13 января 2015

Следуя советам Ричарда Пеннингтона + добавление обратных кавычек работает для меня:

gdb /usr/local/bin/opt

, затем введите

run `opt -load=/pathTo/LLVMHello.so  -hello < /pathTo/your.bc > /dev/null`

Примечание: я бы прокомментировал, но не смог (пропустив повтор)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...