-
Если я устанавливаю точку наблюдения за переменной, локальной для текущей области, она будет автоматически удалена при выходе из области. Есть ли способ установить его один раз и сохранить его в автоматическом режиме при входе в ту же область?
-
Есть ли способ установить условную точку наблюдения, например
watch var1 if var1==0
? В моем случае условие не работает. gdb останавливается всякий раз, когда значениеvar1
изменяется, а не доvar1 == 0
- true. Мой gdb - GNU gdb 6.8-debian.
Как установить постоянные и условные точки наблюдения для локально ограниченных переменных?
Ответ 1
Я согласен с Дейвом в том, что условная точка останова - это путь.
Однако, чтобы выполнить то, что вы просили, вы можете использовать команду GDB commands
, чтобы установить список команд GDB для выполнения всякий раз, когда ударяется точка останова. Я считаю это невероятно полезным.
Я предлагаю записать ваши команды GDB в файл, чтобы их было легко редактировать и легко перезагрузить с помощью команды source
. Или вы можете указать файлы команд для загрузки в командной строке GDB или использовать .gdbinit, чтобы они автоматически загружались.
Пример хорошего использования commands
:
Предположим, что у меня есть функция format
, которая вызывается множеством других функций. Я хочу разбить его, но только после того, как была вызвана функция do_step_3
.
break do_step_3
commands
break format
continue
end
Вы можете использовать это для своей проблемы с чем-то вроде:
break func
commands
watch var
continue
end
Ответ 2
Вы можете установить условия на сторожевые точки так же, как и с точками останова. Это в документации, но, по общему признанию, он вряд ли обращает на себя внимание.
Итак, watch my_var if my_var > 3
работает отлично, как и команда condition
.
Чтобы воссоздать точку наблюдения, если наблюдаемая переменная выходит за пределы области видимости, используйте gdb автоматически, используя точку останова в начале функции, описанной Zan.
Ответ 3
Вы можете установить точку наблюдения, которая не выходит за пределы области видимости, установив ее на адрес памяти.
(gdb) p &var1
$1 = (int *) 0x41523c0
(gdb) watch *(int *)0x41523c0
Hardware watchpoint 1: *(int *)0x41523c0
Это также работает для других типов данных и указателей.
Ответ 4
-
Я не уверен, какой язык мы используем, поэтому точный ответ будет отличаться, но вы могли бы изменить переменную как статическую, глобальную или динамически распределенную (и не освобождать ее, когда функция возвращается?). Таким образом, его необработанный адрес не изменится, и gdb сможет получить точку останова на нем.
-
Вместо просмотра значения, равного определенному значению; вы должны установить условную точку прерывания в строке, где вы хотите проверить значение
var1
. Это должно эффективно иметь тот же эффект.
например.
(gdb) break main.c:123 if (var1 == 0)