(前言:我对C/C++相当陌生,不知道本地代码调试的实际工作方式。)
有些来源说,gdb和lldb可以调试任何编译成机器码的程序。还有些人说,要用gdb进行调试,则必须在gcc中使用-g
标志进行编译。而gcc自身的文档则表明这是可选的。事实上,如果使用它,可能会导致除gdb以外的调试器出问题。Clang也有一个-g
标志,文档基本上只是说“生成调试信息”。
那么,这些调试器是否限制于它们自己的工具链(GNU和LLVM),还是与所使用的编译器无关呢?
(前言:我对C/C++相当陌生,不知道本地代码调试的实际工作方式。)
有些来源说,gdb和lldb可以调试任何编译成机器码的程序。还有些人说,要用gdb进行调试,则必须在gcc中使用-g
标志进行编译。而gcc自身的文档则表明这是可选的。事实上,如果使用它,可能会导致除gdb以外的调试器出问题。Clang也有一个-g
标志,文档基本上只是说“生成调试信息”。
那么,这些调试器是否限制于它们自己的工具链(GNU和LLVM),还是与所使用的编译器无关呢?
-g
编译。-gdwarf-2
而不是-g
应该只生成符合标准的DWARF。-g
),调试程序,但您将受到调试器中低级别信息的限制 - 汇编代码、内存和寄存器 - 并且无法看到高级结构,例如行号、函数名称、变量名称与其内容之间的映射等。
-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