我正在尝试调试我正在编写的 C++ 程序,但是当我在 LLDB 中运行它并停止程序时,它只向我显示汇编程序,而不是原始源代码。例如,崩溃后我正在尝试调试:
Process 86122 stopped
* thread #13: tid = 0x142181, 0x0000000100006ec1 debug_build`game::update() + 10961, stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
frame #0: 0x0000000100006ec1 debug_build`game::update() + 10961
debug_build`game::update:
-> 0x100006ec1 <+10961>: movq (%rdx), %rdx
0x100006ec4 <+10964>: movq %rax, -0xb28(%rbp)
0x100006ecb <+10971>: movq -0x1130(%rbp), %rax
0x100006ed2 <+10978>: movq 0x8(%rax), %rsi
我正在用-O0 -g
. 通过 Xcode(我在 OSX 上)或从命令行运行调试器时,我看到了同样的情况。
我还需要做什么才能让源代码显示在 LLDB 中?
补充说明
下面是一个典型的构建命令示例:
clang++ -std=c++1y -stdlib=libc++ -fexceptions -I/usr/local/include -c -O2 -Wall -ferror-limit=5 -g -O0 -ftrapv lib/format.cpp -o format.o
较早-O2
的存在是因为这是我使用的默认设置,但我相信后者-O0
会覆盖它,对吗?
我试过的
我使用相同的构建设置通过一个简单的“hello world”程序重新创建了这个问题。
经过一番搜索,我尝试运行
dsymutil main.o
which saidwarning: no debug symbols in executable (-arch x86_64)
,所以调试符号可能不是由我的构建命令生成的?我也尝试添加
-gsplit-dwarf
到构建命令但没有效果。这是我的“hello world”版本中的链接命令:
clang++ main.o -L/usr/local/lib -g -o 你好
我在可执行文件和目标文件上运行
dwarfdump
(我在这里读到了)。在我未经训练的眼睛看来,调试符号出现在目标文件中,但不在可执行文件本身中(除非dwarfdump
仅适用于目标文件,这是可能的)。所以也许链接阶段是问题所在。或者也许 DWARF 有问题。通过在终端中一个接一个地发出构建命令,我现在已经在“hello world”程序中工作了。因此,我猜测这可能是我的构建系统(Tup)的问题,可能是使用不同的工作目录运行命令,因此路径会被破坏或其他原因。