смотреть только перерывы на запись, rwatch позволяет разбить на чтение, и смотреть позволяет разбивать при чтении / записи.
Вы можете установить точки наблюдения чтения в ячейках памяти:
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.
watch -location mTextFormatted
.print &variable
watch
команды. Между тем, это первый вопрос, который приходит на ум после прочтения вышеизложенного. Сколько байтовrwatch *0xfeedface
будет на самом деле смотреть?rwatch *(int *)0xfeedface
и он будет смотретьsizeof(int)
байты: sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints. htmlТо, что вы ищете, называется сторожевой точкой .
использование
(gdb) watch foo
: смотреть значение переменнойfoo
(gdb) watch *(int*)0x12345678
: смотреть значение, указанное адресом , приведенное к любому типу, который вы хотите(gdb) watch a*b + c/d
: смотреть произвольно сложное выражение , действительное на родном языке программыТочки наблюдения бывают трех видов:
Вы можете выбрать более подходящий для ваших нужд.
Для получения дополнительной информации, проверьте это .
источник
Если предположить, что первый ответ ссылается на синтаксис, подобный C,
(char *)(0x135700 +0xec1a04f)
то ответ на этот вопросrwatch *0x135700+0xec1a04f
неверен. Правильный синтаксис естьrwatch *(0x135700+0xec1a04f)
.Отсутствие
()
там вызвало у меня сильную боль, пытаясь использовать точки наблюдения самостоятельно.источник
Я просто попробовал следующее:
Так что это кажется возможным, но вам, кажется, нужна некоторая аппаратная поддержка.
источник
Используйте watch, чтобы увидеть, когда записывается переменная, rwatch, когда она читается, и часы, когда она читается / записывается из / в, как отмечено выше. Тем не менее, обратите внимание, что для использования этой команды вы должны прервать выполнение программы, а переменная должна находиться в области видимости, когда вы нарушили программу:
источник