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.