【发布时间】:2020-04-28 22:25:23
【问题描述】:
我有一个函数的虚拟地址(指令指针),从backtrace 调用中获得。我需要弄清楚它的调试信息。
例如,我需要有关attach_backtraces 函数的信息。
nm -a Backtrace.so | grep attach_backtraces
000000000002cdfe t _ZN2xsL17attach_backtracesENS_3RefE
偏移量0x2cdfe 可以通过从PC (IP) 中减去.so 加载的地址来确定。它与nm 的输出相匹配。
我从readelf -w Backtrace.so得到以下信息
<3><3a14f>: Abbrev Number: 0
<2><3a150>: Abbrev Number: 161 (DW_TAG_subprogram)
<3a152> DW_AT_name : (indirect string, offset: 0x21bf5): attach_backtraces
<3a156> DW_AT_decl_file : 22
<3a157> DW_AT_decl_line : 201
<3a158> DW_AT_decl_column : 13
<3a159> DW_AT_declaration : 1
<3a159> DW_AT_sibling : <0x3a163>
<3><3a15d>: Abbrev Number: 1 (DW_TAG_formal_parameter)
<3a15e> DW_AT_type : <0x36aac>
<3><3a162>: Abbrev Number: 0
为什么它的偏移量是0x21bf5 而不是预期的0x2cdfe?我错过了什么?我的下一步是在偏移量0x2cdfe 处查询函数的 DWARF-info 以获取调试信息。
附言。我正在收集完整的回溯,其中应显示符号名称、文件和行。哪个 C/C++ 库更适合用于从 DWARF 解析/获取信息?
插件:
不,readelf -w 输出中没有其他 attach_backtraces。我发现了
DW_AT_sibling:
它的定义:
不,readelf -w 输出中没有其他 attach_backtraces。我发现了
DW_AT_sibling : <0x3a163>
它的定义:
<1><3f9f5>: Abbrev Number: 27 (DW_TAG_subprogram)
<3f9f6> DW_AT_specification: <0x3a163>
<3f9fa> DW_AT_low_pc : 0x2c59e
<3fa02> DW_AT_high_pc : 0x860
<3fa0a> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa)
<3fa0c> DW_AT_GNU_all_tail_call_sites: 1
<3fa0c> DW_AT_sibling : <0x3fb21>
0x2c59e (DW_AT_low_pc) - 0x860 (DW_AT_high_pc) = 0x2cdfe(目标函数地址)。
这个计算正确吗?
【问题讨论】:
-
这个函数是内联的吗?