启用lldb的调试工具

3

我在使用lldb和clang++在MacOSX上进行调试时遇到了问题。我正在使用一个Makefile来编译一个C++项目,但我不知道是否需要在编译命令中启用调试选项。

这是我的Makefile的一部分:

FLAGS =-g -Wall -O0
[...]
clang++ $(FLAGS) $^ -o $@

当我尝试使用我的makefile配置运行lldb时,它返回了一个错误:
Breakpoint 1: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.

我想我需要在我的makefile中启用调试工具,但我在互联网上没有找到如何做到这一点。我尝试了-g-ggdb选项,但没有成功。
然而,当我尝试以不同的方式设置断点时,它可以正常工作(但是设置特定函数的断点对我没有兴趣...):
breakpoint set -n fonction
Breakpoint 1: [...]

我在互联网上没有找到答案,所以我很希望能得到一些帮助!谢谢!

这段话与IT技术无关。

当你在运行 lldb 时,如何设置断点? - m.s.
我尝试了(如文档所说)breakpoint set --file foo.cpp --line 12breakpoint set -f foo.cpp -l 12两种方式。 - Epsxy
2个回答

2

看起来在调试信息传递的过程中出了问题。可能的原因之一是在编译你关心的.o文件之前,你的CFLAGS被重置了,因此这些.o文件没有调试信息。一个简单的检查方法是运行:

$ otool -l my_file.o | grep debug_info
  sectname __debug_info

如果您没有看到“sectname”输出,则您的.o文件没有调试信息。运行您的makefile并查看my_file.c的构建行,确保实际传递了-g选项。对于clang来说,-ggdb并没有什么特殊之处,所以只需要-g就可以了。如果.o文件有调试信息,则必须在构建最终二进制文件时丢失了调试信息。Mac OS X在处理调试信息方面有点奇怪。它不会将调试信息写入最终映像中,而是在可执行文件中写入“debug-map”,并将调试信息留在.o文件中。当您剥离二进制文件时,这个debug-map会被剥离,因此如果您剥离可执行文件,则会删除与调试信息的链接。当然,如果您在构建后删除了.o文件,那么也会删除调试信息。

1
我终于安装了gdb,并成功进行了调试。但是在阅读您的帖子后,您让我意识到可能在编译时删除了.o文件。我没有考虑到这一点,因为lldb在某些情况下(在特定函数处)能够设置断点,但在其他情况下(在特定行处)则不行。

由于我使用的是makefile,我忘记删除了编译后自动删除所有.o的操作,我认为这可能会导致问题。现在,如果我保留.o,那么就可以完美地工作了。但是这让我感到非常惊讶,因为我的makefile与我的同事相同,他能够毫无问题地使用gdb进行调试。

非常感谢您提供的所有信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接