Řešení 1:
Možná existuje lepší způsob, ale tento druh to automatizuje.
Vložte následující do ~/backtrace
:
backtrace
quit
Vložte to do skriptu s názvem seg_wrapper.sh
v adresáři ve vaší cestě:
#!/bin/bash
ulimit -c unlimited
"[email protected]"
if [[ $? -eq 139 ]]; then
gdb -q $1 core -x ~/backtrace
fi
ulimit
příkaz to udělá tak, že jádro je vyhozeno. "[email protected]"
jsou argumenty dané skriptu, takže by to byl váš program a jeho argumenty. $?
má stav ukončení, zdá se, že 139 je výchozí stav ukončení pro můj počítač pro chybu segfault.
Pro gdb
, -q
znamená tichý (žádná úvodní zpráva) a -x
říká gdb
spouštět příkazy v souboru, který je mu přidělen.
Použití
Chcete-li jej tedy použít, stačí:
seg_wrapper.sh ./mycommand and its arguments
Aktualizovat
Můžete také napsat obslužný program signálu, který to udělá, viz tento odkaz.
Řešení 2:
Omlouvám se, že jsem sem přišel o 2 roky později... narazil jsem, když jsem hledal něco jiného. Pro úplnost přidáváme toto.
1) I když si myslím, že přijatá odpověď je skvělá, vyžaduje gdb. Metoda, kterou znám, používá libSegFault.so.
Pokud aplikaci spustíte pomocí
LD_PRELOAD=...cesta-k.../libSegFault.so moje aplikace
Získali byste zprávu s backtrace, načtenými knihovnami atd
2) Obalový skript catchsegv
je také k dispozici, která by se pokusila použít addr2line
pro překlad adres na název souboru + číslo řádku.
Jedná se o mnohem lehčí řešení než základní soubory nebo gdb (dobré například pro vestavěné systémy)
Řešení 3:
Potřebujete přítele všech GDB
gdb <program> [core file]
Jakmile načtete svůj soubor jádra, příkaz 'backtrace' (lze zkrátit na bt) vám poskytne aktuální zásobník volání. Pokud spouštíte svůj program zevnitř gdb, můžete nastavit libovolné body přerušení a prozkoumat obsah paměti atd.
Řešení 4:
catchsegv
Bylo to zmíněno v jiné odpovědi (ale v žádném případě se na ni nezaměřovalo). Je to šikovný nástroj dodávaný s projektem glibc. Poskytne zpětné sledování (a další užitečné informace o ladění) pouze pokud program skutečně segfault.
Dobrý zápis existuje zde.
Můžete jej zahrnout do svých vlastních skriptů, jak uznáte za vhodné.
Řešení 5:
Ubuntu (jako projekt) k tomu používá Apport. Můžete se podívat, jak to udělali.
https://wiki.ubuntu.com/Apport