Подтвердить что ты не робот

Можно ли отлаживать gcc-скомпилированную программу с помощью lldb или отлаживать компиляцию с помощью gang?

(Предисловие: я довольно новичок в C/С++, и я действительно не знаю, как на самом деле работает отладка в собственном коде.)

В некоторых источниках говорится, что gdb и lldb могут отлаживать любую программу, скомпилированную в машинный код. Другие говорят, что для отладки с помощью gdb вы должны компилироваться в gcc с флагом -g. Документация для gcc сама предполагает, что это необязательно, и на самом деле, если вы его используете, это может вызвать проблемы для отладчиков, отличных от gdb. У Clang также есть флаг -g, и в документации в основном просто сказано "Генерировать информацию отладки".

Итак, эти отладчики ограничены своими собственными инструментальными цепочками (GNU и LLVM) или они каким-то образом независимы от используемого компилятора?

4b9b3361

Ответ 1

В теории вы должны иметь возможность отлаживать GCC-построенную программу с lldb и LLVM-построенной программой с gdb. В обоих случаях вы должны скомпилировать с -g.

Это связано с тем, что оба компилятора генерируют объектные файлы в том же формате (например, в Linux, оба будут генерировать файлы ELF с DWARF debug info), и оба отладчика знают, как разбирать этот формат.

На практике оба компилятора вводят некоторые данные в информацию об отладке, которую только их соответствующий отладчик знает, как потреблять. Однако:

  • Данные, сгенерированные LLVM, не должны каким-либо образом препятствовать gdb.
  • Данные, генерируемые GCC, не должны препятствовать lldb, но если вы действительно можете попросить gcc не добавлять нестандартные данные. Например, в Linux использование -gdwarf-2 over -g должно только генерировать стандартно-совместимый DWARF.

Обратите внимание, что вы также можете отлаживать программы без отладочной информации (не скомпилированные с помощью -g), но вы будете ограничены низкоуровневой информацией в отладчике - ассемблером, памятью и регистрами и не сможете см. конструкции высокого уровня, такие как номера строк, имена функций, сопоставление имен переменных и их содержимого и т.д.