我是 LLDB 的新手(实际上是大多数命令行工具的新手)。当我按照这篇极其简单且有用的文章来回溯段错误错误时,我发现使用 LLDB 在 Mac OS X 10.10 上的输出与使用 gdb 作为调试器的作者的输出不同。
为了让问题更清楚。当我使用 lldb 运行上面文章中的相同代码,遇到段错误错误,并使用btlldb 命令时,我得到了这条消息。
* thread #1: tid = 0x208541, 0x00007fff8869a05a libsystem_platform.dylib`_platform_memmove$VARIANT$Unknown + 186, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
* frame #0: 0x00007fff8869a05a libsystem_platform.dylib`_platform_memmove$VARIANT$Unknown + 186
frame #1: 0x00007fff8fc08866 libsystem_c.dylib`fgets + 243
frame #2: 0x0000000100000f34 sf`main + 68
frame #3: 0x00007fff8e6535c9 libdyld.dylib`start + 1
Run Code Online (Sandbox Code Playgroud)
由于我将可执行文件命名为“sf”(段错误的缩写),因此我按照文章中的想法并使用了f 2命令。
现在事情出了问题,因为我收到了这条消息。
frame #2: 0x0000000100000f34 sf`main + 68
sf`main:
0x100000f34 <+68>: leaq 0x5f(%rip), %rdi ; "%s\n"
0x100000f3b <+75>: movq -0x18(%rbp), %rsi
0x100000f3f <+79>: movq %rax, -0x20(%rbp)
0x100000f43 <+83>: movb $0x0, %al
Run Code Online (Sandbox Code Playgroud)
它看起来像是汇编语言,与上面文章中gdb给出的C语言相比确实没什么帮助,即:
#3 0x80484b2 in main (argc=1, argv=0xbffffaf4) at segfault.c:10
10 fgets(buf, 1024, stdin)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是我可以使用 LLDB 获得 C 语言回溯吗?
-g编译时需要添加该标志。另外,我建议使用该-O0标志,它告诉您的编译器执行最小的优化。通过更积极的优化,您可能会在调试器中得到奇怪的行为。通常,当我尝试追踪段错误和类似错误时,我发现条件断点和观察点是最有用的命令。您可以通过执行以下操作在行号处设置条件断点breakpoint set --file <filename> --line <line number> --condition '<some C expression>'。可以通过要观看的位置 w s e -- <address>来设置观看点。<address>