从前,我能够在OS X上安装Xcode命令行工具,就像我通常在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
类型的文件,并尝试在lldb中加载target symbols add
,在堆栈跟踪中仍然没有符号。但是我必须承认,我在浏览http://lldb.llvm.org/symbolication.html的过程中中途放弃了,我认为从我自己生成的二进制文件中通过所有这些环和循环来获得翻转堆栈跟踪是不可能的。
所以我的问题归结为:几年前我在现代OS X系统的命令行上使用标准的Xcode工具使用gcc和gdb来实现我上面所做的事情,最简单的方法是什么?
请注意,不是一个选项,只是安装gcc和gdb使用端口或自制等-我需要建立并获得一个堆栈跟踪从命令行使用标准Xcode工具。
问题解决。Jim的评论让我从头开始做了一个完整简单的foo.cpp
示例,它确实像他描述的那样工作,带有很好的符号堆栈跟踪。
原来我只是没有仔细阅读lldb
的输出-非符号堆栈跟踪实际上不是来自我的崩溃,而是来自dyld
库加载器,无法解析外部依赖。
所以答案是lldb
和clang
的工作完全如我所希望的。我只是被下面的输出欺骗了:
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