2016-06-04 5 views
0

Ich bin Neuling auf Cygwin (und Linux).Wie Debuggen mit "*. Stopfdump" -Datei in Cygwin

Als ich versuchte, meine ausführbare Datei basierend auf C-Sprache auszuführen, trat ein Segmentierungsfehler auf und ich nahm die Stackdump-Datei. aber ich weiß nicht, wie man es zum Debuggen benutzt.

Ich habe nach dem Weg gesucht, wie mit Stackdump-Datei debuggen, aber ich konnte es nicht finden. Alle kleinen Tipps sind sehr nützlich für mich. Danke für das Lesen meines schlechten Englisch (Englisch ist nicht meine 1. Sprache).

Antwort

1

Zuerst: Sie müssen Ihr Programm kompilieren, um gcc die Flagge -ggdb zu übergeben, sonst ist die Stackdump-Info nutzlos. Ich schlage vor, auch das -O0 Flag zu übergeben, damit das Debuggen mit gdb einfacher wird, da der Code nicht optimiert wird.

Zweite: die STACKDUMP liefern die Adressen, die in dem Stapel, in diesem Beispiel auf 32-Bit haben wir zwei Adressen:

$ cat t-invmod.exe.stackdump 
Stack trace: 
Frame  Function Args 
0028C878 61032BCB (000000F4, 0000EA60, 000000A4, 0028C8D8) 
0028C998 610E7A7A (00000001, 0028CA3F, 00000001, 611A2C80) 

Die Adresse kann von Ihren Programmen oder von geladenen Shared Libs kommen.

Um die Adresse in Code-Position zu konvertieren, verwenden Sie addr2line. Beispiel:

$ addr2line.exe -a 610E7A7A -a 61032BCB -e /usr/bin/cygwin1.dll 
0x610e7a7a 
/usr/src/debug/cygwin-2.5.1-1/winsup/cygwin/cygerrno.h:36 
0x61032bcb 
/usr/src/debug/cygwin-2.5.1-1/winsup/cygwin/cygerrno.h:35 

In diesem Fall wird die hohe Adresse sagte mir, dass der Absturz in einem gemeinsamen lib war und nicht im Programm. Sie können ldd zu identifizieren verwenden, was die Adressen gehören:

$ ldd t-invmod.exe 
     ntdll.dll => /cygdrive/c/Windows/SysWOW64/ntdll.dll (0x776d0000) 
     kernel32.dll => /cygdrive/c/Windows/syswow64/kernel32.dll (0x75500000) 
     KERNELBASE.dll => /cygdrive/c/Windows/syswow64/KERNELBASE.dll (0x75a10000) 
     SYSFER.DLL => /cygdrive/c/Windows/SysWOW64/SYSFER.DLL (0x73480000) 
     cygflint.dll => /usr/bin/cygflint.dll (0x5f390000) 
     cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000) 
     cyggmp-10.dll => /usr/bin/cyggmp-10.dll (0x589e0000) 
     cygmpfr-4.dll => /usr/bin/cygmpfr-4.dll (0x51080000) 
     cyggcc_s-1.dll => /usr/bin/cyggcc_s-1.dll (0x5ece0000) 
     cygntl-9.dll => /usr/bin/cygntl-9.dll (0x50270000) 
     cygstdc++-6.dll => /usr/bin/cygstdc++-6.dll (0x4b340000) 

Wenn die Adresse niedriger als DLL ist, es zu Ihrem Programm gehört; Wenn es zur Shared-Lib gehört, müssen Sie das relative * debuginfo-Paket zur Wiederherstellung der Standortinformationen installieren.