Получение gdb для сохранения списка точек останова?
OK, info break перечисляет точки останова, но не в формате, который будет хорошо работать с повторным использованием их с помощью команды--, как в этом вопросе. Есть ли у gdb метод для сброса их в файл, приемлемый для ввода снова? Иногда в сеансе отладки необходимо перезапустить gdb после создания набора точек останова для тестирования.
Edit: the .файл gdbinit имеет ту же проблему, что и --command. Команда info break не содержит список команд, но скорее стол для потребления человеком.
чтобы уточнить, вот пример из info break:
(gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x08048517 <foo::bar(void)+7>
12 ответов:
начиная с gdb 7.2 теперь можно использовать команду сохранить точки останова.
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.
использовать
source <filename>
для восстановления сохраненных точек останова из файла.
этот ответ устарел, 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
файл ломается.txt, который теперь содержит:
Num Type Disp Enb Address What 1 breakpoint keep y 0x08049329 <main+16>
написание сценария awk, который преобразует его в формат, полезный для
.gdbinit
или легко. Или вы даже можете сделать скрипт испускать отдельный--eval-command
' s в командной строке 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
Поместите свои команды gdb и точки останова в a .gdbinit файл так же, как вы могли бы ввести их в приглашении gdb>, и 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 \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
.
расширение к ответу от 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 \n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb end document bsave store actual breakpoints end
после этого у вас есть действительный commandfile в
brestore.gdb
это работало для меня, когда приложение компилируется с
-g
.EDIT: успешно протестирован с gdb v6.8 на Ubuntu Karmic.
пожалуй, вот это:
http://sourceware.org/gdb/current/onlinedocs/gdb/Save-Breakpoints.html
поместите следующее в~/.файл gdbinit для определения bsave и brestore как команды gdb для сохранения и восстановления точек останова.
define bsave save breakpoints ~/.breakpoints end define brestore source ~/.breakpoints end
предупреждение: текущий выходной протокол делает не поддерживает перенаправление
Я также получаю эту ошибку / предупреждение в GDB при попытке включить ведение журнала в режиме TUI, однако ведение журнала, похоже, работает в режиме "не-TUI". Поэтому я оставляю режим TUI всякий раз, когда хочу что-то записать. (Переключение назад и вперед в режим TUI с CTRL-X,CTRL-A).
вот как я работаю:
- start GDB (в нормальном режиме режим)
- включить запись:
set logging on
- теперь он не должен жаловаться.- переключение назад / вперед в режим TUI и делать GDB вещи
- whenver я хочу войти что - то (например, огромный дамп backtrace) - переключиться в нормальный режим
надеюсь, это поможет, /M:o)
Я знаю, что это старый поток, но он появился в моем поиске google, чтобы помочь мне сделать это. Я новичок в gdb и нашел следующее дополнение к ответу выше полезным для сохранения/загрузки точек останова в определенный файл.
- сохранить точки останова: bsave {filename}
- загрузить точки останова: bload {filename}
Как указано выше, добавьте следующий код в файл ~/.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
проблема в том, что установка точки останова является контекстно-сенсативной. Что если у вас есть две статические функции с именем foo? Если вы не уже отладка одного из модулей, который определяет foo, затем gdb предположит, что вы имели в виду именно это. Но если вы просто свалите "break foo" в файл, а затем прочитать этот файл при запуске, не будет ясно, какую функцию foo вы имеете в виду.
есть еще идеи? У меня есть
warning: Current output protocol does not support redirection
после
set logging on
EDIT:
Я знаю, что вопрос "Как сохранить список точек останова", однако я просто обнаруживаю, что с gdb мы можем просто установить" сохраненные в файле " точки останова по
gdb> source breakpoints.txt
где точки останова.txt-это файл такой:
break main.cpp:25 break engine.cpp:465 break wheel.cpp:57
проблема в том, что установка точки останова контексте чувствителен. А что если у вас есть две статические функции с именем foo? Если вы уже отлаживаете один из модулей, который определяет foo, тогда gdb предположит, что вы имели в виду вот этот. Но если вы просто сбросите "break foo" в файл, а затем прочитаете этот файл при запуске, он не будет ясно, какая функция foo вы означать.
у меня нет точек мод, чтобы ответить, но то, что вы делаете, это сделать ваши точки останова явный, указав исходный файл и номер строки. Если foo () указан в обоих foo.c: 42, и в баре.c: 1337
break foo.c:42 break bar.c:1337
кроме того, укажите точку останова в источнике, которая срабатывает только в том случае, если программа выполняется под gdb. Смотрите как определить, если текущий процесс выполняется GDB?