Могу ли я установить точку останова на "доступ к памяти" в GDB?

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

Ответ 1

смотреть только разрывы на записи, 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 willingness to use watchpoint hardware is 1.

Ответ 2

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

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

Ответ 3

То, что вы ищете, называется точкой наблюдения.

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

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

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

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

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

  • смотреть: gdb будет разбит при возникновении записи
  • rwatch: gdb прервется, если произойдет чтение
  • awatch: gdb сломается в обоих случаях

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

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

Ответ 4

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

 $ 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

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

Ответ 6

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

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