Как установить постоянные и условные точки наблюдения для переменных локальной области видимости? - PullRequest
37 голосов
/ 30 августа 2009
  1. Если я установлю точку наблюдения для переменной, локальной для текущей области, она будет автоматически удалена при выходе из области. Есть ли способ установить его один раз и поддерживать его автоматическим при каждом входе в ту же область?

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

Ответы [ 4 ]

32 голосов
/ 30 августа 2009

Я согласен с Дейвом, что условная точка останова - путь.

Однако, чтобы сделать то, что вы просили, вы можете использовать команду 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
14 голосов
/ 26 декабря 2010

Вы можете установить условия на точках наблюдения так же, как вы делаете с точками останова. Это в документации , но по общему признанию это едва привлекает внимание к себе.

Так что watch my_var if my_var > 3 работает просто отлично, как и команда condition.

Чтобы воссоздать точку наблюдения, если наблюдаемая переменная выходит из области видимости, пусть gdb сделает это автоматически, используя точку останова в начале функции, как описал Зан.

8 голосов
/ 01 сентября 2011

Вы можете установить точку наблюдения, которая не выходит за рамки, установив для нее адрес памяти.

(gdb) p &var1
$1 = (int *) 0x41523c0
(gdb) watch *(int *)0x41523c0
Hardware watchpoint 1: *(int *)0x41523c0

Это также работает для других типов данных и указателей.

4 голосов
/ 30 августа 2009
  1. Я не уверен, какой язык мы используем, поэтому точный ответ будет отличаться, но вы могли бы изменить переменную на статическую, глобальную или динамическую (и не освобождать ее, когда функция возвращается?). Таким образом, его необработанный адрес не изменится, и GDB сможет установить на нем точку останова.

  2. Вместо просмотра значения, где оно равно определенному значению; Вы должны установить условную точку останова на линии, где вы хотите проверить значение var1. Это должно эффективно иметь тот же эффект

например.

(gdb) break main.c:123 if (var1 == 0)
...