Ich habe ein C ++ - Programm / Linux, das innerhalb von 2-3 Sekunden nach dem Start den Fehler std::bad alloc
auf einem 32-GB-RAM ausgibt (und vom Wrapper-Aufrufer neu gestartet wird). Was mir wirklich wichtig ist, ist dieses Problem zu lösen, aber ich würde gerne Schritt für Schritt gehen und mein Vertrauen in mein Verständnis des Problems aufbauen.
Es sieht so aus, als ob das System nicht in der Lage ist, Speicher für eine new
-Anforderung zuzuweisen (dies würde passieren, wenn das Betriebssystem nicht mehr genügend Speicher hat). Während das Programm läuft, führe ich an einem anderen Terminal den Befehl sar
mit dem kleinsten möglichen Intervall (1 Sekunde) aus, aber ich sehe, dass kbcached
~ 24GB Speicher ist. Warum kann das Betriebssystem das Caching nicht freigeben und diesen Speicher für die new
-Anfrage verfügbar machen? Entweder 1 sec ist zu viel Zeit (im Vergleich zu wie schnell Programme laufen) oder ich mache hier etwas falsch.
Grundsätzlich möchte ich die Cross-Verify und Pin-Point, dass das Betriebssystem tatsächlich nicht genügend Arbeitsspeicher hat und daher nicht in der Lage, Speicher zuzuordnen, und dann von diesem Punkt an Dinge nehmen. Wie man es macht?
Idealerweise hätte ich gerne die Systemstatistiken zu dem Zeitpunkt, an dem die Speicherzuweisung fehlschlägt, wie zum Beispiel Caching, insgesamt belegter Speicher usw.
Wenn Sie tatsächlich sehen möchten, wie der Speicher Ihres Prozesses zugeordnet ist, können Sie einen Haltepunkt mit gdb
für den Zeitpunkt angeben, zu dem die Ausnahme ausgelöst wird. Wenn dies der Fall ist, überprüfen Sie den Prozess mit einem Tool wie pmap , das Ihnen zusätzliche Informationen zur Verwendung des Prozesses anzeigen kann Speicher.
Wenn das zu primitiv ist (und es wird schnell sein, pmap
ist ziemlich primitiv), valgrind enthält Massif und viele andere Dienstprogramme zur Diagnose Speicherauslastung, CPU-Auslastung und andere Laufzeitprobleme.
Tags und Links memory-leaks c++ memory-management operating-system