Warning: set address range perms: large range 650073600 (undefined)



  • Warning: set address range perms: large range 650073600 (undefined)
    

    Hallo,

    ich starte eine Programm welches einige arrays sehr groß werden lässt. Ich bekomme segfaults. Lasse ich valgrind drüberschauen bekomme ich die obige Meldung. Was besagt diese? Laufen die buffer über?



  • und am ende von valgrind stürtzt es ab mit:

    ==24663== Warning: set address range perms: large range 650073632 (noaccess)
    --24663:0:aspacem  Valgrind: FATAL: VG_N_SEGMENTS is too low.
    --24663:0:aspacem    Increase it and rebuild.  Exiting now.
    

    jemand ne ahnung? Zu wenig Speicher für die Daten?



  • welches einige arrays sehr groß werden lässt.

    Wie gross? Wie schaut der Code dazu aus? Auf welchem System? Wieviel Speicherplatz ist dort? 32 oder 64 bit ... und vieles mehr ...



  • testo schrieb:

    Warning: set address range perms: large range 650073600 (undefined)
    

    Hallo,

    ich starte eine Programm welches einige arrays sehr groß werden lässt. Ich bekomme segfaults. Lasse ich valgrind drüberschauen bekomme ich die obige Meldung. Was besagt diese? Laufen die buffer über?

    Durch große Arrays an sich können eigentlich keine Segfaults entstehen. Wenn die Arrays so groß werden, gibts normalerweise 'ne bad_alloc Exception.
    Was sein kann, ist, dass Dein size-Wert zu groß wird, und einen nummerischen Überlauf hat.
    Also irgendwie sowas wie

    size_t bufferSize = std::numeric_limits<size_t>::max() + 10; //simuliert Überlauf
    std::vector<T> vec(bufferSize); //typischerweise 9 Elemente
    //...
    vec[sehr_grosser_index] = crazyFunction(); //boing
    


  • danke erstmal. Ich versuche etwas einzugehen

    Wie gross? Wie schaut der Code dazu aus? Auf welchem System? Wieviel Speicherplatz ist dort? 32 oder 64 bit ... und vieles mehr ...

    * Mehrere Arrays mit Größe ca. 10^7. Hab versucht nachzurechnen und der Datensatz sollte eigentlich um die 763 MB haben - also locker in den Speicher passen.
    * Ein 32 Bit Linux system
    * System hat 8 GB Speicher
    * Arrays werden ganz einfach so erstellt:

    //z.B n = 10^7
    int n = 10000000;
    double* arr = new double[n];
    memset(arr, 0, n* sizeof(double));
    


  • testo schrieb:

    ...

    Wieso benutzt Du kein std::vector? Das wäre deutlich sicherer und leichter. Wo entsteht denn der Segfault? Bei der Allokation doch sicher nicht, oder?



  • Wo entsteht denn sehr Segfault?

    Ich kanns nicht sagen weil selbst valgrind das nicht mehr schafft:

    ==15579== Warning: set address range perms: large range 800163088 (undefined)
    ==15579== Warning: set address range perms: large range 800163088 (undefined)
    ==15579== Warning: set address range perms: large range 200040772 (undefined)
    ==15579== Warning: set address range perms: large range 200040772 (undefined)
    ==15579== Warning: set address range perms: large range 400081544 (undefined)
    ==15579== Warning: set address range perms: large range 800163120 (noaccess)
    --15579:0:aspacem  Valgrind: FATAL: VG_N_SEGMENTS is too low.
    --15579:0:aspacem    Increase it and rebuild.  Exiting now.
    

    ich weiß jetzt nicht was ich tun kann um den seg-fault herauszubekommen. evtl. prinft-debugging machen...



  • Das dein Programm crasht, liegt an deinem Programm. Das Valgrind crasht, liegt an Valgrind. Bevor du Printf-Debugging machst, nimm doch erstmal 'nen "normalen" Debugger. Valgrind wuerde ich in erster Linie nicht als Debugger einsetzen.

    Ansonsten: http://www.nabble.com/VG_N_SEGMENTS-too-low%2C-valgrind-fails-td5092366.html


Log in to reply