【问题标题】:Using LLDB for debugging C使用 LLDB 调试 C
【发布时间】:2015-12-20 04:14:08
【问题描述】:

我正在为一些基本的多边形操作编写一个小型 C 库,并且我正在尝试从命令行使用 LLDB 进行调试。我可以使用已编译的测试运行程序运行 LLDB,但在逐步执行时我只能看到汇编指令而不是 C 代码。

我已经使用 -g 标志编译了我的库和测试运行程序,如下面的 Makefile 所示:

#Define compiler flags
CFLAGS = -g -Wall -Werror

#Define objects
OBJECTS = MASClip.o MASGraph.o MASClipTest.o

tests : $(OBJECTS) 
    cc $(CFLAGS) $(OBJECTS) -o tests 

MASClip.o : MASClip.h MASClip.c
    cc $(CFLAGS) -c MASClip.c

MASGraph.o : MASGraph.h MASGraph.c
    cc $(CFLAGS) -c MASGraph.c

MASClipTest.o : MASClipTest.c
    cc $(CFLAGS) -c MASClipTest.c

test :
    make
    make clean
    ./tests

.PHONY : clean

clean :
    rm *.o

我可以通过函数名设置断点所以我不明白为什么代码不显示。

我四处搜索,但我没有发现我所做的与教程和其他问题所说的有所不同。我一定遗漏了一些明显的东西。

另外,我意识到我可以在 Xcode 中执行此操作,但是当我直接编写 C 语言时,我喜欢使用 VIM,如果能够从命令行使用 LLDB,那就太好了。

如何让 LLDB 在调试时显示实际的 C 代码?

【问题讨论】:

  • idk 也许您需要每个对象的 cflags?或者您实际上遇到了错误,并且某些对象没有重建?
  • cc 是否在调用 gcc?据我所知,-g 只被gccg++ 识别。
  • 我相信 cc 调用的 clang 编译器确实有一个 -g 标志用于调试信息。
  • 我假设您执行了 make clean 然后再次运行 make 以确保使用调试信息重建所有对象?
  • 我只是从源文件编译而没有先编译成对象,它可以工作。显然,不可能遍历预编译目标文件的代码。对吗?

标签: c macos debugging lldb


【解决方案1】:

在 OS X 上,调试信息存储在 .o 文件中。调试器使用可执行文件中的“调试映射”来引用 .o 文件。看起来您在尝试调试之前正在删除 .o 文件,因此调试器没有调试信息。

在调试时保留 .o 文件,或者在可执行文件上运行 dsymutil 工具以生成链接的调试输出文件 (.dSYM。) 如果将 dSYM 放在可执行文件旁边(或任何Spotlight 搜索)然后 lldb 会自动找到它。

请注意,如果您只是给编译器一个 .c 文件列表,它会自动为您生成一个 dSYM - 因为它会在完成后删除 .o 文件 - 因此仍然可以进行调试。

【讨论】:

    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2020-11-24
    • 2014-10-11
    • 1970-01-01
    • 2023-02-26
    • 2022-06-12
    相关资源
    最近更新 更多