Wie diagnostiziere ich ein Problem mithilfe eines Core Dumps?

Wie diagnostiziere ich ein Problem mithilfe eines Core Dumps?

Ich habe den folgenden Core Dump:

pth_signal.pthread_kill(??, ??) at 0xd0124734
pth_signal._p_raise(??) at 0xd01241a4
raise.raise(??) at 0xd038acd0
abort.abort() at 0xd03eeb78
_ZN10__cxxabiv111__terminateEPFvvE(handler = ??), line 47 in "eh_terminate.cc"
_ZSt9terminatev(), line 57 in "eh_terminate.cc"
__cxa_throw(obj = ??, tinfo = ??, dest = ??), line 77 in "eh_throw.cc"
unnamed block in _Znwm(sz = 4048060128), line 54 in "new_op.cc"
unnamed block in _Znwm(sz = 4048060128), line 54 in "new_op.cc"
unnamed block in _Znwm(sz = 4048060128), line 54 in "new_op.cc"
_Znwm(sz = 4048060128), line 54 in "new_op.cc"
_Znam(sz = ??), line 36 in "new_opv.cc"
_ZN7PROFILEC1ERK6STRING(this = @0x2fe74398, iniFilename = @0x21973300), line 99 in "profile.cpp"
_ZN2IE17AppendToBDataListEP10BASKETDATA(this = @0x2130eb38, bd = 0x2fe7f000), line 2451 in "ie.cpp"
_ZN5DIEGO14HandleResponseEP10BASKETDATAPv(this = 0x2130eb38, bd = 0x2fe7f000, args = 0x2fe71d78), line 513 in "diegoclass.cpp"
_ZThn68_N5DIEGO14HandleResponseEP10BASKETDATAPv(0x2130eb7c, 0x2fe7f000, 0x2fe71d78), line 21 in "diegoclass.h"
_ZN8KOBJBASE8dispatchEiP10BASKETDATAPv(this = 0x2130eb7c, fcnidx = 12, bd = 0x2fe7f000, args = 0x2fe71d78), line 67 in "kobjbase.cpp"
_ZN6KERNEL8DispatchEPcS0_iP10BASKETDATAPvR4LISTI8KOBJBASEE(this = @0x2fe71d38, module = "diego", method = "HandleResponse", fcn_idx = 12, bd = 0x2fe7f000, args = 0x2fe71d78, thread_objects = @0xf156dd58), line 1118 in "skernel.cpp"
unnamed block in _ZN6KERNEL9ExecuteTXEP10BASKETDATA(this = @0x2fe71d38, bd = 0x2fe7f000), line 224 in "txthread.cpp"
unnamed block in _ZN6KERNEL9ExecuteTXEP10BASKETDATA(this = @0x2fe71d38, bd = 0x2fe7f000), line 224 in "txthread.cpp"
_ZN6KERNEL9ExecuteTXEP10BASKETDATA(this = @0x2fe71d38, bd = 0x2fe7f000), line 224 in "txthread.cpp"
unnamed block in _ZN6KERNEL22ProcessEnqueuedBasketsEP6BASKET(this = @0x2fe71d38, b = @0x2fe7ef68), line 1162 in "skernel.cpp"

Wie kann ich den Core Dump verwenden, um meinen Absturz zu beheben?

Antwort1

Zuerst führen Sie diese Ausgabe durch aus c++filt, das die C++-Symbole in eine für Menschen lesbare und mit Querverweisen auf den Quellcode versehene Ausgabe zerlegt.

Daraus können Sie ersehen, dass der PROFILE-Konstruktor aufgerufen wurde new[], was zu einer Ausnahme geführt hat, für die es keinen Handler gibt (std::terminate wird aufgerufen), was zu einem Programmabbruch und zur Generierung eines Core Dumps führt.

Sie können den Aufruf new[]in einen try...catchBlock einschließen, um zu sehen, was die Ausnahme ist. Ich kann mich nicht spontan erinnern, welche Ausnahmen new[]unter welchen Umständen auftreten können, aber eine Fehlerursache newist ein beschädigter Heap, der häufig durch das Überschreiben der Grenzen einer Zuweisung oder eines Doubles entsteht delete.

Sie können diese Speicherfehler mit Programmen wie valgrind(kostenlos) oder purify(kommerziell, sofern es das noch gibt – ich habe es zuletzt vor 15 Jahren verwendet) diagnostizieren. valgrindwäre ein guter Anfang und zeigt Ihnen Ihre Speicherfehler der oben genannten Art an.

Mit dem Core Dump können Sie noch tiefer in die Materie einsteigen gdbund das Speicherabbild Ihres Programms zum Zeitpunkt des Absturzes untersuchen. Dabei kann Ihnen hier aber niemand wirklich helfen - Sie müssen die Struktur Ihres Codes und das erwartete Speicherlayout kennen, um damit viel anfangen zu können.

verwandte Informationen