我在通过 clang++ 在 MacOsX 上使用 lldb 进行调试时遇到了问题。我正在使用 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: [...]
我没能在网上找到答案,所以我很想得到一些帮助!谢谢!
最佳答案
调试信息似乎在某个地方丢失了。一种可能是您的 CFLAGS 在您开始构建您关心的 .o 文件之前被重置,因此 .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 文件,那么调试信息也会被删除。
关于c++ - 为 lldb 启用调试工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29742268/