Как получить имя символа для адреса памяти в GDB? - PullRequest
35 голосов
/ 18 апреля 2009

Например, я знаю, что 0x46767f0 принадлежит NSString *, есть ли способ узнать, что это за NSString, чтобы помочь мне найти ошибки, за которыми я следую?

Ответы [ 5 ]

50 голосов
/ 18 апреля 2009

Я считаю, что вы ищете:

info symbol <addresss>

Распечатать название символа, который хранится по адресу addr. Если ни один символ не хранится точно в адресе, GDB печатает ближайший символ и смещение от него.

Пример:

(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

Подробнее об этом можно прочитать здесь .

12 голосов
/ 29 ноября 2012

gdb> list * 0xAABBCCDD

Это говорит вам имя файла и номер строки.

4 голосов
/ 18 апреля 2009

Если это переменная стека, я не знаю, как это сделать. В противном случае попробуйте p/a <pointer symbol or address>, и он напечатает имя символа (или смещение до ближайшего имени символа).

3 голосов
/ 18 апреля 2009

po 0x46767f0

отправит объекту сообщение -description. Это напечатает содержимое вашей строки NSString, но я предлагаю использовать ответ Брайана, чтобы проверить содержимое вашего адреса, прежде чем отправлять случайные сообщения на случайные адреса.

0 голосов

addr2line

Эта утилита Binutils может обрабатывать любой символьный адрес, включая переменные и имена функций.

По умолчанию он неинтерактивен, что полезно в некоторых случаях при вскрытии.

main.c:

#include <stdio.h>

int myvar;

int main(void) {
    printf("myvar = %d\n", myvar);
}

Скомпилировать и разобрать:

gcc -O 0 -g gdb3 -o main -pedantic-errors -std=c89 -Wextra main.c
readelf -s tmp.out  | grep -E ' (main|myvar)'

Дает:

55: 0000000000201014     4 OBJECT  GLOBAL DEFAULT   24 myvar
65: 000000000000064a    32 FUNC    GLOBAL DEFAULT   14 main

А теперь мы можем попробовать:

addr2line -e main 201014 64a

, что дает:

/full/path/to/main.c:3
/full/path/to/main.c:5
...