在lldb中使用clang在OS X上构建二进制文件的堆栈跟踪

时间:2016-10-21 09:59:25

标签: xcode clang lldb

曾几何时,我可以在安装了Xcode命令行工具的操作系统X上执行以下操作,就像我在Linux上通常那样:

vim foo.cpp
#... write some buggy code that segfaults
gcc -g foo.cpp
gdb a.out
(gdb) bt

我会看到一个很好的,象征性的堆栈跟踪。如今,gdb已被lldb和gcc替换为clang。如果我只是使用clang++进行构建并执行lldb a.out我没有符号。

我已经尝试运行dsymutil并获得了Mach-O 64-bit dSYM companion file x86_64类型的文件,并尝试使用target symbols add在lldb中加载它,堆栈跟踪中仍然没有符号。但我必须承认,我放弃了http://lldb.llvm.org/symbolication.html的中途,认为通过所有这些箍和循环从我自己制作的二进制文件中获取一个flippin'堆栈跟踪是不可能的。

所以我的问题归结为:使用标准Xcode工具在现代OS X系统的命令行上用gcc和gdb实现我几年前所做的最简单的方法是什么?

请注意,不能使用port或homebrew等安装gcc和gdb。我需要使用标准Xcode工具从命令行构建并获取堆栈跟踪。

1 个答案:

答案 0 :(得分:0)

问题解决了。 Jim的评论让我从头开始制作一个完整的简单foo.cpp示例,它确实像他用很好的符号化堆栈描述描述的那样工作。

事实证明我刚才没有仔细阅读lldb的输出 - 非符号化堆栈跟踪实际上不是来自我的崩溃,而是来自dyld无法解析的库加载器外部依赖。

所以答案是lldbclang完全符合我的预期。我只是受到以下输出的欺骗:

dyld: Library not loaded: libbarlib.dylib
 Referenced from: fooexe
  Reason: image not found
Process 776 stopped
* thread #1: tid = 0xec52b9, 0x00007fff5fc01075 dyld`dyld_fatal_error + 1, stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
    frame #0: 0x00007fff5fc01075 dyld`dyld_fatal_error + 1
dyld`dyld_fatal_error:
->  0x7fff5fc01075 <+1>: nop    

dyld`dyldbootstrap::start:
    0x7fff5fc01076 <+0>: pushq  %rbp
    0x7fff5fc01077 <+1>: movq   %rsp, %rbp
    0x7fff5fc0107a <+4>: pushq  %r15
(lldb) bt
* thread #1: tid = 0xec52b9, 0x00007fff5fc01075 dyld`dyld_fatal_error + 1, stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
  * frame #0: 0x00007fff5fc01075 dyld`dyld_fatal_error + 1
    frame #1: 0x00007fff5fc03f87 dyld`dyld::halt(char const*) + 77
    frame #2: 0x00007fff5fc05fda dyld`dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*) + 4174
    frame #3: 0x00007fff5fc01276 dyld`dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*, unsigned long*) + 512
    frame #4: 0x00007fff5fc01036 dyld`_dyld_start + 54