首页 文章

为lldb启用调试工具

提问于
浏览
2

我在使用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 回答

  • 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文件,那么也会删除调试信息 .

  • 0

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

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

    非常感谢您的所有信息 .

相关问题