GNU/Linux >> Znalost Linux >  >> Linux

Můžete získat nějaký program v Linuxu, který by vytiskl trasování zásobníku, pokud selže?

Ř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


Linux
  1. Můžete spustit Xcode v Linuxu?

  2. Jak získat ID vlákna pthread v programu linux c?

  3. Můžete vyvíjet aplikace pro Linux pomocí Xamarin?

  1. Proces spouštění systému Linux:Průvodce, jak začít

  2. Linux – Jak získat jakoukoli verzi Linuxu, abyste viděli Macbook Pro Ssd 2018?

  3. Jak mohu získat více informací o zobrazení otevřených kanálů v /proc v Linuxu?

  1. Jak získat trasování zásobníku pro C++ pomocí gcc s informacemi o čísle řádku?

  2. Můžete přímo zobrazit škodlivý soubor PDF v systému Linux?

  3. Co může způsobit signál 11?