text addr: 0x4007d4
data addr: 0x7ffec6739220
mmap addr: 0x1612010
Segmentation fault (core dumped)
GDB weist uns auf die genaue Linie hin, in der der Segfault aufgetreten ist, was die meisten Benutzer beim Debuggen wünschen:
gdb -q -nh main.out core
dann:
Reading symbols from main.out...done.
[New LWP 27479]
Core was generated by `./main.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000000000400635 in myfunc (i=1) at main.c:7
7 *(int*)(NULL) = i;
(gdb) bt
#0 0x0000000000400635 in myfunc (i=1) at main.c:7
#1 0x000000000040072b in main (argc=1, argv=0x7ffec6739328) at main.c:28
was uns direkt auf die Buggylinie hinweist 7.
Binutils-Analyse
Zuerst:
file core
sagt uns, dass die coreDatei tatsächlich eine ELF-Datei ist:
core: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './main.out'
Deshalb können wir es mit üblichen binutils-Werkzeugen direkter untersuchen.
Ein kurzer Blick auf den ELF-Standard zeigt, dass tatsächlich ein ELF-Typ dafür vorgesehen ist:
Elf32_Ehd.e_type == ET_CORE
Weitere Formatinformationen finden Sie unter:
man 5 core
Dann:
readelf -Wa core
gibt einige Hinweise zur Dateistruktur. Der Speicher scheint in normalen Programmköpfen enthalten zu sein:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
NOTE 0x000468 0x0000000000000000 0x0000000000000000 0x000b9c 0x000000 0
LOAD 0x002000 0x0000000000400000 0x0000000000000000 0x001000 0x001000 R E 0x1000
LOAD 0x003000 0x0000000000600000 0x0000000000000000 0x001000 0x001000 R 0x1000
LOAD 0x004000 0x0000000000601000 0x0000000000000000 0x001000 0x001000 RW 0x1000
In einem Notizbereich sind weitere Metadaten vorhanden. Bemerkenswerterweise muss der PC dort sein (TODO-Bestätigung):
gdb ist der GNU-Debugger, mit dem die Kerndatei untersucht werden kann. BTW bt(backtrace) ist ein nützlicher gdb-Befehl, um den Programmaufrufstapel zu untersuchen.
Antworten:
objdump
+gdb
minimal lauffähiges BeispielTLDR:
objdump -s core
Speicher zu entleerenGDB, um eine fehlerhafte Zeile zu finden, siehe oben unter: Wie zeige ich Kerndateien für Debugging-Zwecke in Linux an?
Nun zum vollständigen Testaufbau:
Haupt c
Kompilieren und ausführen, um den Kern zu generieren:
Ausgabe:
GDB weist uns auf die genaue Linie hin, in der der Segfault aufgetreten ist, was die meisten Benutzer beim Debuggen wünschen:
dann:
was uns direkt auf die Buggylinie hinweist 7.
Binutils-Analyse
Zuerst:
sagt uns, dass die
core
Datei tatsächlich eine ELF-Datei ist:Deshalb können wir es mit üblichen binutils-Werkzeugen direkter untersuchen.
Ein kurzer Blick auf den ELF-Standard zeigt, dass tatsächlich ein ELF-Typ dafür vorgesehen ist:
Weitere Formatinformationen finden Sie unter:
Dann:
gibt einige Hinweise zur Dateistruktur. Der Speicher scheint in normalen Programmköpfen enthalten zu sein:
In einem Notizbereich sind weitere Metadaten vorhanden. Bemerkenswerterweise muss der PC dort sein (TODO-Bestätigung):
objdump
kann leicht den gesamten Speicher entleeren mit:was beinhaltet:
was genau mit dem Standardwert in unserem Lauf übereinstimmt.
Getestet in Ubuntu 16.04 amd64, GCC 6.4.0, binutils 2.26.1.
quelle
gdb ist der GNU-Debugger, mit dem die Kerndatei untersucht werden kann. BTW
bt
(backtrace) ist ein nützlicher gdb-Befehl, um den Programmaufrufstapel zu untersuchen.quelle
Wenn Sie das Programm kompilieren, verwenden Sie die Option -g
gcc -g program.c
Wenn eine Kerndatei erstellt wird, können Sie mit GDB debuggen, ohne dass die Debug-Flags der Option -g aktiviert werden.
quelle
Wenn Sie das Befehlszeilentool bevorzugen, können Sie gdb verwenden :
oder
Wenn dir gui gefällt, dann installiere ddd und öffne von dort aus das zu debuggende Programm und die Kerndatei.
quelle
quelle