我想以编程方式将回溯堆栈地址(例如从 backtrace_symbols/libunwind 获得)转换为 file:line:column。我在 OSX 上,但怀疑这会有所作为。
所有这些都为调用 fun1() 提供了错误的行号(第 11 行):
- 阿托斯
- addr2line
- llvm-符号化器
- lldb
image lookup --address
在 bt 中使用 lldb 的 pc 地址
lldbbt
本身给出了正确的文件:行:列,(第 7 行),如下所示。
如何以编程方式获取正确的堆栈地址,以便在使用 atos/addr2line/llvm-symbolizer/image lookup --address 时,它会解析为正确的行号?lldbbt
做得正确,所以必须有办法做到这一点。请注意,如果我使用backtrace_symbols
or (从调用后libunwind
减去),我最终会得到与lldb bt 中所示相同的地址,该地址指向错误的行号 11info.dli_saddr
dladdr
0x0000000100000f74
注意:在 .lldbinit 中,如果我添加settings set frame-format frame start-addr:${line.start-addr}\n
它将显示正确的地址(即解析为 0x0000000100000f6f 而不是 0x0000000100000f74,这将解析为正确的第 7 行)。但是,我如何以编程方式从 ac 程序生成 start-addr 而不调用产生调用lldb -p $pid
(调用 lldb 有其他问题,例如与 llvm-symbolizer 相比的开销,实际上即使使用 也可以永远挂起-batch
)。
clang -g -o /tmp/z04 test_D20191123T162239.c
test_D20191123T162239.c:
void fun1(){
}
void fun1_aux(){
int a = 0;
fun1(); // line 7
mylabel:
if(1){
a++; // line 11
}
}
int main(int argc, char *argv[]) {
fun1_aux();
return 0;
}
lldb /tmp/z04
(lldb) target create "/tmp/z04"
Current executable set to '/tmp/z04' (x86_64).
(lldb) b fun1
Breakpoint 1: where = z04`fun1 + 4 at test_D20191123T162239.c:2:1, address = 0x0000000100000f54
(lldb) r
Process 7258 launched: '/tmp/z04' (x86_64)
Process 7258 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100000f54 z04 fun1 + 4 at test_D20191123T162239.c:2:1
1 void fun1(){
-> 2 }
3
4 void fun1_aux(){
5 int a = 0;
6
7 fun1();
Target 0: (z04) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
* frame #0: 0x0000000100000f54 z04 fun1 + 4 at test_D20191123T162239.c:2:1
frame #1: 0x0000000100000f74 z04 fun1_aux + 20 at test_D20191123T162239.c:7:3
frame #2: 0x0000000100000fab z04 main(argc=1, argv=0x00007ffeefbfb748) + 27 at test_D20191123T162239.c:16:3
frame #3: 0x00007fff71c182e5 libdyld.dylib start + 1
frame #4: 0x00007fff71c182e5 libdyld.dylib start + 1
(lldb)
(lldb) image lookup --address 0x0000000100000f74
Address: z04[0x0000000100000f74] (z04.__TEXT.__text + 36)
Summary: z04`fun1_aux + 20 at test_D20191123T162239.c:11:8
echo 0x0000000100000f74 | llvm-symbolizer -obj=/tmp/z04
fun1_aux
test_D20191123T162239.c:11:8
atos -o /tmp/z04 0x0000000100000f74
fun1_aux (in z04) (test_D20191123T162239.c:11)
同样与addr2line