11 Stimmen

Der "this"-Zeiger wird in der Stapelverfolgung beschädigt

Ich habe gesehen este Thema. Mein Fall ist etwas anders und ich kämpfe damit, herauszufinden, wie "this" Der Zeiger wird beschädigt.

Ich verwende das Qt 4.6.2-Framework, mit deren QTreeView mit meinem eigenen Modell. Der Backtrace, den ich erhalte (86 Frames lang, mit einer Menge Rekursionen, deshalb habe ich nicht alles eingefügt), ist folgendermaßen pastebin betrifft nur ihren Code.

Schließlich kommt es in QBasicAtomicInt::deref zu einem Assembler-Fehler, aber es ist offensichtlich, dass er weiter unten gestorben ist, wie diese drei Frames zeigen:

#15 0x01420fd3 in QFrame::event (this=0x942bba0, e=0xbf8eb624) at widgets/qframe.cpp:557
#16 0x014bb382 in QAbstractScrollArea::viewportEvent (this=0x4, e=0x93f9240) at widgets/qabstractscrollarea.cpp:1036
#17 0x0156fbd7 in QAbstractItemView::viewportEvent (this=0x942bba0, event=0xbf8eb624) at itemviews/qabstractitemview.cpp:1610

Im Rahmen 17, this es 0x942bb0 . Im Rahmen 16, this sollte die gleiche sein, da sie in Frame 17 die Implementierung der gleichen Methode ihres Vorgängers aufruft. Jedoch this wird zu 0x4.

Interessanterweise wird in Frame 15 (auch hier hat Frame 16 die Implementierung der gleichen Funktion durch seinen Vorgänger aufgerufen) der Zeiger "this" wieder auf 0x942bba0 .

Wenn Sie sich das Pastebin des vollständigen Backtrace ansehen, sehen Sie vielleicht einige "optimierte Werte". Ich hatte die Anwendung mit eingeschalteter Optimierung kompiliert; ich habe jetzt gcc auf -g3 -O0 Wenn es also das nächste Mal passiert, habe ich vielleicht etwas mehr. Aber natürlich kann ich es jetzt nicht mehr zum Absturz bringen - es ist ein ziemlich schwieriger Fehler (aber dennoch sehr wichtig zu beheben), also denke ich nicht, dass das zu verdächtig ist.

In Anbetracht der Optimierungen, ist das this pointer=0x4 ungewöhnlich oder definitiv falsch? Was seltsam ist, ist, dass es keinen echten Code in einem dieser viewportEvent-Frames gibt - sie machen einfach einen Schalter auf den Typ des Ereignisses, es fällt durch die Switch-Anweisung, und es gibt die Implementierung seines Vorfahren zurück.

Valgrind scheint keine Probleme zu machen, obwohl ich es in Valgrind noch nicht zum Absturz gebracht habe.

Hat jemand dieses Verhalten schon einmal beobachtet? Was könnte die Ursache sein?

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