У меня есть виртуальный адрес (указатель инструкции) функции, полученный из backtrace call. Мне нужно выяснить отладочную информацию об этом.
Например, мне нужна информация о функции attach_backtraces
.
nm -a Backtrace.so | grep attach_backtraces
000000000002cdfe t _ZN2xsL17attach_backtracesENS_3RefE
Смещение 0x2cdfe
можно определить, вычтя из P C (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
? Какой кусок я скучаю? Моим следующим шагом будет запрос DWARF-информации для функции со смещением 0x2cdfe
, чтобы получить отладочную информацию.
PS. Я собираю полную обратную трассировку, где должны быть представлены имя символа, файл и строка. Какую библиотеку C / C ++ лучше использовать для разбора / получения информации из DWARF
?
Addon:
Нет, других attach_backtraces
в выводе readelf -w
нет. Я обнаружил, что
DW_AT_sibling: <0x3a163>
и его определение:
Нет, других attach_backtraces
в выводе readelf -w
нет. Я обнаружил, что
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 (адрес целевой функции).
Является ли этот расчет правильным?