Wydaje mi się, że mam pewien błąd wielowątkowości w moim kodzie, który powoduje awarię co 30 uruchomień pakietu testowego. Zestaw testów nie jest interaktywny. Chcę uruchomić mój pakiet testowy w gdb i normalnie wyjść z gdb, jeśli program wyjdzie normalnie, lub przerwać (i wyświetlić monit o usunięcie błędu), jeśli ulegnie awarii. W ten sposób mogę pozwolić zestawowi testowemu działać wielokrotnie, chodzić po filiżankę kawy, wracać i być przedstawiany z miłym monitorem debugowania. Jak mogę to zrobić z gdb?Jak uzyskać wyjście gdb, jeśli program się powiedzie, przerwać w razie awarii programu?
Odpowiedz
Jest trochę hacky, ale można zrobić:
gdb --eval-command=run --eval-command=quit --args ./a.out
przypadku. out kończy się normalnie, to po prostu wyrzuci cię z GDB. Ale jeśli awarii, program nadal będzie aktywny, więc GDB zazwyczaj zapyta, czy na pewno chcesz zrezygnować z aktywnym gorszy:
Program received signal SIGABRT, Aborted.
0x00007ffff72dad05 in raise (sig=...) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
in ../nptl/sysdeps/unix/sysv/linux/raise.c
A debugging session is active.
Inferior 1 [process 15126] will be killed.
Quit anyway? (y or n)
Tak jak mówiłem, nie całkiem, ale to działa, dopóki nie zrezygnowałem z podpowiedzi, aby wyjść z aktywnym procesem. Prawdopodobnie istnieje również sposób użycia polecenia gdb: quit
: pobiera on argument numeryczny, który jest kodem wyjścia dla sesji debugowania. Być może więc możesz użyć --eval-command = "quit stuff", gdzie coś jest pewnym wyrażeniem GDB, które odzwierciedla, czy gorszy działa, czy nie.
Zrób rdzeń podczas awarii. Jeśli korzystasz z systemu Linux, przeczytaj stronę podręcznika man man core
, a także wbudowaną wersję ulimit
, jeśli używasz bash
.
W ten sposób, gdy się zawiesi znajdziesz miłą corefile że można karmić do gdb:
$ ulimit -c unlimited
$ ... run program ..., gopher coffee (or reddit ;)
$ gdb progname corefile
Nie dostajesz pliku core, gdy się zawiesza? Uruchom gdb jak ten "gdb -c core" i wykonaj traceback stosu.
Prawdopodobnie będziesz chciał używać Valgrind.
Najprostszym sposobem jest użycie Python API oferowane przez gdb
:
def exit_handler(event):
gdb.execute("quit")
gdb.events.exited.connect(exit_handler)
Można nawet zrobić to z jednej linii:
(gdb) gdb.events.exited.connect(lambda x : gdb.execute("quit")
Można również zbadać kod zwrotny, aby zapewnić, że to "normalny" kod, którego oczekiwałeś z event.exit_code
.
Można go używać w połączeniu z --eval-command
lub --command
jak wspomniano przez @acm zarejestrować obsługi zdarzeń z wiersza polecenia lub z pliku .gdbinit
.
Można również wywołać ślad po awarii programu i niech zjazd gdb z kodem powrotu procesu potomnego:
gdb -return-child-result -ex run -ex "thread apply all bt" -ex "quit" --args myProgram -myProgramArg
To nie jest najlepsza odpowiedź na to pytanie, ale pomogło mi to w odpowiedzi na moje pytanie! Dziękuję, nie wiedziałeś o "powrocie-dziecko-wynik" –
Utwórz plik o nazwie .gdbinit
i będzie on używany podczas gdb jest uruchomiona.
run
quit
Run bez opcji:
gdb --args prog arg1...
Mówisz gdb uruchomić i zamknąć, ale powinien zatrzymać przetwarzania pliku w przypadku wystąpienia błędu.
Jeśli umieścisz następujące linie w pliku ~/.gdbinit
, gdb
wyjdzie gdy program kończy pracę z kodem stanu 0.
python
def exit_handler (event):
if event .exit_code == 0:
gdb .execute ("quit")
gdb .events .exited .connect (exit_handler)
end
Powyższe jest udoskonalenie odpowiedź Kevina.
- 1. Solaris GDB: jak przerwać wykonywanie?
- 2. Program pakujący Capistrano: instalacja nie powiedzie się
- 3. Jak przerwać uruchomiony program w MATLAB?
- 4. Jak mogę przekonać program Visual Studio do wysyłania sygnałów dźwiękowych, jeśli kompilacja się powiedzie?
- 5. Co powinienem zrobić, jeśli metoda budowniczego łosia nie powiedzie się?
- 6. Jak uzyskać wyjście z programu Exec w programie Inno Setup?
- 7. Co się stanie, jeśli program sterownika się zawiesi?
- 8. Uruchom debugger ruby, jeśli test rspec nie powiedzie się
- 9. Projekt MSBuild nie zostanie załadowany, jeśli import się nie powiedzie?
- 10. uzyskać adres zwrotny GDB
- 11. Jak interpretować wyjście programu ldd?
- 12. Zachowanie zmiennych statycznych Androida w razie awarii aplikacji
- 13. Pomiń unitest, jeśli jakiś warunek w SetUpClass nie powiedzie się
- 14. gdb: Program zakończony kodem 030000000375
- 15. Dlaczego WriteFile ulega awarii podczas zapisu na standardowe wyjście?
- 16. jeśli, w przeciwnym razie, jeśli i koniec Lua
- 17. gdb zatrzymuje się w pliku polecenia, jeśli wystąpił błąd. Jak kontynuować pomimo błędu?
- 18. Pokaż div, jeśli sprawdzanie poprawności nie powiedzie się
- 19. Jak automatycznie uruchomić ponownie program, jeśli ulegnie awarii w systemie Windows?
- 20. clang nie powiedzie się zastępując instrukcję jeśli zawiera makro
- 21. Funkcja MySQL do wstawiania rekordów, jeśli aktualizacja się nie powiedzie?
- 22. Łańcuch selera pęka, jeśli jedno z zadań się nie powiedzie
- 23. Jak wymusić ansibli, aby ponowić zadanie "apt", jeśli się nie powiedzie?
- 24. Zdalne debugowanie czystego programu C z GDB
- 25. Mocha.js: uruchamianie haka "po", nawet jeśli test nie powiedzie się
- 26. PowerShell: jak uzyskać, jeśli konstruuje się poprawnie?
- 27. Program Excel 2013 ulega awarii z powodu fragmentacji pamięci.
- 28. Napisz hex w GDB
- 29. Jak wyjście tego programu jest takie?
- 30. Jak mogę uzyskać stan programu?
Jestem na OS X Snow Leopard, a gdb tutaj nie obsługuje --eval-command, ale i tak wybiorę twoją odpowiedź. – Hongli
try gdb --command = <(echo run) --command = <(echo quit) – acm
Myślę, że to nie zadziała, jeśli masz 'set confirm off' w twoim pliku' .gdbinit', GDB będzie zawsze return ... – Kevin