Отображение высокого и низкого уровня ПК для каждой функции программы с использованием библиотеки DWARF

Я пытаюсь заставить этот код работать: https://github.com/eliben/code-for-blog/blob/master/2011/dwarf_get_func_addr.c Он взят из руководства, созданного Эли Бендерски на http://eli.thegreenplace.net/2011/02/07/how-debuggers-work-part-3-debugging-information К сожалению, low pc и high pc всегда возвращают один и тот же адрес почти для каждой функции:

DW_TAG_subprogram: 'aFunctionName'

low pc  : 0x00000001
high pc : 0x7f3a00000001

Принимая во внимание, что если objdump --dwarf=decodedline ./lulesh_normal >> dump_dwarf.txt дает мне:

File name                            Line number    Starting address
lulesh.cc                                   1297            0x402e00

lulesh.cc                                   1297            0x402e11
lulesh.cc                                   1299            0x402ee4
lulesh.cc                                   1300            0x402ef0
lulesh.cc                                   1301            0x402ef6
lulesh.cc                                   1299            0x402f00
[...]

Таким образом, ему удается связать строку и адрес, но не найти реальный адрес функций. Любая идея, почему?

Спасибо за помощь,


person Hugo    schedule 12.09.2017    source источник


Ответы (1)


Код в dwarf_get_func_addr.c имеет как минимум одну ошибку: он предполагает, что каждая функция имеет атрибуты DW_AT_low_pc и DW_AT_high_pc, и будет печатать неинициализированные значения, если это не так.

Вы должны инициализировать lowpc = highpc = -1; в строке 42, чтобы не печатать неинициализированные значения.

Кроме этого, невозможно помочь вам без доступа к вашему двоичному файлу lulesh_normal.

Вы должны выполнить readelf -wi lulesh_normal, а затем выполнить list_func_in_die в отладчике и сравнить то, что читает программа, с выводом readelf — они должны совпадать один к одному. Если нет, возможно, ваша версия libdwarf содержит ошибки.

person Employed Russian    schedule 13.09.2017