Можно ли отладить программу, скомпилированную с помощью gcc, с помощью lldb или отладить программу, скомпилированную с помощью clang, с помощью gdb?

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

Некоторые источники говорят, что gdb и lldb могут отлаживать любую программу, скомпилированную в машинный код < / а>. Другие говорят, что для отладки с помощью gdb вы должны скомпилировать gcc с флагом -g . Документация для самого gcc предполагает, что это необязательно, и что на самом деле, если вы его используете, это может вызвать проблемы для отладчиков кроме gdb. У Clang также есть флаг -g, и в документации просто написано «Сгенерировать отладочную информацию».

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


person Neil Traft    schedule 15.01.2014    source источник


Ответы (1)


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

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

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

  1. Данные, сгенерированные LLVM, никоим образом не должны мешать GDB.
  2. Данные, сгенерированные GCC, не должны мешать lldb, но если это так, вы можете конкретно спросить gcc чтобы не добавлять нестандартные данные. Например, в Linux использование -gdwarf-2 вместо -g должно генерировать только соответствующий стандарту DWARF.

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

person Oak    schedule 15.01.2014
comment
Одно небольшое уточнение по поводу -gdwarf-2 - это указывает gcc выдавать отладочную информацию, которая соответствует более старой версии спецификации формата отладки DWARF. Текущая версия - 4. Иногда потребители (отладчики) не понимают всех новейших функций в более поздних стандартах DWARF, поэтому необходимо, чтобы производитель (компиляторы) не генерировал все самые модные / новейшие конструкции. Но эти проблемы обычно недолговечны, так как новые функции поддерживаются потребителями достаточно скоро, и каждый может жить с простым старым -g и ладить. - person Jason Molenda; 09.02.2014
comment
Даже с -g я не могу видеть информацию высокого уровня, используя lldb (lldb-310.2.37) в Mac OS X для программ, скомпилированных с g++ (MacPorts gcc47 4.7.3_3). - person Alec Jacobson; 17.06.2014
comment
Это потому, что лишний багаж GCC мешает LLDB интерпретировать отладочную информацию? - person Jack Wasey; 06.04.2019