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

Posted

技术标签:

【中文标题】是否可以使用lldb调试gcc编译的程序,或者使用gdb调试clang编译的程序?【英文标题】:Is it possible to debug a gcc-compiled program using lldb, or debug a clang-compiled program using gdb? 【发布时间】:2014-02-03 14:43:17 【问题描述】:

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

一些消息来源说 gdb 和 lldb 可以调试 any program compiled to machine code。其他人说要使用 gdb 进行调试,您必须在 gcc with the -g flag 中编译。 gcc 本身的文档表明这是可选的,事实上,如果您使用它,它可能会导致调试器出现问题 gdb。 Clang 还有一个-g 标志,文档基本上只是说“生成调试信息”。

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

【问题讨论】:

【参考方案1】:

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

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

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

    LLVM 生成的数据不应以任何方式阻碍 gdb。 GCC 生成的数据不应该妨碍 lldb,但如果有,你可以专门ask gcc to not add non-standard data。例如,在 Linux 上,使用 -gdwarf-2 而不是 -g 应该只生成符合标准的 DWARF。

请注意,您也可以在没有调试信息的情况下调试程序(未使用 -g 编译),但您将仅限于调试器中的低级信息 - 汇编代码、内存和寄存器 - 并且将无法查看高级结构,例如行号、函数名、变量名及其内容之间的映射等。

【讨论】:

关于-gdwarf-2 的一个小说明 - 这告诉 gcc 发出符合旧版本 DWARF 调试格式规范的调试信息。当前版本是 4。有时消费者(调试器)不会理解后来的 DWARF 标准中的所有最新特性,因此有必要让生产者(编译器)不发出所有花哨/最新的构造。但这些问题通常是短暂的,因为新功能很快就会在消费者中得到支持,每个人都可以与普通的旧 -g 相处并相处。 即使使用-g,我也无法在 Mac OS X 上使用lldb (lldb-310.2.37) 看到使用g++ (MacPorts gcc47 4.7) 编译的程序的高级信息。 3_3)。 这是因为额外的 GCC 包袱使 LLDB 无法解释调试内容吗?

以上是关于是否可以使用lldb调试gcc编译的程序,或者使用gdb调试clang编译的程序?的主要内容,如果未能解决你的问题,请参考以下文章

使用 LLDB API 获取使用 ARM-GCC 编译的 elf 文件中表达式的地址

iOS 调试进阶-更高效的使用 Xcode 和 LLDB

是否有 GCC 编译指示可以覆盖某些代码段的调试信息 (-g) 的生成?

LLDB:添加符号文件?

LLDB调试基本使用

ubuntu18.04上使用LLDB调试Chromium_Android