Я использую программу проверки кучи Google для отслеживания утечки памяти. Она дает мне трассировку стека, например:
Leak of 21 bytes in 1 objects allocated from:
@ 0xf6088241
@ 0xf60890d2
@ 0xf6089246
@ 0x8054781
@ 0x8054862
@ 0xf684ee76
@ 0xf684f343
@ 0x804be4c
@ 0x80544f6
@ 0xf5e52bb6
@ 0x804b101
Как мне d определить, каким функциям / строкам кода соответствуют эти адреса памяти?
Используйте команду info symbol
gdb. 16 Изучение таблицы символов .
info symbol addr
Распечатать название символа, который хранится по адресу addr. Если ни один символ не хранится точно в адресе, gdb печатает ближайший символ и смещение от него:
(gdb) info symbol 0x54320
_initialize_vx + 396 in section .text
Это противоположно команде info address. Вы можете использовать его, чтобы узнать имя переменной или функции по ее адресу.
Для динамически связанных исполняемых файлов также выводится имя исполняемой или разделяемой библиотеки, содержащей символ:
(gdb) info symbol 0x400225
_start + 5 in section .text of /tmp/a.out
(gdb) info symbol 0x2aaaac2811cf
__read_nocancel + 6 in section .text of /usr/lib64/libc.so.6
В первоначальном вопросе спрашивалось, как это сделать в GDB:
# NOT what you want; note the lack of '*':
(gdb) info symbol 0xfde09edc
blah() + 388 in section .text of /tmp/libblah.so
# IS what you want; note the presence of '*':
(gdb) info line *0xfde09edc
Line 91 of "blah.cc"
starts at address 0xfde09ebc <blah()+356>
and ends at 0xfde09ee4 <blah()+396>
*
необходимо для info line
и не должно использоваться для info symbol
.
Вы также можете использовать команду disassemble
с ее флагом /m
:
(gdb) disassemble /m 0xfde09edc
... хотя она довольно многословна и info line
дает именно то, что было запрошено.