std:bad_alloc taucht andauernd auf



  • Hallo zusammen!

    Ich arbeite derzeit mit einem neuen Simulationscode für Simulationen geophysikalischer Plasmen! Ich habe den Code nicht selbst geschrieben, benutze ihn aber.
    Das Problem ist, dass mir sehr oft (ich weiß nicht, ob es Zufall ist oder nicht) folgende Fehlermeldung herausgegeben wird in der Konsole:

    terminate called after throwing an instance of 'std::bad_alloc'
    what(): std::bad_alloc
    [barney:19656] *** Process received signal ***
    [barney:19656] Signal: Aborted (6)
    [barney:19656] Signal code: (-6)
    [barney:19656] [ 0] /lib/libpthread.so.0 [0x7f57d3af0190]
    [barney:19656] [ 1] /lib/libc.so.6(gsignal+0x35) [0x7f57d37a54b5]
    [barney:19656] [ 2] /lib/libc.so.6(abort+0x180) [0x7f57d37a8f50]
    [barney:19656] [ 3] /usr/lib/libstdc++.so.6(_ZN9__gnu_cxx27__verbose_terminate_handlerEv+0x115) [0x7f57d51ffcc5]
    [barney:19656] [ 4] /usr/lib/libstdc++.so.6 [0x7f57d51fe0f6]
    [barney:19656] [ 5] /usr/lib/libstdc++.so.6 [0x7f57d51fe123]
    [barney:19656] [ 6] /usr/lib/libstdc++.so.6 [0x7f57d51fe21e]
    [barney:19656] [ 7] /usr/lib/libstdc++.so.6(_Znwm+0x7d) [0x7f57d51fe6ad]
    [barney:19656] [ 8] /usr/lib/libstdc++.so.6(_Znam+0x9) [0x7f57d51fe769]
    [barney:19656] [ 9] ./comet_test_new(_ZN6CBlock13resize_pArrayEiii+0x67) [0x4502f7]
    [barney:19656] [10] ./comet_test_new(_ZN7CHybrid22read_Particle_of_BlockEiP6CBlock+0x124) [0x466114]
    [barney:19656] [11] ./comet_test_new(_ZN7CHybrid13read_ParticleEv+0x1cf) [0x46a03f]
    [barney:19656] [12] ./comet_test_new(_ZN7CHybrid13restore_stateEv+0x6f) [0x46a96f]
    [barney:19656] [13] ./comet_test_new(_ZN7CHybrid4initEv+0x4c) [0x4722cc]
    [barney:19656] [14] ./comet_test_new(main+0x1de) [0x43589e]
    [barney:19656] [15] /lib/libc.so.6(__libc_start_main+0xfd) [0x7f57d3790abd]
    [barney:19656] [16] ./comet_test_new [0x432d89]
    [barney:19656] *** End of error message ***
    --------------------------------------------------------------------------
    mpirun noticed that process rank 1 with PID 19656 on node barney exited on signal 6 (Aborted).
    --------------------------------------------------------------------------

    Der Code ist in C++ programmiert! Ich habe schon bei Google gesucht, aber nichts gefunden, was ich wirklich verstehe, da ich nicht all zu viel von der Programmierung oder den technischen Details verstehe.
    Meine erste Vermutung ist/war, dass es sich um Probleme von MPI handelt. Hier mal ein paar kurze Infos:
    Der Code ist voll parallelisiert und nutzt MPI
    Mein Rechner hat:
    - Intel Celeron 2.40 GHz dual core
    - 3.7 GB Arbeitsspeicher
    - Gnome Ubuntu 9.10 (karmic)

    Mir geht es darum, dass ich nicht weiß, wie ich die Fehlermeldung zu interpretieren habe. Ich weiß, dass die aufgelisteten Prozesse eine Art "Nutzungsrangfolge" sind, die bei [0] eine Fehler "entdecken". Ich weiß aber nicht, wodurch das hervorgerufen wird. Weiterhin bin ich nicht sicher, ob ein "bad_alloc" nur ein Fehler ist, der durch falsch oder gar nicht allokierten Speicher (im Arbeitsspeicher?) entsteht.

    Über Hilfe oder Rat von jemandem wäre ich sehr froh!
    Habe auch schon Kollegen gefragt, aber hier programmiert keiner C++!

    Viele Grüße

    Alfven/Basti



  • Es gibt mehrere Gründe für die std::bad_alloc Exception. Allgemein kommt die Meldung, wenn ein new fehlgeschlagen ist, d.h. beim anfordern von dynamischen Speicher. Und das kann folgende Ursache haben:
    1. nicht genug dynamischer Speicher frei
    2. nicht genug dynamischer Speicher an einem Stück frei

    Man müsste jetzt einen Debugger haben, um den Stacktrace durch zu schauen. Dann weiß man, an welcher Stelle die Exception geworfen wird. Aber dann würdest du wahrscheinlich auch nur die Erkenntnis haben, das Speicher in comet_test_new mit new angefordert wird.

    Eure Anwendung hört sich aber auch nicht so an, als ob sie wenig Speicher verbraucht. 😃 Habt Ihr Sourcecode zu der Anwendung? Mit nem Profiler könnte man bestimmt fest stellen, wieviel Speicher frei ist und was noch von der Anwendung benötigt wird.



  • bad_alloc kommt wenn dir der Speicher ausgeht. Er taucht auf wenn du versuchst Speicher zu allokieren und den von der Plattform (vom Betriebssystem) nicht bekommt.
    Das kann im Großen und Ganzen drei verschiedene Gründe haben:

    1. Du (oder die Bibliothek die du benutzt) allokierst haufenweise Speicher ohne ihn wieder freizugeben. Irgendwann streckt der Speichermanager des Betriebssystems alle viere von sich. Programmiertechniken wie RAII (Smartpointer) und Tools wie valgrind können helfen solche Speicherlecks zu vermeiden/zu finden.

    2. Du (oder die lib) benötigst gleichzeitig mehr Speicher als das System auf einmal hergeben kann. Das kann dran liegen dass dem Prozess die Ressourcen nicht zugestanden werden oder dass sie tatsächlich nicht vorhanden sind. Dei Programm sprengt quasi die technischen Grenzen deines Systems.

    3. Du (oder die lib) versuchst einen einzigen riesenblock Speicher zu reservieren, der Größer ist als dir das System geben kann/will. Allokationen in kleineren Häppchen könnten da helfen.

    Gerade bei Multithreading ist das ein heikles Thema, wenn man beispielsweise allen Threads gleich viel Speicher zugesteht und viele Threads laufen lässt, bleibt pro Thread relativ wenig Speicher übrig. Wenn dann einer der Threads viel Speicher braucht gehts in die Hose. Eventuell kannst du die Zahl der Threads regulieren oder das Speicheraufteilungsverhalten.



  • Hallo zusammen!
    Die Antwort kommt zwar reichlich spät, aber besser als nie. Hab es einfach schlichtweg vergessen, hier zu schreiben, was draus geworden ist. Wie unhöflich, sorry!

    Also, das Problem lag tatsächlich am Speicher. Der Speicher war voll und der Swap(?) war ebenfalls schon ausgelastet. Aber neue Rechnung mit mehr Speicher und CPUs laufen nun.

    Ich bedanke mich noch einmal für Eure Hilfe!

    Viele Grüße
    Alfven


Anmelden zum Antworten