有可能使用lldbdebugging一个gcc编译的程序,或使用gdbdebugging一个铿锵编译的程序?

(前言:我对C / C ++来说很新,而且我不太清楚在本地代码中的debugging是如何工作的。)

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

那么这些debugging器限制在自己的工具链(GNU和LLVM)中,还是在某种程度上独立于所使用的编译器?

从理论上说,你应该能够用gdbdebugging一个使用lldb编译GCC的程序和使用gdb编译LLVM的程序。 在这两种情况下,你应该用-g编译。

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

实际上,两个编译器都会将一些数据放入debugging信息中,只有各自的debugging器知道如何使用。 然而:

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

注意,你也可以在没有debugging信息的情况下debugging程序(不是用-g编译),但是你将被限制在debugging器中的底层信息 – 汇编代码,内存和寄存器 – 并且不能看到高级结构如行号,函数名称,variables名称及其内容之间的映射等。