使用lldb调试gcc编译的程序或者使用gdb调试clang编译的程序,这种情况是否可能?

54

(前言:我对C/C++相当陌生,不知道本地代码调试的实际工作方式。)

有些来源说,gdb和lldb可以调试任何编译成机器码的程序。还有些人说,要用gdb进行调试,则必须在gcc中使用-g标志进行编译。而gcc自身的文档则表明这是可选的。事实上,如果使用它,可能会导致除gdb以外的调试器出问题。Clang也有一个-g标志,文档基本上只是说“生成调试信息”。

那么,这些调试器是否限制于它们自己的工具链(GNU和LLVM),还是与所使用的编译器无关呢?

1个回答

54
理论上,您应该能够使用lldb调试GCC构建的程序,并使用gdb调试LLVM构建的程序。在这两种情况下,您都应该使用-g编译。
这是因为两个编译器都会生成相同格式的目标文件(例如,在Linux上,它们都将生成带有DWARF调试信息的ELF文件),并且两个调试器都知道如何解析该格式。
实际上,两个编译器都会推送一些数据到调试信息中,只有它们各自的调试器才知道如何使用。然而:
  1. LLVM生成的数据不应以任何方式妨碍gdb。
  2. GCC生成的数据不应妨碍lldb,但如果确实如此,您可以明确地要求gcc不添加非标准数据。例如,在Linux上,使用-gdwarf-2而不是-g应该只生成符合标准的DWARF。
注意,您也可以在没有调试信息的情况下(未编译使用-g),调试程序,但您将受到调试器中低级别信息的限制 - 汇编代码、内存和寄存器 - 并且无法看到高级结构,例如行号、函数名称、变量名称与其内容之间的映射等。

5
关于-gdwarf-2的一个小澄清 - 这告诉gcc要发出符合较旧版本的DWARF调试格式规范的调试信息。 当前版本是4。有时,消费者(调试器)将无法理解较新的DWARF标准中的所有最新功能,因此有必要让生产者(编译器)不发出所有最花哨/最新的结构。 但这些问题通常很短暂,因为新功能很快得到消费者的支持,每个人都可以使用普通的-g并相处融洽。 - Jason Molenda
即使使用-g选项,我在Mac OS X上使用lldb(lldb-310.2.37)调试用g++(MacPorts gcc47 4.7.3_3)编译的程序时也无法看到高级别信息。 - Alec Jacobson
这是因为额外的GCC负担阻止了LLDB能够解释调试信息吗? - Jack Wasey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接