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

Nei*_*aft 45 gcc gdb llvm clang lldb

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

一些消息来源说gdb和lldb可以调试任何编译成机器代码的程序.其他人说要使用gdb进行调试,你必须使用-g标志在gcc中编译.gcc本身的文档表明这是可选的,实际上如果你使用它,它可能会导致gdb 以外的调试器出现问题.Clang还有一个-g标志,文档基本上只是说"生成调试信息".

那么这些调试器是否仅限于它们自己的工具链(GNU和LLVM),还是它们在某种程度上独立于所使用的编译器?

Oak*_*Oak 40

从理论上讲,您应该能够使用lldb调试GCC构建的程序,并使用gdb调试LLVM构建的程序.在这两种情况下你都应该用-g.

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

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

  1. LLVM生成的数据不应以任何方式阻碍gdb.
  2. GCC生成的数据不应该阻碍lldb,但如果确实如此,你可以特别要求gcc 添加非标准数据.例如,在Linux上,使用-gdwarf-2over -g应该只生成符合标准的DWARF.

请注意,您也可以在没有调试信息的情况下调试程序(未编译-g),但您将仅限于调试器中的低级信息 - 汇编代码,内存和寄存器 - 并且无法查看高级结构,例如行号,函数名,变量名及其内容之间的映射等.

  • 关于`-gdwarf-2`的一个小澄清 - 这告诉gcc发出符合旧版本DWARF调试格式规范的调试信息.当前版本是4.有时消费者(调试器)将无法理解后来的DWARF标准中的所有最新功能,因此必须让生产者(编译器)不发出所有最好/最新的结构.但是这些问题通常是短暂的,因为新功能很快得到了消费者的支持,每个人都可以和普通的`-g`一起生活并相处. (4认同)