Можно ли зарегистрировать команды в точку останова из внешнего файла в GDB?

#gdb

#gdb

Вопрос:

GDB позволяет регистрировать набор команд в определенную точку останова с помощью commands NUM синтаксиса. Мне нужно зарегистрировать набор команд для определенной точки останова через внешний файл, используя синтаксис, подобный следующему:

 commands ./main.c:18
silent
print buffer[0]
cont
end

commands ./io.c:29
silent
printf "Hello world %in", myvar1
cont
end
  

commands path/to/file:XX Синтаксис составлен мной. Поскольку синтаксис NUM in commands NUM требует точного идентификационного номера среды выполнения точки останова (присвоенного GDB), я не могу использовать детерминированный синтаксис для этой цели.

В настоящее время я регистрирую точки останова через текстовый файл с таким содержимым:

 break ./main.c:18
break ./io.c:29
  

а затем выдавать source breakpoints.txt команду внутри GDB. Кажется, что нет способа зарегистрироваться commands одновременно при регистрации точки останова:

(gdb) помогите break Установить точку останова в указанной строке или функции. break [PROBE_MODIFIER] [МЕСТОПОЛОЖЕНИЕ] [поток THREADNUM] [УСЛОВИЕ if] PROBE_MODIFIER должен присутствовать, если команда должна быть помещена в точку пробника. Допустимыми значениями являются -probe' (for a generic, automatically guessed probe type), -probe-stap’ (для зонда SystemTap) или `-probe-dtrace’ (для зонда DTrace). МЕСТОПОЛОЖЕНИЕ может быть номером строки, именем функции или «*» и адресом. Если указан номер строки, выполните разрыв в начале кода для этой строки. Если указана функция, выполните прерывание при запуске кода для этой функции. Если указан адрес, выполните прерывание по этому точному адресу. При отсутствии МЕСТОПОЛОЖЕНИЯ используется текущий адрес выполнения выбранного стекового фрейма. Это полезно для прерывания при возврате к фрейму стека.

THREADNUM — это число из «информационных потоков». УСЛОВИЕ — это логическое выражение.

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

Вопрос

  1. Есть ли какой-нибудь простой способ установить некоторые предопределенные команды для заданной точки останова из файла?
  2. Если нет, есть ли какой-либо эквивалентный способ передачи (gdb) info breakpoints выходных данных в файл или программу, pipe недоступный в GDB (версия 5.3)? В настоящее время я пытаюсь найти обходной путь, используя logging для этой цели функцию:
     set logging file /tmp/breakpoints
    set logging on
    info breakpoints 
    set logging off
  

Ответ №1:

Есть ли какой-нибудь простой способ установить некоторые предопределенные команды для заданной точки останова из файла?

Да: если вы используете commands without NUM , команды будут применяться к последней установленной точке останова. Итак, вы хотите что-то вроде:

 break main.c:18
commands
silent
print buffer[0]
cont
end