Run-Time Check Failure #2 - Stack around the



  • Hallo!!!

    Hab ein großes Problem!! Muss ein Programm zum Datenaustausch schreiben,hab alles soweit fertig, aber nachdem die Main Funktion das return 0 ausgeführt hat kommt folgender Fehler:

    Run-Time Check Failure #2 - Stack around the variable 'Programm' was corrupted.

    Kann das was mit der dyn Speicherorganisierung (Arrays,..) zu tun haben???

    Mein Main:

    int main()
    {
    CController Programm; //Objekt vom Typ CController wird erstellt

    //Konfigurieren der Datengeneratoren, Swich und der Datensenke
    Programm.createSystem("SystemConf.sys");

    //Startet Simulationsvorgang
    Programm.simulate();

    return 0;
    }

    Fehler tritt an folgender Stelle im main() auf:
    return 0;
    00444B4D mov dword ptr [ebp-0FCh],0
    00444B57 mov dword ptr [ebp-4],0FFFFFFFFh
    00444B5E lea ecx,[Programm]
    00444B61 call CController::~CController (424A4Bh)
    00444B66 mov eax,dword ptr [ebp-0FCh]
    }
    00444B6C push edx
    00444B6D mov ecx,ebp
    00444B6F push eax
    00444B70 lea edx,ds:[444B9Bh]
    00444B76 call @ILT+1860(@_RTC_CheckStackVars@8) (424749h)
    00444B7B pop eax
    00444B7C pop edx return 0;
    00444B4D mov dword ptr [ebp-0FCh],0
    00444B57 mov dword ptr [ebp-4],0FFFFFFFFh
    00444B5E lea ecx,[Programm]
    00444B61 call CController::~CController (424A4Bh)
    00444B66 mov eax,dword ptr [ebp-0FCh]
    }
    00444B6C push edx
    00444B6D mov ecx,ebp
    00444B6F push eax
    00444B70 lea edx,ds:[444B9Bh]
    00444B76 call @ILT+1860(@_RTC_CheckStackVars@8) (424749h)
    00444B7B pop eax -----> Hier bleibt das Programm hängen!!!!!!!!!!!!
    00444B7C pop edx



  • Das da gehört eher nach Assembler. Nach dem return 0 in der main() ist dein Programm fertig und muss nur noch aufräumen (Destruktoren etc). Bei dem bisschen C++-Code kann dir keiner helfen (vielleicht aber mit dem Assembler oder der Fehlermeldung).



  • Ich glaube aber eher, dass du lieber den High-Level (also C++) Code hier posten solltest, als die Mnemonics.

    Wird man dir wohl eher helfen können.
    (Schließen wir hier mal Compiler und CRT-Fehler aus).



  • macht CControll nen eigen thread auf dann könnt sein dsa du des zu aprubt abrichst
    kenn CControll leider net

    mfg



  • spjoe schrieb:

    macht CControll nen eigen thread auf dann könnt sein dsa du des zu aprubt abrichst
    kenn CControll leider net

    mfg

    Kannst du bitte ein bisschen besser auf deine Rechtschreibung achten. Danke.


  • Mod

    in dem assembler code steht nichts von interesse. im übrigen ist deine diagnose fehlerhaft insofern, als der fehler NICHT dort ist, wo das programm abbricht; der abbruch geschieht vielmehr dann, wenn entdeckt wird, DASS ein fehler vorliegt (wie es typisch für diese art runtime check ist). zur fehlersuche würde ich empfehlen, sich alle non-const methode anzusehen, und nat. besonders constructor und destructor. besonderes aufmerksamkeit solltest du dabei stellen widmen, bei denen das objekt Programm oder member des objekts Programm mit rohen zeigern angefasst werden - das ist nicht die einzige möglichkeit, aber mit abstand die wahrscheinlichste.



  • Hallo!!
    Dank euch für die Info!!
    Hab durch den Debuger den Fehler jetzt so weit eigeschränkt, dass ich weiß, dass er beim Aufruf des CopyConstruktor auftritt!
    Fehler: There is no source code available for the current location.

    Komisch ist aber, dass kein Fehler auftritt, wenn ich mit "Step over" darüber geh. Die kopie wird erstellt und das Programm laüft bis zum Schluss weiter, wo es dann eben beim return 0 abbricht.
    Will ich aber mit "Step into" in den CopyConstruktor kommt der Fehler.

    Ausschnitt aus meinem Programm:

    CPacket* p = queue[0]; //Erstellen eines neuen Pakets vom Typ CPacket
    CPacket* cpy=new CPacket(*p);

    for(int n=0;n<SinkNum+1;n++)
    {
    receiver.at(n) ->setNewPackage(cpy); //Übergeben des Pakets an CSimIF
    }
    queue.erase(queue.begin()); //Löschen des ersten Pakets in der Warteliste
    delete p;

    Copykonstruktor:

    CPacket::CPacket(CPacket& packet)
    {
    TargetAddress=packet.TargetAddress; //Kopieren der Zieladresse in neues Datenpaket
    SenderAddress=packet.SenderAddress; //Kopieren der Senderadresse in neues Datenpaket
    Priority=packet.Priority; //Kopieren der Priorität in neues Datenpaket
    Length=packet.Length; //Kopieren der Datenblocklänge in neues Datenpaket
    CheckSum=packet.CheckSum; //Kopieren der CheckSumme in neues Datenpaket

    //Abfrage ob Datenblocklänge >0 und Datenblockpointer ungleich 0
    if((packet.Length>0) && (packet.Datablock!=0))
    {
    Datablock=new char [packet.Length]; //Erstellen des neuen Datenblocks

    //Kopieren aller Datenelemente
    for(int i=0;i<packet.Length;i++)
    {
    Datablock[i]=packet.Datablock[i];
    }
    }
    }


  • Mod

    Fehler: There is no source code available for the current location.

    Das ist kein Programmfehler. tip: englisch lernen. wenn gar nichts geht, nimm babelfish, lol
    ich bezweifle, dass der copy-c'tor die ursache ist, auch wenn er möglicherweise fehlerhaft ist (Datablock wird nicht initialisiert, wenn packet zufällig mal keine daten enthält).
    die kommentare sind im übrigen wenig hilfreich 😉



  • Des oben beschriebene Problem mit "Step over" und "Step into" tritt auch bei Konstruktor auf!!

    Wenn ich mit step over drüber gehe und anschließend den Datablock Pointer ansehe steht <BadPtr> dabei.
    (Sorry wegen dem graußlichen Programmierstil, aber i mochs erst seit 2 Monat)

    Code:

    CPacket* p=new CPacket(); //Erstellen eines neuen Pakets von Typ CPacket

    Konstruktor:

    CPacket::CPacket()
    {
    //Initialisiert alle Werte mit 0
    TargetAddress = "";
    SenderAddress = "";
    Priority = 0;
    CheckSum = 0;
    Datablock = 0;
    Length = 0;
    }

    //Destruktor der Klasse CPacket
    CPacket::~CPacket()
    {
    if(Datablock!=0) //Abfrage ob Datenblockpointer ungleich 0
    {
    delete [] Datablock; //Löschen des Datenblocks
    }
    }

    Klassendefinition:
    -------------------
    class CPacket
    {
    private:
    string TargetAddress; //symbolischer Name der Zieladresse
    string SenderAddress; //symbolischer Name des Absenders
    int Priority; //Priorität des Pakets
    int Length; //Länge des Datenblocks
    char* Datablock; //Zeiger auf Datenblock
    char CheckSum; //CRC-8 über den Datenblock

    public:

    //Konstruktor der Klasse CPacket
    CPacket();

    //Copyconstruktor der Klasse CPacket
    //Übergabeparameter: Referenz auf den Datenpaket
    CPacket(CPacket& packet);

    //Destruktor der Klasse CPacket
    ~CPacket();


Anmelden zum Antworten