2008-09-12 2 views
198

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

ответ

240

часы перерывы только на записи, 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() 

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

gdb$ show can-use-hw-watchpoints 
Debugger's willingness to use watchpoint hardware is 1. 
+5

Если вы хотите посмотреть член метода C++, я нашел этот вариант чрезвычайно полезным: `watch -location mTextFormatted`. – 2011-05-17 12:10:36

+0

Что делать, если у меня нет адреса переменной? Могу ли я просто использовать его имя? – 2011-05-25 19:07:43

+5

Вы можете иметь GDB печатать адрес переменной с адресом-оператором. `print & variable` – Loduwijk 2011-06-28 19:21:54

9

Я просто попытался следующее:

$ 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 

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

+0

Если ваша платформа не поддерживает аппаратные точки наблюдения, то gdb должен вернуться к точке наблюдения программного обеспечения. – Tod 2013-10-23 22:22:15

22

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

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

1

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

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

14

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

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

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

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

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

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

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

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

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

Смежные вопросы