(前言:我对C / C ++很陌生,我真的不知道本机代码的调试实际上是如何工作的。)
有些消息来源说gdb和lldb可以调试any program compiled to machine code。其他人说要使用gdb进行调试,必须在gcc with the -g
flag中进行编译。 gcc本身的文档表明这是可选的,实际上如果你使用它,它可能会导致除 gdb之外的调试器出现问题。 Clang还有一个-g
标志,文档基本上只是说“生成调试信息。”
这些调试器是否仅限于他们自己的工具链(GNU和LLVM),或者它们是否与编译器无关?
答案 0 :(得分:39)
理论上,您应该能够使用lldb调试GCC构建的程序,并使用gdb调试LLVM构建的程序。在这两种情况下,您都应该使用-g
进行编译。
这是因为两个编译器都以相同的格式生成目标文件(例如,在Linux上,两者都将生成带有ELF调试信息的DWARF文件),并且两个调试器都知道如何解析该格式。 / p>
实际上,两个编译器都会将一些数据推送到调试信息中,只有各自的调试器才知道如何使用。但是:
-gdwarf-2
而不是-g
应该只生成符合标准的DWARF。请注意,您也可以在没有调试信息的情况下调试程序(不使用-g
编译),但是您将仅限于调试器中的低级信息 - 汇编代码,内存和寄存器 - 并且不会能够看到高级构造,如行号,函数名,变量名和它们的内容之间的映射等。