След GDB, содержащий похожие адреса, но разные исходные строки

Я пытался отладить inkscape и поставить точку останова по адресу в его основной разделяемой библиотеке (т. е. /usr/lib/inkscape/libinkscape_base.so). Когда выполнение достигло этой точки останова, обратная трассировка выглядела следующим образом:

#0  0x00007ffff6ecb220 in __static_initialization_and_destruction_0 (__priority=65535, __initialize_p=1) at /usr/include/c++/7/iostream:74
#1  0x00007ffff6ecb220 in _GLOBAL__sub_I_log_display_config.cpp(void) () at ./src/debug/log-display-config.cpp:83
#2  0x00007ffff7de5733 in call_init (env=0x7fffffffddd8, argv=0x7fffffffddc8, argc=1, l=<optimized out>) at dl-init.c:72
#3  0x00007ffff7de5733 in _dl_init (main_map=0x7ffff7ffe170, argc=1, argv=0x7fffffffddc8, env=0x7fffffffddd8) at dl-init.c:119
#4  0x00007ffff7dd60ca in _dl_start_user () at /lib64/ld-linux-x86-64.so.2
#5  0x0000000000000001 in  ()
#6  0x00007fffffffe176 in  ()
#7  0x0000000000000000 in  ()

Как видно, #0 и #1 указывают на один и тот же адрес, но на разные исходные местоположения. То же самое верно для #2 и #3. Как это возможно?


person TheAhmad    schedule 27.11.2019    source источник


Ответы (1)


Как это возможно?

Это возможно с инлайнингом.

GCC выдает достаточную отладочную информацию для GDB, чтобы сообщить, что конкретный адрес, даже если он физически расположен внутри bar, на самом деле принадлежит встроенному foo.

Так как foo "на самом деле там нет", но обращение к нему синтезируется GDB в выводе backtrace, то какой адрес GDB печатает для него, несколько не имеет значения.

Раньше GDB вообще не печатал адреса (моя версия 8.3.50.20190824-24.fc31 все еще печатает), но я думаю, что это ненадежно, и иногда GDB может просто повторять предыдущий адрес возврата.

person Employed Russian    schedule 27.11.2019
comment
Спасибо. Следует отметить, что в коде есть много ручных модификаций указателя стека, в том числе вокруг этой точки останова, например, add $0x8,%rsp и через несколько строк после этого у нас есть sub $0x8,%rsp. Могут ли эти строки сделать вывод обратной трассировки ненадежным? - person TheAhmad; 27.11.2019