Heapfreigabe ???



  • Hallo

    habe folgendes Problem. Beim Debuggen kommt der Fehler :
    Invalid Address specified to RtlValidateHeap( 00330000, 0033C238 )

    und das Programm schmiert ab. Die software ist in visual c++ (mfc) Anwendung geschrieben und das problem trat auf als visual c ++ auf visual c++.net aufgestockt wurde.

    kurz Programm lief fehlerfrei auf alter software dann update dann kompilierfehler.

    kann mir wer helfen??
    danke schon mal


  • Mod

    Du hast einen Bug in Deinem Code: Du verballerst den Heap!

    D.h. die gibst etwas frei, was schon freigegen ist. Du übereschreibst Heapgrenzen etc....



  • ja das mag sein aber erstens macht visual c das zeug alleine denn ich habe im quellcode nicht mit Heapfreigaben (new/delete) gearbeitet und zweitens muss ich ja wissen an welcher Stelle da Mist passiert.Und vor allem warum ging das auf der vorhergehenden version von visual c.



  • Du musst garnix selbst mit dem Heap machen, reicht schon wenn du irgendwo nett Speicher überschreibst der nicht dir gehört.

    Guck mal die Stellen durch wo du mit "rohem Speicher" arbeitest, CString::GetBuffer und so Zeugs. Einige Dinge haben sich durchaus in der MFC geändert, und da waren auch einige breaking-changes dabei. IIRC auch einige die nicht in einem Compilezeit-Fehler enden sondern erst zur Laufzeit Probleme machen.


  • Mod

    Streue in Deinem Code

    ASSERT(AfxCheckMemory());
    

    Irgendwann wirst Du einen ASSERT bekommen.



  • Das Problem mit dem abschmieren tritt beim Beenden des Programms auf.Ablauf : daten speichern ja nein ---> das funzt noch aber egal ob ja oder nein beim endgültigen programm verlassen kommt der Fehler:

    Unbehandelte Ausnahme bei 0x7c91120e in ***.exe: Benutzerhaltepunkt

    und im Degugger schon genannter Text.

    und das mit dem haltepunkt begreif ich erst gar nix weil ich alle entfernt hab.


  • Mod

    Wie schon geschrieben. Dein Heap-Speicher ist überschrieben worden durch irgendetwas was Du machst.

    Wie ich schon geschrieen habe:

    Streue in Deinem Code

    ASSERT(AfxCheckMemory());
    

    Irgendwann wirst Du einen ASSERT bekommen.



  • Verwende den PageHeap, dann findest Du es sehr schnell raus, was passiert.
    Dazu brauchst Du die Debugging Tools for Windows und aktivierst mittels "glflags" den "Full Page Heap" für Deine APplikation.
    Dann wird *sofort* ein Breakpoint getriggert, wenn was nicht passt.
    Es ist nicht nötig irgendwas in Deinen Code zu "streuen".
    Du brauchst aber etwas mehr Speicher, da für jede Allokation eine eigene Page allokiert wird (deswegen Full-Page-Heap 😉 )


  • Mod

    Es geht auch durch setzen von _CRTDBG_CHECK_ALWAYS_DF mit _CrtSetDbgFlag, dann wird immer bei jeder Allokation ein Heapcheck durchgeführt!



  • Hab das mal mit dem win debugtool gemacht und da ist es ganz lustig geworden beim normalen beenden des programms kommt keine fehlermeldung wenn ich jedoch abspeicher bringt er mir nen "anderen" Fehler.
    konkret statt:
    "Unbehandelte Ausnahme bei 0x7c91120e Benutzerhaltepunkt"

    "Unbehandelte Ausnahme bei 0x1020a752 Zugriffsverletzung-Leseposition 0x02592124"

    und diese wiederum kommt beim öffnen einer dll datei, welche aber erst im fertigen programm entsteht.... alles irgendwie wirr.



  • Jochen Kalmbach schrieb:

    Verwende den PageHeap, dann findest Du es sehr schnell raus, was passiert.
    Dazu brauchst Du die Debugging Tools for Windows und aktivierst mittels "glflags" den "Full Page Heap" für Deine APplikation.
    Dann wird *sofort* ein Breakpoint getriggert, wenn was nicht passt.
    Es ist nicht nötig irgendwas in Deinen Code zu "streuen".
    Du brauchst aber etwas mehr Speicher, da für jede Allokation eine eigene Page allokiert wird (deswegen Full-Page-Heap 😉 )

    Oh wie geil ist das denn 🙂 🙂
    Danke für den Tip, das Feature kannte ich noch nicht!


  • Mod

    Es geht auch ohne die Debugging Tools indem Du den Application Verifier benutzt!
    Dann geht das ganze sogar mit dem normalen Visual Studio!
    Debug -> Start with Applicatioj Verifier.

    Die Einstellungen des Application Verifiers kann man einfach in seinem Propjekt machen...

    Siehe auch:
    http://blog.m-ri.de/index.php/2007/03/02/der-application-verifier-mein-neuer-freund/



  • Die tools sind echt klasse der Fehler liegt in einer Zugriffsverletzung auf eine dll - Datei. Diese hat er sich beim upgrade auf ".net" selbst angelegt. Aber so richtig weiß ich jetzt trotzdem nicht was ich da tuen kann.

    trotzdem danke


  • Mod

    zwolf schrieb:

    Aber so richtig weiß ich jetzt trotzdem nicht was ich da tuen kann.

    Deinen Bug damit finden und beheben 🤡


Anmelden zum Antworten