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
库加载器没有解决外部依赖。
所以答案是 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
曾几何时,我能够在安装了 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
库加载器没有解决外部依赖。
所以答案是 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