lldb 中的 Stacktrace with clang 在 OS X 上构建了二进制文件

Stacktrace in lldb with clang built binary on OS X

曾几何时,我能够在安装了 Xcode 命令行工具的情况下在 OS 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' 堆栈跟踪是不可能的。

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

请注意,仅使用端口或自制软件等安装 gcc 和 gdb 不是一个选项。- 我需要使用标准 Xcode 工具从命令行构建和获取堆栈跟踪。

问题已解决。 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