Подтвердить что ты не робот

Наблюдать за диапазоном памяти в 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 можно использовать для просмотра любых изменений во всей области памяти?

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

4b9b3361

Ответ 1

Если вы используете GDB 7.4 вместе с Valgrind 3.7.0, то у вас есть неограниченные "эмулированные" аппаратные точки наблюдения.

Запустите свою программу под Valgrind, дав аргументы  --vgdb=full --vgdb-error=0 затем используйте GDB для подключения к нему (target remote | vgdb). Тогда вы можете, например, watch или awatch или rwatch диапазон памяти, выполнив rwatch (char[100]) *0x5180040

Подробнее см. руководство пользователя Valgrind по интеграции gdb

Ответ 2

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

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