Я запускаю приложение через gdb, и я хочу установить точку останова в любое время, когда к определенной переменной обращаются/изменяются. Есть ли хороший способ для этого? Я также был бы заинтересован в других способах мониторинга переменной в C/C++, чтобы увидеть, изменяется ли она/когда она изменяется.Могу ли я установить точку останова на «доступ к памяти» в GDB?
ответ
часы перерывы только на записи, 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.
Я просто попытался следующее:
$ 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
Так что кажется возможным, но вы действительно кажется, нужна аппаратная поддержка.
Если ваша платформа не поддерживает аппаратные точки наблюдения, то gdb должен вернуться к точке наблюдения программного обеспечения. – Tod 2013-10-23 22:22:15
Предполагая, что первый ответ со ссылкой на C-подобный синтаксис (char *)(0x135700 +0xec1a04f)
тогда ответ сделать rwatch *0x135700+0xec1a04f
неверен. Правильный синтаксис - rwatch *(0x135700+0xec1a04f)
.
Недостаток ()
s причинил мне большую боль, пытаясь самостоятельно использовать точки наблюдения.
Да, вы можете. http://www.technochakra.com/debugging-types-of-data-breakpoints-in-gdb/ обсуждает различные точки останова данных для gdb.
Используйте часы, чтобы увидеть, когда переменная записана, rwatch, когда она читается, и awatch, когда она считывается/записывается с/на, как указано выше. Однако учтите, что для использования этой команды вы должны разбить программу, и переменная должна быть в области, когда вы нарушили программу:
Используйте команду watch. Аргумент команды watch представляет собой вычисляемое выражение . Это означает, что переменная, которую вы хотите установить для установки точки наблюдения, должна находиться в текущей области. Таким образом, чтобы установить точку наблюдения на неглобальную переменную, вы должны установить точку останова , которая остановит вашу программу, когда переменная находится в области видимости. Вы устанавливаете точку наблюдения после разрыва программы.
То, что вы ищете, называется точкой наблюдения .
Использование
(gdb) watch foo
: смотреть значение переменнойfoo
(gdb) watch *(int*)0x12345678
: смотреть значение, на который указывает на адрес, отлитого на любой тип вы хотите
(gdb) watch a*b + c/d
: часы произвольное комплексное выражение, va крышка на родном языке программы
Контрольные точки бывают трех видов:
- часы: GDB будет перерыв, когда записи происходит
- rwatch: GDB сломается wnen чтения происходит
- awatch: gdb будет разбит на в обоих случаях
Вы можете выбрать наиболее подходящий для ваших нужд.
Для получения дополнительной информации, проверьте this.
- 1. Установить точку останова GDB в файле C
- 2. Установить точку останова файла в gdb
- 3. gdb не может получить доступ к памяти в подключенном процессе при попытке установить точку останова
- 4. Не удалось установить точку останова gdb
- 5. gdb: установить точку останова для обработчика SIGBUS
- 6. Могу ли я установить точку останова на изменяющееся значение?
- 7. Можно ли назвать точку останова в GDB?
- 8. Могу ли я установить точку останова во включенном коде?
- 9. gdb игнорирует точку останова в загрузчике Qemu
- 10. gdb отключить точку останова в конкретной теме
- 11. GDB не может вставить внутреннюю точку останова
- 12. gdb, установить точку останова для всех функций в файле
- 13. Установить точку останова в LibC с помощью gdb
- 14. GDB не может установить точку останова в общей библиотеке
- 15. Могу ли он установить «точку останова данных» на возвращаемое значение
- 16. NDK Debugging, не может установить точку останова
- 17. GDB: программно удалить точку наблюдения
- 18. Могу ли я добавить точку останова на CreateProcess в VS
- 19. Установить точку останова gdb две строки после существующей метки
- 20. gdb: как установить точку останова в файле с пробелами
- 21. gdb: функция поиска по имени, чтобы установить точку останова
- 22. Как установить точку останова
- 23. почему я не могу установить точку останова на FOPEN в Linux
- 24. Установить точку останова в Racket?
- 25. Почему я не могу установить точку останова в представлении ASP.NET?
- 26. Установить точку останова на упаковке в Eclipse
- 27. Установить точку останова с помощью подстановочных знаков?
- 28. как я могу поставить точку останова на «что-то печатается на терминал» в gdb?
- 29. «GDB» отладчик пропускает точку останова Жутко
- 30. node-debug: почему я не могу установить точку останова?
Если вы хотите посмотреть член метода C++, я нашел этот вариант чрезвычайно полезным: `watch -location mTextFormatted`. – 2011-05-17 12:10:36
Что делать, если у меня нет адреса переменной? Могу ли я просто использовать его имя? – 2011-05-25 19:07:43
Вы можете иметь GDB печатать адрес переменной с адресом-оператором. `print & variable` – Loduwijk 2011-06-28 19:21:54