2012-06-18 6 views
8

Ho un programma C++/Linux, che entro 2-3 secondi dall'inizio inizia a sputare l'errore std::bad alloc su una RAM da 32 GB (e viene riavviato dal chiamante wrapper). Quello che mi interessa davvero è risolvere questo problema, ma vorrei fare un passo alla volta e sviluppare la mia fiducia nella mia comprensione del problema.ottenendo std :: errore error_alloc; Come verificare in modo incrociato che il sistema operativo stia davvero esaurendo la memoria

Sembra che il sistema non sia in grado di allocare memoria per una richiesta new (ciò si verifica quando il sistema operativo ha esaurito la memoria). Mentre il programma è in esecuzione, su un altro terminale eseguo il comando sar con il minimo intervallo possibile (1 secondo), ma vedo che kbcached è una memoria da ~ 24 GB. Perché il sistema operativo non è in grado di rilasciare la cache e rendere tale memoria disponibile per la richiesta new? O 1 secondo è troppo tempo (rispetto alla velocità di esecuzione dei programmi) o sto facendo qualcosa di sbagliato qui.

Fondamentalmente mi piacerebbe verificare e verificare che il sistema operativo stia effettivamente esaurendo la memoria e quindi non è in grado di allocare memoria, e quindi prendere le cose da questo punto in poi. Come farlo?

Idealmente, vorrei avere le statistiche di sistema proprio nel momento in cui l'allocazione della memoria non riesce, come la quantità di caching, la memoria totale utilizzata up ecc

+2

Solo una nota .. non ha nulla a che fare con la RAM in uso, dipende da quanta memoria libera è presente nello spazio degli indirizzi di memoria virtuale del processo. Non conosco il comando per controllare l'allocazione della memoria virtuale del processo. – Naveen

+0

Immagino che questo sia specifico per il sistema operativo. – sharptooth

+0

Quanta memoria è stata allocata dal processo? Quali vincoli ha il tuo processo? È 32 bit? –

risposta

2

Se si vuole realmente vedere come la memoria del processo è allocato , è possibile impostare un punto di interruzione con gdb per quando viene generata l'eccezione. Quando lo è, ispeziona il processo con uno strumento come pmap, che può mostrare ulteriori informazioni su come il processo utilizza la memoria.

Se questo è troppo primitiva (e in fretta sarà, pmap è piuttosto primitivo), valgrind include massiccio e molte altre utilità per la diagnosi di utilizzo della memoria, l'utilizzo della CPU e altri problemi di runtime.

+1

In particolare (in questo caso), lo strumento valgrind massiccio. Assegnazioni di tracce di Massif e consente di ottenere un grafico del consumo di memoria su una timeline; e per ogni istantanea, identifica da dove provengono le allocazioni. –

+0

@MatthieuM. Forse il tuo commento dovrebbe essere una risposta da solo? – RedX

+1

@RedX: Nient'altro da dire, quindi lascerò che Steven aggiunga i dettagli alla sua risposta, se trova che ne valga la pena. –

Problemi correlati