Могу ли я установить точку останова на доступ к памяти в GDB? - PullRequest
219 голосов
/ 12 сентября 2008

Я запускаю приложение через gdb и хочу установить точку останова для любого доступа к определенной переменной или ее изменения. Есть хороший метод для этого? Мне также были бы интересны другие способы мониторинга переменной в C / C ++, чтобы увидеть, если / когда она изменится.

Ответы [ 5 ]

264 голосов
/ 12 сентября 2008

смотреть только разрывы при записи, rwatch позволяет прерывать чтение и awatch позволяет прерывать чтение / запись.

Вы можете установить точки наблюдения для чтения в ячейках памяти:

gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface

но одно ограничение относится к командам rwatch и awatch; вы не можете использовать переменные GDB в выражениях:

gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.

Так что вы должны расширить их самостоятельно:

gdb$ print $ebx 
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f

Value = 0xec34daf
0x9527d6e7 in objc_msgSend ()

Редактировать: Да, и кстати. Вам необходимо либо аппаратное обеспечение , либо поддержка программного обеспечения . Программное обеспечение, очевидно, намного медленнее. Чтобы выяснить, поддерживает ли ваша ОС аппаратные контрольные точки, вы можете посмотреть параметр среды can-use-hw-watchpoints .

gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.
23 голосов
/ 08 июня 2009

Если первый ответ ссылается на C-подобный синтаксис (char *)(0x135700 +0xec1a04f), то ответ на rwatch *0x135700+0xec1a04f неверен. Правильный синтаксис: rwatch *(0x135700+0xec1a04f).

Отсутствие () s причинило мне большую боль, пытаясь самостоятельно использовать точки наблюдения.

22 голосов
/ 03 июля 2015

То, что вы ищете, называется контрольной точкой .

Использование

(gdb) watch foo: смотреть значение переменная foo

(gdb) watch *(int*)0x12345678: смотреть значение, указанное адресом , приведенное к любому типу, который вы хотите

(gdb) watch a*b + c/d: посмотреть произвольное сложное выражение , допустимое на родном языке программы

Точки наблюдения бывают трех видов:

  • watch : GDB прервется, когда write произойдет
  • rwatch : GDB прервется при чтении
  • awatch : GDB остановится в обоих случаях

Вы можете выбрать более подходящий для ваших нужд.

Для получения дополнительной информации, проверьте this out.

9 голосов
/ 12 сентября 2008

Я только что попробовал следующее:

 $ cat gdbtest.c
 int abc = 43;

 int main()
 {
   abc = 10;
 }
 $ gcc -g -o gdbtest gdbtest.c
 $ gdb gdbtest
 ...
 (gdb) watch abc
 Hardware watchpoint 1: abc
 (gdb) r
 Starting program: /home/mweerden/gdbtest 
 ...

 Old value = 43
 New value = 10
 main () at gdbtest.c:6
 6       }
 (gdb) quit

Так что это кажется возможным, но вам, кажется, нужна некоторая аппаратная поддержка.

2 голосов
/ 26 июня 2013

Используйте watch, чтобы увидеть, когда записывается переменная, rwatch, когда она читается, и часы, когда она читается / записывается из / в, как отмечено выше. Тем не менее, обратите внимание, что для использования этой команды вы должны прервать выполнение программы, а переменная должна находиться в области действия, когда вы нарушили программу:

Используйте команду watch. Аргументом для команды watch является выражение, которое оценивается. Это означает, что вы хотите переменную чтобы установить точку наблюдения должна быть в текущей области видимости. Итак, чтобы установить точка наблюдения для неглобальной переменной, вы должны установить точку останова это остановит вашу программу, когда переменная находится в области видимости. Вы устанавливаете точка наблюдения после перерыва в работе программы.

...