是否可以使用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 文件中表达式的地址