Получение GDB для сохранения списка точек останова? - PullRequest
121 голосов
/ 01 февраля 2009

ОК, info break перечисляет точки останова, но не в формате, который бы хорошо подходил для повторного их использования с использованием --command , как в этом вопросе . Есть ли у GDB метод для их сброса в файл, приемлемый для ввода снова? Иногда в сеансе отладки необходимо перезапустить GDB после создания набора точек останова для тестирования.

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

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

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

Ответы [ 12 ]

190 голосов
/ 21 октября 2010

Начиная с 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> для восстановления сохраненных точек останова из файла.

26 голосов
/ 01 февраля 2009

Этот ответ устарел, 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, который преобразует его в формат, полезный для файла .gdbinit или --command, очень просто. Или вы можете даже заставить скрипт выдавать отдельные --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
11 голосов
/ 01 февраля 2009

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

9 голосов
/ 27 мая 2010

Расширение анона к ответу Йоханнеса:

.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.

6 голосов
/ 10 февраля 2010

Расширение до ответа от Йоханнеса: вы можете автоматически переформатировать вывод 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.

РЕДАКТИРОВАТЬ : успешно протестировано с GDB v6.8 на Ubuntu Karmic.

3 голосов
/ 27 августа 2013

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

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end
3 голосов
/ 19 июля 2010
1 голос
/ 04 октября 2016

Я знаю, что это старая тема, но она появилась в моем поиске в 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
1 голос
/ 09 августа 2010

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

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

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

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

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

0 голосов
/ 28 августа 2013

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

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

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

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

...