Подтвердить что ты не робот

Как установить постоянные и условные точки наблюдения для локально ограниченных переменных?

  • Если я устанавливаю точку наблюдения за переменной, локальной для текущей области, она будет автоматически удалена при выходе из области. Есть ли способ установить его один раз и сохранить его в автоматическом режиме при входе в ту же область?

  • Есть ли способ установить условную точку наблюдения, например watch var1 if var1==0? В моем случае условие не работает. gdb останавливается всякий раз, когда значение var1 изменяется, а не до var1 == 0 - true. Мой gdb - GNU gdb 6.8-debian.

4b9b3361

Ответ 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)