GNU/Linux >> Znalost Linux >  >> Linux

Nejjednodušší způsob, jak najít chybu segmentace

+1 pro Tiborovu odpověď.

U větších programů nebo pokud používáte další knihovny, může být také užitečné podívat se na backtrace s gdb:ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_42.html


Použijte debugger, například gdb nebo pokud to neplatí, strace nástroj k získání lepšího přehledu o tom, kde k segfaultu dochází.

Pokud použijete gcc , ujistěte se, že kompilujete s -g přepnout, aby zahrnoval informace o ladění. Poté gdb vám ukáže přesné umístění ve zdrojovém kódu, kde segfaults.

Například, pokud máme tento zjevně segfaultový program:

new.c

#include <stdio.h>

int main()
{
        int *i = 0x478734;
        printf("%d", *i);
}

Zkompilujeme jej pomocí gcc -g new.c -o new a poté spusťte gdb relace s gdb new :

Vydáváme run příkaz v interaktivní relaci a ostatní je jasné:

(gdb) run
Starting program: /home/Tibor/so/new
[New Thread 9596.0x16a0]
[New Thread 9596.0x1de4]

Program received signal SIGSEGV, Segmentation fault.
0x0040118a in main () at new.c:6
6               printf("%d", *i);
(gdb)

Jak zdůraznili DasMoeh a netcoder, když dojde k chybě segfault, můžete použít backtrace příkaz v interaktivní relaci pro tisk zásobníku volání. To může pomoci k dalšímu určení místa segfault.


Nejjednodušší způsob je použít valgrind . Zjistí místo, kde se vyskytuje neplatný přístup (a další problémy, které nezpůsobily pád, ale byly stále neplatné). Samozřejmě skutečný problém může být někde jinde v kódu (např.:neplatný ukazatel), takže dalším krokem je zkontrolovat zdroj, a pokud je to stále zmatené, použijte debugger.


Linux
  1. RDP Linux to Windows:Nejjednodušší cesta 2019!

  2. Existuje způsob, jak změnit proměnné prostředí jiného procesu v Unixu?

  3. Proč fclose(NULL) glibc způsobí chybu segmentace místo vracení chyby?

  1. Chyba segmentace při vytvoření Qt QApplication s new

  2. Jaký je nejsnazší způsob, jak čichat data o provozu TCP v Linuxu?

  3. Jaký je nejjednodušší způsob, jak vytvořit virtuální balíček v debianu?

  1. Jak nainstalovat Zoom na Ubuntu (nejjednodušší způsob)

  2. V Crontab obecný způsob, jak zadat každých n minut, kde n > 60

  3. Upozornění na chyby segmentace webového serveru Linux / Apache