std::experimental::filesystem::copy_file() - max. 2GB



  • Hallo,

    ich versuche derzeit, die neue std::filesystem-Library in mein Projekt mit einzubeziehen. Leider wird jedes Mal eine Exception geworfen, sobald 2.0GB kopiert wurden. Ich habe es jetzt mit zwei verschiedenen Dateien probiert, einmal insgesamt 4GB, einmal 2.6GB. Wie gesagt, beide Male bei genau 2.0GB abgebrochen.
    Ich habe mein Programm das eine Mal dann explizit als 64Bit-Programm kompiliert, daran kann es also nicht liegen. Verwendetes System: Ubuntu 16.04, filesystem ist ext4. Source und Destination sind auf der gleichen Partition.

    Hat irgendeiner eine Idee, warum das so ist? Irgendeine Idee, wie man das beheben könnte?

    Danke!



  • „Eine“ Exception?



  • Ja, waren keine zwei. :p
    Ich habe die Exception leider gestern nicht mehr finden können, weil durch einen Fehler mein komplettes Logfile geleert wurde. Deshalb habe ich den Namen weggelassen.
    Die Exception sagte aber definitiv nichts in der Richtung aus. Und weil ich ein weiteres unnötiges Kopieren von 2GB für unnötig hielt, dachte ich, dass vielleicht jemand noch eine Idee hat.
    Die Exception war aber vom Typ std::experimental::filesystem::filesystem_error. Wenn ich mich außerdem Recht entsinne, dann besagte sie, dass die Datei kein Verzeichnis sei - nach 1.5 Minuten und 2GB später.

    Wenn irgendjemand glaubt, dass ihm der genaue Wortlaut der Exception weiterhilft, dann werde ich es heute Abend erneut ausprobieren.



  • Naja, ohne genaue Fehlermeldung und vor allem ohne benutzten Code, ist es äußerst Müßig vermutungen anzustellen, warum das Kopieren deiner Datei fehlschlägt.

    Also:

    1. Code posten, mit dem der Fehler reproduzierbar ist.
    2. Genaue Fehlermeldung posten.
    3. Funktioniert das Kopieren mit kleineren Dateien?


  • Dann werde ich es heute Abend noch einmal durchlaufen lassen und die genaue Meldung schicken.

    Der Fehler liegt kaum in meinem Code. Kleine Dateien und auch die ersten 2GB lassen sich fehlerfrei kopieren.
    Ich werde aber noch ein kompilierbares Mininalbeispiel bringen. Die >2GB Datei müsst ihr aber selbst haben. Ich habe .iso-Dateien verwendet, einmal Windows (4GB) und Kali (2.6GB).

    Später mehr.



  • In dem Fall wäre es ggf. hilfreich, auch noch zu nennen, welchen Compiler du verwendest und welche Standardbibliothek.

    Passiert der Abbruch nach genau 2 GB oder nach 2147483647 Bytes?



  • Hier erst einmal die komplette Exception:

    filesystem error: cannot copy file: No such file or directory [/path/to/sourcefile] [/path/to/destinationfile]

    Das interessante daran ist aber ja, dass die Datei davor bereits kopiert wurde - der Vorgang wird aber eben nach über 1min und nach 2GB abgebrochen.

    Ein sehr einfaches, kompilierbares Beispiel:

    #include <iostream>
    #include <experimental/filesystem>
    
    int main()
    {
            constexpr const char* dest = "/path/to/destination";
            constexpr const char* source = "/path/to/source";
            try
            {  
                    std::experimental::filesystem::copy_file(source, dest, std::experimental::filesystem::copy_options::update_existing);
            }
            catch(const std::exception& e) 
                    std::cerr << e << '\n';
    
            return 0;
    }
    

    Kompiliert mit:

    g++ -std=c++17 test.cpp -lstdc++fs
    

    Verwendete Version: 7.2.0
    Abbruch nach 2147483647 Bytes (2.0GiB, um genau zu sein).

    Jetzt habe ich das kurze Testprogramm einmal mit GCC 5.4 und -std=c++14 kompiliert, dort bricht es nicht ab.
    Auch mein Projekt läuft damit fehlerfrei durch. Dann liegt es wohl an der neuen Lib.
    Werde ich dann wohl reporten müssen.

    Danke.



  • Klingt spannend. Würde mich interessieren, wie dein Bug Report verläuft. Kannst ja vlt. verlinken oder uns so auf dem laufenden halten.



  • Schlangenmensch schrieb:

    Klingt spannend. Würde mich interessieren, wie dein Bug Report verläuft. Kannst ja vlt. verlinken oder uns so auf dem laufenden halten.

    Wird wohl der hier sein.



  • Stimmt soweit, ist der Richtige.
    Ich hoffe, ihr könnt mir mein mittelmäßiges Englisch verzeihen. 🤡

    Nur irgendwie verstehe ich jetzt noch weniger, warum es nicht funktioniert.

    Kann das vielleicht einmal jemand von euch ausprobieren?
    Liegt das vielleicht an meinem Build von GCC 7.2.0 (das ist selbstgebaut im Gegensatz zu dem GCC 5.4)?



  • Lad' einfach mal die libstdc++ herunter (sowohl die alte als auch die neue) und Step-debugge die Implementierung. Wenn der Bug nicht auftritt, freu dich und baue die Lib und schmeiß deine Alte weg.



  • Es ist ja nicht die Standardlib, sondern die libstdc++fs.
    Aber das scheint es tatsächlich zu sein.
    Wenn ich nur mit g++ 7.2 kompiliere und mit g++ 5.4 linke, dann funktioniert es.
    Ich werde es einmal mit neu kompilieren versuchen.



  • Die Lib von GCC 5.4 ist ~763KB groß und die von GCC 7.2 ~10MB.
    Wenn ich jedoch im lib64-Ordner von GCC 7.2 die 10MB-große Lib durch die von GCC 5.4 ersetze, dann funktioniert wieder alles. Was fehlt mir denn dann alles, wenn ich die alte Lib von GCC 5.4 verwende?



  • Für die, die es interessiert: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83279
    Problem besteht tatsächlich und wurde gefixt, bzw. wird gerade noch in manchen Ästen gefixt.


Log in to reply