为lldb启用调试工具

Enable debug-tools for lldb

本文关键字:调试工具 启用 lldb      更新时间:2023-10-16

我在使用clang++在MacOsX上使用lldb进行调试时遇到问题。我使用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: [...]

我没能在网上找到答案,所以我很想得到一些帮助!非常感谢。

看起来调试信息正在丢失。一种可能性是,在构建您关心的.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文件包含调试信息,那么在构建最终二进制文件时,它一定会丢失。

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

我终于安装了gdb,并且调试正常。但在阅读了你的帖子后,你让我意识到我可能在编译时删除了.o。我没有想过,因为lldb在某些情况下(在特定的函数上)可以设置断点,但在其他情况下(特定的行上)则不能。

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

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