Получение gdb для сохранения списка точек останова?

В порядке, информация разбивает списки точек останова, но не в формате, который будет хорошо работать с повторным использованием их с помощью команды как в этом вопросе. У gdb есть метод для сброса их в файл, приемлемый для ввода снова? Иногда в сеансе отладки необходимо перезапустить gdb после создания набора точек останова для тестирования.

Изменить:. Файл .gdbinit имеет ту же проблему, что и команда. Команда info break не отображает команды, а представляет собой таблицу для потребления человеком.

Чтобы разработать, вот пример из информационного разлома:

(gdb) info break
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048517 <foo::bar(void)+7>

Ответ 1

Как и в gdb 7.2, теперь вы можете использовать команду save breakpoints.

save breakpoints <filename>
  Save all current breakpoint definitions to a file suitable for use
  in a later debugging session.  To read the saved breakpoint
  definitions, use the `source' command.

Ответ 2

Этот ответ устарел, gdb теперь поддерживает сохранение напрямую. См. этот ответ.

Вы можете использовать ведение журнала:

(gdb) b main
Breakpoint 1 at 0x8049329
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) set logging file breaks.txt
(gdb) set logging on
Copying output to breaks.txt.
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) q

Файл breaks.txt теперь содержит:

Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>

Запись awk script, которая преобразует это в формат, полезный для файла .gdbinit или --command, проста. Или вы даже можете сделать script выделять отдельный --eval-command в командную строку gdb...

Добавление этого небольшого макроса в .gdbinit поможет вам:

# call with dump_breaks file.txt
define dump_breaks
    set logging file $arg0
    set logging redirect on
    set logging on
    info breakpoints
    set logging off
    set logging redirect off
end

Ответ 3

Поместите свои команды gdb и точки останова в файл .gdbinit так же, как вы можете ввести их в приглашении gdb > , и gdb будет автоматически загружать и запускать их при запуске. Это файл для каждого каталога, поэтому вы можете иметь разные файлы для разных проектов.

Ответ 4

Расширение расширения anon для ответа Йоханнеса:

.gdbinit:

define bsave
    shell rm -f brestore.txt
    set logging file brestore.txt
    set logging on
    info break
    set logging off
    # reformat on-the-fly to a valid gdb command file
    shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end 
document bsave
  store actual breakpoints
end

define brestore
  source brestore.gdb
end
document brestore
  restore breakpoints saved by bsave
end

С помощью brestore вы можете восстановить точки останова, сохраненные с помощью bsave.

Ответ 5

Расширение ответа от Johannes: вы можете автоматически переформатировать вывод info break в действительный файл команды gdb:

.gdbinit:

define bsave
   shell rm -f brestore.txt
   set logging file brestore.txt
   set logging on
   info break
   set logging off
   # reformat on-the-fly to a valid gdb command file
   shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end 
document bsave
  store actual breakpoints
end

После этого у вас есть действительный файл команды в brestore.gdb

Это сработало для меня, когда приложение скомпилировано с помощью -g.

EDIT: успешно протестирован с помощью gdb v6.8 на Ubuntu Karmic.

Ответ 7

поместите следующее в ~/.gdbinit, чтобы определить bsave и brestore как команды gdb для сохранения и восстановления точек останова.

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end

Ответ 8

предупреждение: протокол токового выхода не поддерживает перенаправление

Я также получаю эту ошибку/предупреждение в GDB при попытке включить ведение журнала в режиме TUI, однако запись, похоже, работает в режиме "не-TUI". Поэтому я оставляю режим TUI всякий раз, когда я хочу зарегистрироваться. (Переключитесь в режим TUI с помощью CTRL-X, CTRL-A).

Вот как я работаю:

  • запустить GDB (в обычном режиме)
  • включить ведение журнала: set logging on - теперь он не должен жаловаться.
  • переключиться обратно в режим TUI и сделать материал GDB
  • когда я хочу что-то записывать (например, огромный дамп backtrace) - переключиться в обычный режим

Надеюсь, это поможет, /М: о)

Ответ 9

Я знаю, что это старый поток, но он появился в моем поиске Google, чтобы помочь мне сделать это. Я новичок в gdb и нашел следующее дополнение к вышеприведенному ответу, полезному для сохранения/загрузки точек останова в конкретном файле.

  • Сохранить точки останова: bsave {filename}
  • Загружать точки останова: bload {имя_файла}

Как указано выше, добавьте следующий код в файл ~/.gdbinit

#Save breakpoints to a file
define bsave
    if $argc != 1
        help bsave
    else
    save breakpoints $arg0
    end
end
document bsave
Saves all current defined breakpoints to the defined file in the PWD
Usage: bsave <filename>
end

#Loads breakpoints from a file
define bload
    if $argc != 1
        help bload
    else
        source $arg0
    end
end
document bload
Loads all breakpoints from the defined file in the PWD
Usage: bload <filename>
end

Ответ 10

Проблема заключается в том, что установка точки останова является контекстно-зависимой. Что делать, если у вас есть две статические функции с именем foo? Если ты уже отлаживая один из модулей, определяющих foo, тогда gdb предположит, что вы имели в виду это. Но если вы просто сбросите "break foo" в файл, а затем прочитать этот файл при запуске, не будет ясно, какая функция foo вы имеете в виду.

Ответ 11

Любые другие идеи? У меня есть

warning: Current output protocol does not support redirection

после

set logging on

EDIT:

Я знаю, что вопрос заключается в "сохранении списка точек останова", однако я просто обнаруживаю, что с помощью gdb мы можем просто установить "сохраненные в файле" точки останова на

gdb> source breakpoints.txt

где breakpoints.txt имеет следующий вид:

break main.cpp:25
break engine.cpp:465
break wheel.cpp:57

Ответ 12

Проблема заключается в том, что установка точки останова является контекстно-зависимой. Что если у вас есть две статические функции с именем foo? Если вы уже отлаживаете один из модулей, определяющий foo, то gdb предположит, что вы имели в виду вон тот. Но если вы просто сбрасываете "break foo" в файл, а затем читаете этот файл при запуске, не будет ясно, какая функция foo вы имею в виду.

У меня нет модов для ответа, но вы делаете это, чтобы сделать свои контрольные точки явными, указав исходный файл и номер строки. Если foo() указан как в foo.c: 42, так и в bar.c: 1337

break foo.c:42
break bar.c:1337

В качестве альтернативы укажите контрольную точку в источнике, которая запускается только при запуске программы под gdb. См. Как определить, выполняется ли текущий процесс GDB?