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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
248
0
152 921
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

 $ 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 24.10.2013 02:22
Ответ принят как подходящий

смотреть прерывается только при записи, 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 
 = 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-точки наблюдения.

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

Если вы хотите понаблюдать за членом метода C++, я нашел этот вариант чрезвычайно полезным: watch -location mTextFormatted.

Ivan Vučica 17.05.2011 16:10

Что делать, если у меня нет адреса переменной? Могу я просто использовать его имя?

Raffi Khatchadourian 25.05.2011 23:07

Вы можете заставить GDB распечатать адрес переменной с помощью оператора адресации. print &variable

Loduwijk 28.06.2011 23:21

Как отличаться при использовании awatch между остановками из-за чтения или записи?

Vineet Deoraj 13.03.2014 13:59

Этот ответ ничего не говорит о размер области памяти, которая отслеживается командами watch. Между тем, это первый вопрос, который приходит на ум после прочтения вышеизложенного. Сколько байтов rwatch *0xfeedface действительно будет смотреть?

AnT 06.11.2015 23:52

@AnT, я предполагал, что он будет смотреть один байт, что, похоже, так, но вы можете привести его к определенному типу, например. rwatch *(int *)0xfeedface, и он будет смотреть байты sizeof(int): sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html

asksol 10.12.2015 08:46

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

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

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

Use the watch command. The argument to the watch command is an expression that is evaluated. This implies that the variabel you want to set a watchpoint on must be in the current scope. So, to set a watchpoint on a non-global variable, you must have set a breakpoint that will stop your program when the variable is in scope. You set the watchpoint after the program breaks.

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

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

(gdb) watch foo: следите за значением Переменнаяfoo

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

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

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

  • смотреть: GDB сломается, когда произойдет записывать
  • rwatch: GDB сломается, если произойдет читать
  • Часы: GDB сломается в оба случая

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

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

Я написал ответ еще один, потому что существующие мне не казались очень простыми ...

Paolo M 03.07.2015 11:54

Другие вопросы по теме