Ideen für Stack Overfolow Problem



  • Hallo,
    ich suche seit 2 wochen Stack Overflow Problem und komme ehrlich gesagt nicht viel weiter.
    Es handelt sich um eine App unter WindowsCE (deshalb nur begrenzte Möglichkeiten) die mehrere Threads beinhaltet.
    Ich versuche es aber erst unter XP zu verstehen was man da für Möglichkeiten bzw. Chancen hat Stack Overflow zu finden.

    Eine SD Applikation, Run Funktion überschrieben durch:

    CMyWinApp::Run()
    {
    int nRet;
    try
     nRet = CWinApp::Run();
    catch (CMemoryException Ex)
     TRACE("CMemoryException ");
    catch (...)
    }
    

    Damit soll die Run Routine durch Try/catch überwacht.

    Die Fkt. OnNewDocument ruft OnTest auf:

    bool CMyDoc::OnTest()
    {
    retrun OnTest();
    }

    Damit wird die Rekursion solange ausgeführt bis Stack Overflow auftritt.

    Was ich nicht verstehe ist warum der Catch Zweig (wo ich ein Breakpoint gesetzt habe) nicht augeführt wird?

    Kann man überhaupt so einen Fall abfangen?

    Gruss
    Michael


  • Mod

    Ein Stackoveflow löst eine SEH Exception aus. Die kann man so nicht mit einem try/catch fangen.
    Da musst Du schon einen SEH Exception Handler einbauen.



  • Danke für die Antwort.
    Unter XP habe ich es erfolgreich ausprobiert und funktioniert wie ich es mir vorgestellt habe.
    Unter WinCE sieht die Sache anders aus. Hier wird bei einem Stack Overflow die Exception nicht ausgeführt.
    Ich brauche noch Ideen wie ich den Stack Overflow finden könnte. Ich sehe zur Zeit als letzte Chance Funktionen nacheiender rauszuschmeissen aber ist sehr aufwendig.



  • Debuggen geht nicht?



  • Ja debuggen geht. Aber debuger zeigt immer den Folgefehler.
    Er zeigt:
    CMemoryException wurde ausgelösst
    Unbehandelter Exception
    Terminate Applikation

    Debuger steht auf eine stelle die mit sicherheit damit nichts zu tun hat wie z.B. GetDocument()

    Ich kann leider nicht mal einem Thread zuordnen in welchen es der StackOverflow entsteht.
    Die Applikation hat mehr als 30 Thread. Meine Vermuttung liegt an 3 möglichen Thread (vielleicht sogar 2). Diese Threads sind für Empfang und Senden der TCP daten.
    Meines Wissens StackOverflow entsteht durch RekursieverAufruf oder wenn irgendwo lokale Variabelen wie z.B.:

    void Test(){
    int Arr[100];
    Test2();
    }
    void Test2(){
    int Arr[200];
    Test3(); //usw
    }

    immer wieder angelegt werden.
    Der Fehler ist so Blöd das er erst nach 2 Tagen auftritt auch ohne irgendeine Benutzung des Programms. Schneller kann ich es nicht reproduzieren. Weiss nur dass die Verbindung zur gegenstelle Aufgebaut wird und immer wieder ein Lebenszeichen gesendet und die Quittung empfangen wird.
    Für mich ist das aber nicht 100% sicher ob es mit dem Lebenszeichen was zu tun hat. Weiss nur dass wenn ich an der cyklusdauer drehe der Fehler nach 10 Std. auftritt. Also ist die Vermuttung zimlich hoch dass es entweder am SendeThread oder Empfangsthread liegt.
    All das ist aber nicht wirklich Greifbar.



  • Ideen für Stack Overfolow Problem

    Ein Stack Overfollow Problem kann man meist beheben, indem man im Stack eine Drossel verbaut, so dass er nicht mehr hinterher kommt. 🤡



  • StackOverflow kann auch durch Folgendes entstehen:

    int Arr[10000];
    

    Wenn der Stack begrenzt ist (so wie vermutlich bei CE).

    Siehe:
    http://msdn.microsoft.com/en-us/library/aa450572.aspx
    http://msdn.microsoft.com/en-us/library/ms864039.aspx



  • Kanst du etwas genaues zur Stack Drossel sagen?



  • Michael S. schrieb:

    Kanst du etwas genaues zur Stack Drossel sagen?

    Bei eBay günstig kaufen, von der Werkstatt (unbedingt eine Fachwerkstatt für deinen Compiler suchen) einbauen lassen - fertig! 🤡


Anmelden zum Antworten