2010-02-21 10 views
6

Ich schrieb meine eigene Referenz gezählt Speichermanager C++ (zum Spaß) und ich bin sicher, es ist nicht perfekt;). Und jetzt, als ich versuche, es zu benutzen, habe ich zufällige SIGTRAP-Signale bekommen. Wenn ich jede Zeile auskommentiere, die mit diesem 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 einen Haltepunkt erreicht, aber kein Haltepunkt gesetzt ist. Ich habe in einem anderen Thread gelesen, dass Debug-Builds der EXEs und DLLs auf dem neuesten Stand sein müssen. Sie sind auf dem neuesten Stand und deshalb ist es nicht der Grund.Ist zufällige SIGTRAP-Signale (in MinGW-gdb) ein Zeichen für Speicherbeschädigung?

Weiß jemand, warum passiert das?

+0

Da Sie unter Windows sind, erhalten Sie fast sicher * keine * SIGTRAPs (die ein UNIX-Konzept sind und überhaupt nicht auf Windows zutreffen). Warum redest du deine Frage nicht, um zu beschreiben, was du tatsächlich beobachtest? –

+7

Nun, MinGW sagt SIGTRAP auch unter Windows. – Calmarius

Antwort

4

Nach der Suche auf Google erkannte ich, dass diese Sigtraps sind die gleichen Warnungen wie Sie in MSVC++ sagen: "Windows hat einen Haltepunkt in xxxx.exe ausgelöst. Dies kann aufgrund einer Beschädigung des Heaps sein, und zeigt einen Fehler blahblahblah “...

So scheint es ja, kann es zu unerwarteten sigtraps Speichern corrupction zeigen (ziemlich seltsam ...)

Und ich fand auch meinen Fehler. Das MM befindet sich in einer statischen Bibliothek, die mit einer DLL verknüpft ist. Und diese statische lib und die DLL ist mit meiner exe verbunden. Also gab es zwei Speichermanager, einen in meiner exe und einen in meiner dll. Rufen Sie die Initialisierungsmethode des MM auf. Es initialisierte das MM in meiner exe, aber nicht in der DLL, also ging die DLL ohne init. Ich löste das, indem ich meine exe nicht mit dieser statischen Bibliothek verknüpfte.

2

Ich würde raten, dass Sie nicht übereinstimmende Neu-/Delete- oder Malloc/Free-Implementierungen aufrufen würden - also wurde etwas von Ihrem Speichermanager zugewiesen, aber wenn der Speicher freigegeben wird, haben Sie die standardmäßige delete/free-Implementierung .

Setzen Sie einen Haltepunkt auf dem Signal und sehen, ob es freie() oder Operator löschen auf dem Stapel ist und ob das die Implementierung der Funktion ist, die Sie erwarten würden.

Verwandte Themen