ГБД: как посмотреть, какие адреса памяти доступны? - PullRequest
1 голос
/ 21 сентября 2010

Предположим, во время сеанса отладки у меня есть адрес, который, к сожалению, указывает на какую-то ерунду.И я хочу изучить память вокруг, чтобы увидеть, что находится рядом.Как и ожидалось, возникает следующая ошибка:

(gdb) x/64 $t5
0x842da7ac:     Cannot access memory at address 0x842da7ac

Итак, вопрос: есть ли способ прочитать диапазон адресов, некоторые из которых недопустимы?

(Точнее, откуда мне знать, что в приведенном выше примере $t5+n является допустимым адресом для некоторых 0 < n <= 64?)

1 Ответ

5 голосов
/ 22 сентября 2010

Вы не можете прочитать неправильные адреса (очевидно).

В некоторых ОС вы можете запрашивать у ОС действительные адреса, пока процесс остановлен в GDB. Например, в Linux cat /proc/<pid>/maps предоставит вам информацию о том, какие адреса являются действительными (и режим доступа, для которого они действительны). Другие ОС могут иметь аналогичный механизм.

Поскольку вы отметили свой вопрос post-mortem, вы не можете использовать вышеуказанный механизм; но тогда у вас должен быть файл core. В Linux (и других ELF системах) readelf -l core сообщит вам, какие области памяти были записаны в ядро, что обычно дает вам хорошее представление о том, какая память была действительной в момент сбоя. Однако сопоставления, доступные только для чтения, обычно не записываются в core, поэтому такие сопоставления могут не отображаться в выводе readelf.

Все современные операционные системы используют подкачку страниц, и страницы имеют как минимум 1K (хотя 4K встречается чаще), поэтому вы можете сказать, что ближайшая к $t5 память, которая могла бы быть допустимой, равна 0x842da800, и итак n >= 84 (байт).

Наконец, если вы попросите GDB проверить 64 слова, а GDB не сможет проверить первое, оно остановится.

Однако, если вы используете GDB-7.x, вы можете попросить GDB проверять одно слово за раз в Python, и GDB сгенерирует исключение Python, если он не может исследовать это конкретное слово. Но так как вы можете перехватывать исключения Python, написать сценарий, который будет реализовывать «изучение следующих N слов, игнорируя любые нечитаемые слова» в Python (что, я считаю, отвечает на ваш вопрос «как это можно сделать»).

...