Получение 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 110

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.

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

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end

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

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

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

  1. start GDB (в нормальном режиме режим)
  2. включить запись: set logging on - теперь он не должен жаловаться.
  3. переключение назад / вперед в режим TUI и делать GDB вещи
  4. 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?