Beschädigung des HEAP



  • Hallo.

    Ich habe eine Anwendung von VC++ 6.0 auf VC++ 2010 umgestellt.
    Soweit funktioniert auch fast alles, aber ein Fehler an dem ich derzeit hänge ist folgende Fehlermeldung:

    Windows hat einen Haltepunkt in ARWIN.exe ausgelöst.

    Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in ARWIN.exe oder in einer der geladenen DLLs hinweist.

    Dies kann auch darauf zurückzuführen sein, dass der Benutzer F12 drückt, während ARWIN.exe den Fokus hat.

    Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster

    Mit Hilfe von "_ASSERTE( _CrtCheckMemory( ) );" konnte ich den Ort eingrenzen wo es zu dem HEAP-Fehler zu kommen scheint. Und zwar ist das der Aufruf von "Datenbankobject vom Typ CRecordset"->Requery();

    Das seltsame ist nun, dass diese Stelle aufgerufen wird nachdem ich im Projekt ein modales Fenster schließe.
    In dem Fenster befinden sich verschiedene Dropdown-Felder. Aber nur bei einem Feld entsteht dieser Fehler - sogar nachdem ich alle mit dem Feld verbundene Funktionalität ausgeschaltet habe kommt der Fehler immer noch wenn ich zuvor das Feld betätigt habe. Alle anderen Dropdowns kann ich normal verwenden ohne dass der Fehler auftaucht. 😮
    Zu guter letzt - wenn ich in dem anfälligen Dropdown etwas ändere und die Änderungen dann über die ESC-Taste lösche und dann den Dialog schließe kommt es wiederum nicht zu dem Fehler - ganz so als müsse da etwas anderes als beim Aufruf des Formulars drin stehen um den Fehler zu verursachen. 😕

    Ich hoffe es ist verständlich was ich sagen will.

    Der Fehler tritt übrigens nur im Dwbug-Modus auf.
    Ich habe jetzt wenigstens zwei Tage lang Google durchsucht und alles ausprobiert was mir eingefallen ist, leider ohne Erfolg.

    Das Programm ist leider viel zu groß um den Quellcode zu posten, aber ich hoffe es hat trotzdem jemand 'nen Tip für mich oder 'ne Idee?



  • Ist das evtl. ein besonderes DropDown-Feld, also ein Datums- oder intern abgeleitetes DropDown-Feld?

    Ist das "Datenbankobject vom Typ CRecordset" vielleicht ungültig geworden?
    Ich könnte mir vorstellen das ein besonderes (s.o.) DropDown-Feld möglicherweise im Hintergrund in der Datenbank rum fummelt und so das Datenbank-Objekt oder der aktuelle Datensatz ungültig geworden sind...

    [edit]
    ...vielleicht erzeugt auch das DropDown-Feld intern ein Objekt, das beim Schliessen des Dialoges ungültig ist... (nicht sauber aufgeräumt o.ä.)
    [/edit]



  • @isabeau: Nein, es handelt sich um ein normales Dropdown-Feld. Und auch das DB-Objekt ist noch vorhanden zum Zeitpunkt des Fehlers. Beides hatte ich mir auch schon gedacht.
    Ich bin gleich Richtung Feierabend verschwunden und werde dann erst morgen wieder hier rein schauen, aber ich bedanke mich schonmal für jede Hilfe die ich bekomme.

    MfG DoD



  • Hallo,

    ich hatte vor kurzem ein ähnliches Problem. Es ist zwar eine andere Konstellation, aber vielleichts bringts Dich einen Schritt weiter.
    http://www.c-plusplus.net/forum/295223

    Gruß
    foo


  • Mod



  • Danke für Eure Antworten - jetzt werde ich erstmal etwas lesen und schauen ob mir das weiterhilft.

    @Martin: Die beiden ersten Seiten des Blogs habe ich über Google auch schon gefunden - ich habe nur nicht gesehen dass es noch weiter geht nach Teil 2.
    Über Teil 1 des Blogs konnte ich das Problem ja schonmal eingrenzen - leider reichte die Eingrenzung noch nicht zum lösen, aber ich schaue mal ob die Seiten drei und vier dabei weiterhelfen können. 😃


  • Mod

    Mit dem Applikation Verifier müsstest Du das aber weiter eingrenzen können.

    Letzten Endes garantiere ich Dir dass Du einen Buffer überschreibst.

    Hast Du _CRTDBG_CHECK_ALWAYS_DF benutzt, oder auch _CRTDBG_DELAY_FREE_MEM_DF ?



  • Wenn ich den ApplicationVerifier verwenden will geht ungefähr gar nichts mehr.
    Ich starte den Verifier und weiße ihm die .exe zu die erstellt wird.
    Dann starte ich den Debugger und bekomme bevor das Programm ganz geladen wurde folgenden Fehler: "Eine Ausnahme (erste Chance) bei 0x77e6f91d in ARWIN.exe: 0xC0000008: An invalid handle was specified."
    Der Fehler zeigt dann auf eine Stelle in der Assembly.


  • Mod

    Stell den App-Verifier so ein, dass er nurnoch Speicherfehler meldet...

    Ansonsten nimm die Debug-Flags.



  • Für mich sieht es jetzt so aus, dass mein Objekt vom Typ CRecordset ein CRecordset::Requery aufruft. Innerhalb dieser Methode wird MoveNext() aufgerufen, welche dann den Absturz erzeugt.

    Die MSDN sagt dazu:
    "It is also recommended that you call IsEOF before calling MoveNext. For example, if you have scrolled past the end of the recordset, IsEOF will return nonzero; a subsequent call to MoveNext would throw an exception."

    Und eben das scheint zu passieren, auch wenn ich eigentlich nicht glauben kann das sowas nicht abgefangen wird?
    Mein Recordset beinhaltet beim Aufruf von Requery übrigens genau einen Datensatz. Innerhalb der Requery-Methode wird auch übrprüft ob sich der QueryString verändert hat, was beim Aufruf der Methode nicht der Fall ist.

    EDIT: Wird der Suchfilter vor dem Aufruf der Requery-Methode nicht geändert wird in CRecordset::Requery der "else-Zweig" durchlaufen (samt dem MoveNext()) und es kommt zum Fehler.
    Jetzt habe ich mal vor den Aufruf einen geänderten Suchfilter gesetzt wodurch der if-Zweig der Methode durchlaufen wird und schon klappt es.
    Aber das kann natürlich nicht Sinn der Sache sein jetzt erst den Suchstring zu verfälschen, dann Requery, Suchstring korrigieren und nochmal Requery. 😞



  • Durch den Einsatz des ApplicationVerifier kommen jetzt übrigens schon beim Programmstart vermehrt Stellen wo der Debugger stoppt (aber über "Weiter" läuft das Programm auch korrekt weiter), aber im LogFile des ApplicationVerifiers stehen weder Warnings noch Errors. Auch nicht nachdem die Stelle kam wonach nichts mehr geht.



  • Irgendwie hat sich das Problem jetzt von selbst erledigt (zumindest scheint es so). Der Fehler taucht jedenfalls nicht mehr auf - ohne dass ich ihn gefunden hätte.
    Sehr komisch, aber ich muss mich wohl damit begnügen.

    Vielen Dank an alle die mir geholfen haben bzw. es versucht haben. 😃


  • Mod

    Dann tippe ich mal darauf, dass Dein Prblem irgendwann wieder da sein wird... 🕶



  • @Martin: Ja, das fürchte ich auch, aber solange es nicht da ist wird es umso schwerer es ausfindig zu machen.


Anmelden zum Antworten