Получение 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.
Ответ 6
Возможно, это:
http://sourceware.org/gdb/current/onlinedocs/gdb/Save-Breakpoints.html
Ответ 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?