Beschädigung des HEAP
-
@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/295223Gruß
foo
-
http://blog.m-ri.de/index.php/2008/10/27/vs-tipps-tricks-heap-bugs-finden-teil-1/
http://blog.m-ri.de/index.php/2008/10/31/vs-tipps-tricks-heap-bugs-finden-teil-2/
http://blog.m-ri.de/index.php/2008/11/04/vs-tipps-tricks-heap-bugs-finden-teil-3/
http://blog.m-ri.de/index.php/2008/11/27/vs-tipps-tricks-heap-bugs-finden-teil-4/
-
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.
-
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.
-
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.
-
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.