Stack-Überlauf beim Kopieren von Dateien



  • Hallo Leute,

    ich habe ein Programm geschrieben, das die Methoden "FindFirst, FindNext, FindClose und CopyFileA" verwendet, um Dateien zu kopieren. Dabei wird auch rekursiv gearbeitet.

    Wenn das Programm Dateien lokal auf meinen Rechner kopiert, dann gibt es keine Probleme, egal, woher es die Dateien holt (NT-Server, Novell-Server, etc...). Hin und wieder bekomme ich die Fehlermeldung "Stack-Überlauf", wenn das Programm Dateien auf einen Sever kopiert. D.h. ich starte das Programm bei mir lokal, und es holt die Dateien von meinem lokalen PC oder auch vom anderen Server, und kopiert sie auf einen anderen Server. Ich verwende dabei gemappte Laufwerke.

    ich weiß, daß es viele Beiträge zu diesem Thema gibt, habe allerdings nichts gefunden, was mir helfen könnte.

    Weiß jemand Rat?
    Dankeschön im Voraus.
    Asmahan



  • Vielleicht solltest du erstmal versuchen, zu ermitteln, an welcher Stelle genau der Fehler auftritt, z.B. indem die einzelnen Schritte mitloggst!?



  • Das mache ich ja schon.
    Das Programm bleibt an unterschiedlichen Stellen stehen. Mal beim Überprüfen, ob die zu kopierende Datei im Zielverzeichnis schon existiert, und mal beim Kopier-Prozess (nicht immer bei einer bestimmten Datei), dabei spielt auch die Größe der Datei keine Rolle.

    Danke und schöne Grüße
    Asmahan



  • Tja, das ist typisch für eine Endlosschleife, welche durch sich gegenseitig aufrufende Funktionen ausgelöstwird.

    -junix



  • Nein, es gibt keine Endlosschleifen im Programm.
    Ich sorge schon dafür, daß alle Rekursionen sauber geschlossen werden. Das habe ich mehrfach kontrolliert. Jede "FindFirst" wird auch mit "FindClose" abgeschlossen.

    Andere Ursachen?
    Danke
    Asmahan.



  • Asmahan schrieb:

    Nein, es gibt keine Endlosschleifen im Programm.

    ...behauptet einer, der einen Stackoverflow hat, aber nicht sagen kann woher... *lol*

    Nu mal im Ernst: Das muss natürlich nicht zwingend ein FunktionA ruft FunktionB auf welche FunktionA wieder aufruft-Schleife sein, sondern das kann beliebige Tiefe erreichen. (FuncA ruft B auf die C aufruft, C wiederum macht irgedwas, das dazu führt, dass über ein Event der von einem Control ausgelöst wird wieder A aufgerufen wird, welche B aufruft und die wiederum C welche wiederum.... )

    Sowas zu finden ist verhältnismässig leicht: Setz nen Breakpoint dort, wo das letzte Mal ein Stack-Overflow stattgefunden hat und löse wieder den Eintritt in diese Schleife aus. Anschliessend steppst du friedlich durch den Code, bis du wieder am Anfang angelangt bist.... (vgl. den Artikel Debuggen mit dem C++ Builder)

    -junix



  • @jansen @junix Danke euch!

    Es hat lange gedauert, bis ich den Fehler gefunden habe, weil mit dem Debbuger jedes mal alles wunderbar lief, bis ich auf eine Datei gestoßen bin, die evtl. korrupt war und sich nicht kopieren ließ (auch ganz normal in Windows Explorer ließ sie sich nicht kopieren)

    Einerseits bin ich froh, den Fehler gefunden zu habe, andererseits ist es mir irgendwie peinlich, zuzugeben, woran es lag. Ich wollte am Anfang dazu hier gar nichts mehr schreiben, aber dann habe ich mich doch entschieden, es zu tun, damit vielleicht andere, die auf das gleiche Problem stoßen, nicht stur (wie ich am Anfang) nach dem Fehler in der Rekursion oder ähnliches suchen.

    Der Fehler lag also gar nicht in der Rekursion oder an endloser Schleife.
    Ich hatte es so gemacht gehabt:

    .
    .
    DWORD dwRet;
    .
    .
    .
          if (CopyFileA(sQuelle.c_str(), sZiel.c_str(), 0))
          {
            .
            .
            frmLog->Memo1->Lines->Add(sQuelle + " kopiert");
    
          }
          else
          {
            dwRet = GetLastError();
            frmLog->Memo1->Lines->Add("FEHLER: (" + AnsiString(dwRet) + ")" + sQuelle);
          }
    .
    .
    .
    

    Ihr wisst es schon, woran es lag, richtig?
    Wenn der Kopierprozess fehlschlägt (und das passiert eigentlich ganz selten), fange ich den Fehlercode und gebe ihn aus.
    Ich weiß nicht, wie ich dazu kam,

    AnsiString(dwRet)
    

    zu schreiben. Ich meinte natürlich

    IntToStr(dwRet)
    

    Aber wer kann schon ahnen, was ich wirklich gemeint habe!!!
    Und damit war die Fehlermeldung mit dem "Stack-Überlauf" beseitigt.

    Fazit:
    "Stack-Überlauf" bedeutet nicht gleich "Endlosschleife" oder "Problem bei der Rekursion".

    Schöne Grüße
    Asmahan



  • AnsiString(dwRet) sollte genau so gut gehen wie IntToStr()



  • Schön, dass dein Fehler nu weg ist. Allerdings

    Asmahan schrieb:

    Fazit:
    "Stack-Überlauf" bedeutet nicht gleich "Endlosschleife" oder "Problem bei der Rekursion".

    das ist zwar richtig, ista ber in 90% der Fälle so, dass Der Stacküberlauf durch eine Rekursion ausgelöst wird.

    -junix



  • Xqgene schrieb:

    AnsiString(dwRet) sollte genau so gut gehen wie IntToStr()

    Eben nicht. Denn die Fehlermeldung mit dem "Stack-Überlauf" kam genau an dieser Stelle:

    frmLog->Memo1->Lines->Add("FEHLER: (" + AnsiString(dwRet) + ")" + sQuelle);
    

    Mit

    IntToStr(dwRet)
    

    War die Fehlermeldung weg!

    junix schrieb:

    das ist zwar richtig, ista ber in 90% der Fälle so, dass Der Stacküberlauf durch eine Rekursion ausgelöst wird.

    Hast wohl recht. Deshalb hatte ich mich am Anfang "stur" darauf fixiert.

    Schöne Grüße
    Asmahan


Anmelden zum Antworten