Anfängerfehler



  • Gut, danke.

    Noch ein Problem wenn ich mein Projekt starte läuft alles wunderbar. Erst wenn ich das Programm beende bekomme ich einen illegalen Speicherzugriff angezeigt.
    Woran liegt das?

    MfG
    Scarabol



  • Scarabol schrieb:

    Woran liegt das?

    Meine Glaskugel ist zerbrochen, und was DEIN Debugger als Antworten gibt, können wir nicht ahnen.



  • Ausgabe

    Eine Ausnahme (erste Chance) bei 0x0040cd43 in starfighter_online.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000009.
    Unbehandelte Ausnahme bei 0x0040cd43 in starfighter_online.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000009.
    

    Aufrufbrowser

    starfighter_online.exe!irr::core::irrAllocator<char>::deallocate(char * ptr=0x0041e6e8)  Zeile 41 + 0xc Bytes	C++
    	starfighter_online.exe!irr::core::string<char,irr::core::irrAllocator<char> >::~string<char,irr::core::irrAllocator<char> >()  Zeile 191	C++
     	starfighter_online.exe!irr::scene::quake3::`dynamic atexit destructor for 'irrEmptyStringc''()  + 0xd Bytes	C++
    

    irrAllocator.h (gehört zu Irrlicht, 3D Engine)

    //! Deallocate memory for an array of objects
    	void deallocate(T* ptr)
    	{
    		internal_delete(ptr); // <<<<<< hier Error
    	}
    

    MfG
    Scarabol



  • Da wird anscheinend Speicher freigegeben, welcher bereits freigegeben worden ist oder einfach auf nichts sinnvolles zeigt.

    Sprich der Aufrufkontext der Funktion ist fehlerhaft. Ich würde mal darauf tippen, dass du da die deallokation in einem Destruktor hast und du dann das Objekt kopierst (sprich auch der Zeiger) wird kopiert und du hast dann 2x eine deallokation auf den gleichen Speicherbereich. Das ist ein üblicher Fehler.

    Ansonsten zeig mal die (relevante) Umgebung, wo du die Funktion aufrufst. (und der Fehler passiert).



  • drakon schrieb:

    Ansonsten zeig mal die (relevante) Umgebung, wo du die Funktion aufrufst. (und der Fehler passiert).

    Der Debugger springt direkt in die Header Datei, ich weiß also nicht wo im Programm der Fehler passiert und die Funktion wird einige Male verwendet...

    MfG
    Scarabol



  • der Debugger wird vermutlich an die Stelle springen wo die Exception auftritt - und im Stacktrace solltest du dann sehen von wo aus deinem Programm der Ablauf an die Stelle gelangt ist. Irgendwo wird eine von dir geschrieben Funktion im Stacktrace stehen und davor setzt du beim nächsten Debugdurchlauf am besten mal einen Breakpoint und schaust dir die Werte an, ob sie gut sind.



  • Wie finde ich den "Stacktrace" bei Visual C++ 2008 + SP1 ?

    MfG
    Scarabol



  • Das ding heißt dort Callstack oder so ähnlich - auf deutsch weiß ichs ehrlich gesagt nicht - "aufrufreihenfolge" oder was öhnliches vielleicht? Wenn du beim Debuggen bist müsstest du das Fenster mit Alt+7 öffnen können.



  • view -> other windows -> call browser
    heißt es im englischen - obwohl ich auch immer dachte, dass es call stack hieß : D

    hat bei mir keinen short cut
    (MSVC 2008 prof.)

    bb



  • pumuckl schrieb:

    Das ding heißt dort Callstack oder so ähnlich - auf deutsch weiß ichs ehrlich gesagt nicht

    "Stapelrahmen" :xmas2:



  • Hier mal ein Screeni irgendwas mach ich doch falsch :?

    http://img163.imageshack.us/img163/7438/aufproblem.th.png

    Kann man in diesem Forum eigentlich Bilder posten?

    MfG
    Scarabol



  • Rechts unten. "Aufrufliste".



  • ok, hab ich gesehen aber wie kann ich in den zugehörigen Quellcode springen um den Breakpoint zu setzen? Wenn ich die Zeile anklicke kommt er mir nur mit Dissassembly oder sowas...

    MfG
    Scarabol



  • ?
    Also wenn ich bei mir VS08 Prof. da Doppelklick mache, dann springt er mir in den Code..



  • "Für die aktuelle Position ist kein Quellcode verfügbar!"

    Stimmt so gesehen auch, weil sich das im vorkompilierten Lib der Grafikengine abspielen sollte...

    MfG
    Scarabol



  • ^^
    Na klar. Wenn kein Code vorhanden ist, kann er auch nicht reinspringen. 😉
    Wäre ja zu schön, wenn VS da einfach mal eben aus Binarys C++ Code machen könnte. :p



  • Und was mach ich jetzt :?

    MfG
    Scarabol



  • Naja. Das was man da halt tut. Schrittweise debuggen und schauen, wo der Fehler passiert.
    Mach dir vor allem mal Gedanken über die Dinge, welche ich auf Seite 1 gepostet habe!



  • Der Fehler wird ziemlich sicher nicht in der Grafik-engine passieren, sondern weiter oben. Nehmen wir mal an dein Programm ist so aufgebaut:

    void meineFunktion1()
    {
       bla();
       foo();
       meineFunktion2();
    }
    
    void meineFunktion2()
    {
       grafikFunktionX();
    }
    
    int main()
    {
      int i = 5;
      meineFunktion1();
    }
    

    der callstack lautet dann innerhalb der Grafikfunktion etwa wie folgt:

    - grafikFunktionX
    - meineFunktion2
    - meineFunktion1
    - main
    

    du machst dann natürlcih keinen Doppelklick auf die grafikFunktion sondern auf eine von deinen Funktionen, weil ja anzunehmen ist dass der Fehler bei dir liegt, nicht bei der Bibliothek.
    Und es ist mit ziemlicher Sicherheit irgendwo eine von deinen Funktionen im Callstack. Dort solltest du ansetzen.

    Es dürfte übrigens das eine oder andere Tutorial im Netz geben, wie man mit dem MSVC debuggt, und welche Werkzeuge man beim Debuggen generell benutzen kann/sollte.



  • Der Callstack lautet:

    >	starfighter_online.exe!irr::core::irrAllocator<char>::deallocate(char * ptr=0x0041b620)  Zeile 41 + 0xc Bytes	C++
     	starfighter_online.exe!irr::core::string<char,irr::core::irrAllocator<char> >::~string<char,irr::core::irrAllocator<char> >()  Zeile 191	C++
     	starfighter_online.exe!irr::scene::quake3::`dynamic atexit destructor for 'irrEmptyStringc''()  + 0xd Bytes	C++
     	msvcr90d.dll!1023bd05() 	
     	[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder fehlen, keine Symbole geladen für msvcr90d.dll]	
     	msvcr90d.dll!1023b9e2() 	
     	starfighter_online.exe!__tmainCRTStartup()  Zeile 599	C
     	starfighter_online.exe!mainCRTStartup()  Zeile 403	C
     	kernel32.dll!7c816fe7()
    

    Wie soll ich meine Funktion auswählen?

    Die Grafikengine gibt einen String den es nicht mehr gibt nocheinmal frei. Soweit denke ich kann ich das schonmal festhalten. Der Fehler liegt wahrscheinlich bei mir, da ich irgendwo den Pointer änder oder den String bereits freigebe.
    Wenn ich kurz vor dem Fehler in mein main() gucke bin ich gerade bei dem return das die main() dann auch beendet. Nachdem alles freigegeben ist.

    MfG
    Scarabol


Anmelden zum Antworten