首页 文章

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

提问于
浏览
43

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

有些消息称gdb和lldb可以调试any program compiled to machine code . 其他人说用gdb调试你 must 在gcc with the -g flag中编译 . gcc本身的文档表明这是可选的,实际上如果你使用它,它可能会导致gdb以外的调试器出现问题 . Clang还有 -g 标志,文档基本上只是说"Generate debug information."

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

1 回答

  • 38

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

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

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

    • LLVM生成的数据不应以任何方式阻碍gdb .

    • GCC生成的数据不应该阻碍lldb,但如果确实如此,你可以专门ask gcc to not add non-standard data . 例如,在Linux上,使用 -gdwarf-2 over -g 应该只生成符合标准的DWARF .

    请注意,您也可以在没有调试信息的情况下调试程序(不使用 -g 编译),但是您将被限制在调试器中的低级信息 - 汇编代码,内存和寄存器 - 并且将无法看到高级构造,例如作为行号,函数名,变量名和它们的内容之间的映射等 .

相关问题