为lldb启用调试工具

时间:2015-04-20 08:02:15

标签: c++ macos debugging makefile lldb

我在使用lldb在使用clang ++的MacOsX上进行调试时遇到了麻烦。我使用makefile在C ++中编译projet,我不知道是否必须在编译命令中启用调试选项。

这是我的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: [...]

我没有设法在互联网上找到答案,所以我有兴趣得到一些帮助!谢谢!

2 个答案:

答案 0 :(得分:1)

它看起来像调试信息丢失的某个地方。一种可能性是,在构建您关心的.o文件之前,您的CFLAGS正在重置,因此.o文件没有调试信息。一种简单的检查方法是运行

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

如果您没有看到“sectname”输出,那么您的.o文件没有调试信息。

运行你的makefile并查看my_file.c的构建行,并确保确实传递了-g个选项。 -ggdb实际上并没有为clang做任何特别的事情,所以-g就是你所需要的......

如果.o文件有调试信息,那么在构建最终二进制文件时它必定会丢失。

Mac OS X在处理调试信息方面有点滑稽。它不会将调试信息写入最终映像,而是将“调试映射”写入可执行文件,并将调试信息保留在.o文件中。剥离二进制文件时,调试映射会被剥离,因此如果剥离可执行文件,将删除指向调试信息的链接。当然,如果在构建之后删除.o文件,那么也会删除调试信息。

答案 1 :(得分:0)

我终于安装了gdb,我设法正常调试。但是看完你的帖子后,你让我意识到我可能在编译时删除了.o。我没有考虑过,因为lldb能够在某些情况下(在特定的情况下)设置断点,但在其他情况下(在特定的线路上)则没有。

当我使用makefile时,我忘记在编译后删除所有.o的自动删除,我认为这可能会导致问题。现在,如果我让.o,那就完美了。但这让我很惊讶,因为我的makefile与我的同事一样,并且他能够使用gdb进行调试而没有任何问题。

非常感谢您的所有信息。

相关问题