Może być lepszy sposób, ale ten rodzaj automatyzuje go.
Wprowadź następujące dane ~/backtrace
:
backtrace
quit
Umieść to w skrypcie wywoływanym seg_wrapper.sh
w katalogu na swojej ścieżce:
#!/bin/bash
ulimit -c unlimited
"$@"
if [[ $? -eq 139 ]]; then
gdb -q $1 core -x ~/backtrace
fi
ulimit
Komenda czyni go tak rdzeń jest sprzedawany po cenach dumpingowych. "$@"
są argumentami podanymi w skrypcie, więc byłby to twój program i jego argumenty. $?
posiada status wyjścia, 139 wydaje się być domyślnym statusem wyjścia dla mojego komputera dla błędu segfault.
Dla gdb
, -q
środki spokojny (nie wiadomość intro), i -x
mówi gdb
do wykonywania poleceń w pliku podanym do niego.
Stosowanie
Aby z niego skorzystać, wystarczy:
seg_wrapper.sh ./mycommand and its arguments
Aktualizacja
Możesz także napisać procedurę obsługi sygnału, która to robi, zobacz ten link .
Przepraszam, że przyszedłem tutaj 2 lata później ... natknąłem się na coś innego. Dodanie tego dla kompletności.
1) Chociaż uważam, że zaakceptowana odpowiedź jest świetna, wymaga gdb. Znana mi metoda wykorzystuje libSegFault.so.
Jeśli uruchomisz aplikację
Dostaniesz raport ze śledzeniem, załadowanymi bibliotekami itp
2) Dostępny
catchsegv
jest również skrypt otoki , który próbowałbyaddr2line
przetłumaczyć adresy na nazwę pliku + numer linii.Są to znacznie lżejsze rozwiązania niż pliki podstawowe lub gdb (dobre na przykład dla systemów osadzonych)
źródło
LD_PRELOAD=libSegFault.so
jest w porządku, jeśli znajduje się na ścieżce dl.Potrzebujesz GDB przyjaciela wszystkich
Po załadowaniu pliku podstawowego polecenie „backtrace” (może być skrócone do bt) daje aktualny stos wywołań. Jeśli uruchamiasz program z poziomu gdb, możesz ustawić dowolne punkty przerwania i sprawdzić zawartość pamięci itp.
źródło
catchsegv
Zostało to wspomniane w innej odpowiedzi (ale w żaden sposób nie dotyczyło). Jest to przydatne narzędzie dołączone do projektu glibc. Zapewni ślad zwrotny (i inne przydatne informacje debugowania) tylko wtedy, gdy program rzeczywiście nie działa poprawnie.
Dobry opis istnieje tutaj .
Możesz uwzględnić go we własnych skryptach według własnego uznania.
źródło
Ubuntu (jako projekt) używa do tego Apport. Możesz zobaczyć, jak to zrobili.
https://wiki.ubuntu.com/Apport
źródło
/proc/sys/kernel/core_pattern
Oto nieco zmodyfikowany wariant skryptu Kyle'a Brandta. Ulepszono go w następujący sposób:
Scenariusz:
źródło
-ex
zamiast tego.gdb ... -ex 'set pagination off' -ex backtrace -ex quit