c++ - 为 lldb 启用调试工具

标签 c++ macos debugging makefile lldb

我在通过 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/

相关文章:

java - 从堆栈跟踪元素获取实际类

c++ - 如何将默认值设置为 QDoubleSpinBox

c++ - c语言实现密码安全的程序?

objective-c - NSThread 分离新线程选择器 : Crash only in release build in Xcode 7 + Swift 2. 0

c - 操作系统: read raw keyboard input in C

php - 用于调试 Codeigniter 的好 PHP Ide?

c++ - 获取要调用的继承函数的函数

c++ - Eigen :掩码数组

c++ - 没有管理员权限的 SFML 1.6

调试:当单步退出方法时,Android studio 会导致应用程序崩溃