Смотреть диапазон памяти в GDB?

Я отлаживаю программу в gdb и хочу, чтобы программа остановилась при доступе к области памяти от 0x08049000 до 0x0804a000. Когда я пытаюсь установить точки останова памяти вручную, GDB, кажется, не поддерживает более двух местоположений одновременно.

(gdb) awatch *0x08049000
Hardware access (read/write) watchpoint 1: *0x08049000
(gdb) awatch *0x08049001
Hardware access (read/write) watchpoint 2: *0x08049001
(gdb) awatch *0x08049002
Hardware access (read/write) watchpoint 3: *0x08049002
(gdb) run
Starting program: /home/iblue/git/some-code/some-executable
Warning:
Could not insert hardware watchpoint 3.
Could not insert hardware breakpoints:
You may have requested too many hardware breakpoints/watchpoints.

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

Итак: Как я могу наблюдать всю область памяти?

Интересный факт: PowerPC имеет точки останова (но не точки наблюдения?):stackoverflow.com/questions/13410941/…
x86 поддерживает небольшие диапазоны часов до 8 байт:en.wikipedia.org/wiki/X86_debug_register

Ответы на вопрос(2)

Решение Вопроса

неограниченный "эмулируемый" аппаратные точки наблюдения.

Start your program under Valgrind, giving the arguments --vgdb=full --vgdb-error=0 затем используйте GDB для подключения к нему (target remote | vgdb). Then you can e.g. watch или жеawatch или жеrwatch a memory range by doing rwatch (char[100]) *0x5180040

See Руководство пользователя Valgrind по интеграции с GDB Больше подробностей

 iblue14 июн. 2012 г., 01:00
После того, как я провел большую часть дня, возясь сmprotect и злоупотребляя обработчиками SIGSEV, чтобы нарушить доступ к памяти, я попробовал это. Работает отлично. Ты спас мой день. Спасибо!
 14 июн. 2012 г., 02:10
Да, +1 тоже. Я искал подобную функцию в течение нескольких месяцев.
 11 февр. 2016 г., 20:59
Итак, как определить адрес кучи для процесса, запущенного valgrind? Я обычно делаю это через/proc/[pid]/maps но когда я запускаю python с помощью этой команды valgrind, файл карт не имеет записи, идентифицируемой[heap] как я привык находить.

аппаратная точка остановаи это фактически особенность CPU & # x2014; регистр внутри контроллера памяти, который определяет, когда осуществляется доступ к определенному адресу, и запускает прерывание прерывания отладчика. к несчастьюархитектура x86 только четыре таких регистра и именно поэтому вы ограничены числом контрольных точек отслеживания памяти, которые вы можете установить.

Вот почему вам нужно использовать что-то вроде valgrind; Если вы хотите просмотреть весь регион, вы должны сделать это с помощью программного обеспечения, которое имитирует шаблоны доступа к памяти. Однако я не знаю, поддерживает ли valgrind просмотр целых диапазонов памяти. Возможно, вам придется исправить это самостоятельно. Измените VALGRIND_MAKE_MEM_NOACCESS (), чтобы создать точку останова, но затем, возможно, продолжить выполнение программы.

Ваш ответ на вопрос