8 Stimmen

Ist das Erhalten von zufälligen SIGTRAP-Signalen (in MinGW-gdb) ein Zeichen für eine Speicherbeschädigung?

Ich habe meinen eigenen referenzgezählten Speichermanager in C++ geschrieben (zum Spaß) und ich bin sicher, dass er nicht perfekt ist ;) . Und wenn ich jetzt versuche, ihn zu benutzen, bekomme ich zufällige SIGTRAP-Signale. Wenn ich jede Zeile auskommentiere, die mit dem Speichermanager in Verbindung steht, läuft alles gut. SIGTRAP-s anstelle von SIGSEGV zu bekommen ist ziemlich seltsam. Ich weiß, dass SIGTRAP-s ausgelöst werden, wenn das Programm auf einen Haltepunkt trifft, aber es ist kein Haltepunkt gesetzt. Ich habe in einem anderen Thread gelesen, dass die Debug-Builds der Exe- und Dll-Dateien auf dem neuesten Stand sein müssen. Sie sind auf dem neuesten Stand, also ist das nicht der Grund.

Weiß jemand, warum dies der Fall ist?

8voto

Calmarius Punkte 17229

Nach der Suche auf Google erkannte ich, dass diese Sigtraps die gleichen sind wie die Warnungen, die Sie in MSVC++ erhalten, die besagen "Windows hat einen Haltepunkt in xxxx.exe ausgelöst. Dies kann auf eine Beschädigung des Heaps zurückzuführen sein und weist auf einen Fehler hin blahblahblah"...

Es scheint also, ja, unerwartete Sigtraps können auf eine Speicherkorruption hinweisen (ziemlich seltsam...)

Und ich habe auch meine Wanze gefunden. Das MM befindet sich in einer statischen Bibliothek, die mit einer DLL verknüpft ist. Und diese statische Bibliothek und die Dll sind mit meiner Exe verknüpft. Also gab es zwei Speichermanager, einen in meiner Exe und einen in meiner Dll. Wenn ich die Initaialisierungsmethode des MM aufrufe. Es initialisierte den MM in meiner Exe, aber nicht in der Dll, so dass die Dll ohne Init lief. Ich habe das Problem gelöst, indem ich meine Exe nicht mit dieser statischen Bibliothek verlinkt habe.

2voto

VoidPointer Punkte 17219

Ich würde in eine Vermutung werfen, dass Sie möglicherweise nicht übereinstimmende new/delete oder malloc/free-Implementierungen aufrufen - So etwas wurde von Ihrem Speichermanager zugewiesen, aber wenn der Speicher freigegeben wird Sie am Ende mit der Standard-Löschen/Free-Implementierung.

Setzen Sie einen Haltepunkt auf das Signal und sehen Sie nach, ob free() oder operator delete auf dem Stack liegt und ob dies die Implementierung der Funktion ist, die Sie erwarten würden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X