是否可以使用lldb调试gcc编译的程序,或使用gdb调试clang编译的程序?

时间:2014-01-15 08:13:37

标签: gcc gdb clang llvm lldb

(前言:我对C / C ++很陌生,我真的不知道本机代码的调试实际上是如何工作的。)

有些消息来源说gdb和lldb可以调试any program compiled to machine code。其他人说要使用gdb进行调试,必须在gcc with the -g flag中进行编译。 gcc本身的文档表明这是可选的,实际上如果你使用它,它可能会导致 gdb之外的调试器出现问题。 Clang还有一个-g标志,文档基本上只是说“生成调试信息。”

这些调试器是否仅限于他们自己的工具链(GNU和LLVM),或者它们是否与编译器无关?

1 个答案:

答案 0 :(得分:39)

理论上,您应该能够使用lldb调试GCC构建的程序,并使用gdb调试LLVM构建的程序。在这两种情况下,您都应该使用-g进行编译。

这是因为两个编译器都以相同的格式生成目标文件(例如,在Linux上,两者都将生成带有ELF调试信息的DWARF文件),并且两个调试器都知道如何解析该格式。 / p>

实际上,两个编译器都会将一些数据推送到调试信息中,只有各自的调试器才知道如何使用。但是:

  1. LLVM生成的数据不应该以任何方式妨碍gdb。
  2. GCC生成的数据不应该阻碍lldb,但如果确实如此,你可以专门ask gcc to not add non-standard data。例如,在Linux上,使用-gdwarf-2而不是-g应该只生成符合标准的DWARF。
  3. 请注意,您也可以在没有调试信息的情况下调试程序(不使用-g编译),但是您将仅限于调试器中的低级信息 - 汇编代码,内存和寄存器 - 并且不会能够看到高级构造,如行号,函数名,变量名和它们的内容之间的映射等。

相关问题