Я запускаю приложение через gdb, и я хочу установить точку останова в любое время, когда к какой-либо конкретной переменной обращаются/изменяются. Есть ли хороший способ для этого? Я также был бы заинтересован в других способах контролировать переменную в C/С++, чтобы увидеть, изменяется ли она/когда она изменяется.
Могу ли я установить точку останова на "доступ к памяти" в GDB?
Ответ 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
Таким образом, это кажется возможным, но вам, похоже, нужна определенная аппаратная поддержка.
Ответ 5
Да, вы можете. http://www.technochakra.com/debugging-types-of-data-breakpoints-in-gdb/ обсуждает различные точки останова данных для gdb.
Ответ 6
Используйте часы, чтобы увидеть, когда записывается переменная, rwatch, когда она читается, и awatch, когда она читается/записывается с/на, как указано выше. Однако учтите, что для использования этой команды вы должны разбить программу, и переменная должна быть в области действия, когда вы нарушили программу:
Используйте команду watch. Аргументом команды watch является выражение, которое оценивается. Это означает, что переменная, которую вы хотите для установки точки наблюдения должны находиться в текущей области. Итак, чтобы установить точки наблюдения на неглобальной переменной, вы должны установить точку останова что остановит вашу программу, когда переменная находится в области видимости. Вы устанавливаете точки наблюдения после разрыва программы.