OK, info break wyświetla punkty przerwania, ale nie w formacie, który dobrze by działał przy ich ponownym użyciu za pomocą --command, jak w tym pytaniu . Czy GDB ma metodę zrzucania ich do pliku, który można ponownie wprowadzić? Czasami podczas sesji debugowania konieczne jest ponowne uruchomienie GDB po utworzeniu zestawu punktów przerwania do testowania.
Plik .gdbinit ma ten sam problem co --command. Polecenie info break nie wyświetla poleceń, ale raczej tabelę do spożycia przez ludzi.
Aby rozwinąć, oto próbka z przerwy informacyjnej :
(gdb) przerwa informacyjna Num Type Disp Enb Address What 1 punkt przerwania zachowaj y 0x08048517 <foo :: bar (void) +7>
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
set breakpoint pending on
zgodnie z opisem w sposobie odpowiadania na Y w skrypcie gdb i gdb: jak ustawić punkty przerwania w przyszłych bibliotekach współdzielonych z flagąbreak g_log if log_level==G_LOG_LEVEL_CRITICAL
), co najmniej gdb 7.8.1 przestanie analizować dalsze polecenia. Jeśli masz dodatkowe polecenia, które powinny być wykonane dla tego punktu przerwania, umieść tęcommands
linię przedcondition
linią.Ta odpowiedź jest nieaktualna. GDB obsługuje teraz bezpośrednie zapisywanie. Zobacz tę odpowiedź .
Możesz użyć logowania:
(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
Plik breaks.txt zawiera teraz:
Num Type Disp Enb Address What 1 breakpoint keep y 0x08049329 <main+16>
Napisanie skryptu AWK, który przekształci go w format przydatny dla pliku
.gdbinit
lub--command
, jest łatwe. Lub możesz nawet sprawić, by skrypt emitował oddzielne komunikaty--eval-command
do wiersza poleceń GDB ...Dodanie tego małego makra do .gdbinit pomoże ci to zrobić:
# 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
źródło
save breakpoints
polecenia.Umieść swoje polecenia i punkty przerwania GDB w pliku .gdbinit w taki sam sposób, w jaki możesz je wpisać w
gdb>
monicie, a GDB automatycznie załaduje i uruchomi je podczas uruchamiania. To jest plik dla poszczególnych katalogów, więc możesz mieć różne pliki dla różnych projektów.źródło
Rozszerzenie do rozszerzenia Anon jest do odpowiedzi Johannes' :
.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
Dzięki
brestore
możesz następnie przywrócić punkty przerwania zapisane za pomocąbsave
.źródło
Rozszerzenie odpowiedzi od Johannesa : możesz automatycznie przeformatować dane wyjściowe
info break
do prawidłowego pliku poleceń 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
Następnie masz prawidłowy plik poleceń w
brestore.gdb
.To zadziałało, gdy aplikacja jest kompilowana z
-g
.Z powodzeniem przetestowałem go również z GDB v6.8 na Ubuntu 9.10 (Karmic Koala).
źródło
Być może to:
save breakpoints [filename]
źródło
Umieść poniższy kod w ~ / .gdbinit, aby zdefiniować bsave i brestore jako polecenia GDB do zapisywania i przywracania punktów przerwania.
define bsave save breakpoints ~/.breakpoints end define brestore source ~/.breakpoints end
źródło
Ten błąd / ostrzeżenie pojawia się również w GDB podczas próby włączenia logowania w trybie TUI . Jednak logowanie wydaje się działać w trybie „non-TUI”. Dlatego wychodzę z trybu TUI, gdy chcę coś zarejestrować. (Przełączaj się w tryb TUI za pomocąCtrl +X , Ctrl+A ).
Oto jak pracuję:
set logging on
- teraz nie powinien narzekać.źródło
Znalazłem następujący dodatek do poprzedniej odpowiedzi przydatny do zapisywania / ładowania punktów przerwania do określonego pliku.
Podobnie jak w poprzedniej odpowiedzi, dodaj następujący kod do pliku ~ / .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
źródło
Problem polega na tym, że ustawienie punktu przerwania jest zależne od kontekstu. A jeśli masz dwie statyczne funkcje o nazwie foo ?
Jeśli już debugujesz jeden z modułów, który definiuje foo, GDB przyjmie, że miałeś na myśli ten. Ale jeśli po prostu zrzucić „break foo” do pliku, a następnie odczytać ten plik przy rozruchu, to nie będzie jasne, które funkcja foo masz na myśli.
źródło
Jakieś inne pomysły? mam
po
set logging on
EDYTOWAĆ:
Wiem, że pytanie brzmi "jak zapisać listę punktów przerwania", jednak właśnie odkryłem, że z GDB możemy po prostu ustawić punkty przerwania "zapisane w pliku" przez
gdb> source breakpoints.txt
gdzie
breakpoints.txt
jest taki plik:break main.cpp:25 break engine.cpp:465 break wheel.cpp:57
źródło