Ho un programma che implementa diversi algoritmi di ricerca euristica e diversi domini, progettati per valutare sperimentalmente i vari algoritmi. Il programma è scritto in C++, costruito utilizzando la toolchain GNU ed eseguito su un sistema Ubuntu a 64 bit. Quando eseguo i miei esperimenti, utilizzo il comando ulimit
di bash per limitare la quantità di memoria virtuale che il processo può utilizzare, in modo che il mio sistema di test non inizi a scambiare.Perché il mio programma occasionalmente segfault quando esaurisce la memoria anziché lanciare std :: bad_alloc?
Determinate combinazioni di istanze di algoritmi/test hanno raggiunto il limite di memoria che ho definito. La maggior parte delle volte, il programma genera un'eccezione std :: bad_alloc, che viene stampata dal gestore predefinito, a quel punto il programma termina. Occasionalmente, piuttosto che questo accade, il programma semplicemente segfaults.
Perché il mio programma occasionalmente segfault quando esaurisce la memoria, invece di segnalare un std :: bad_alloc non gestito e che termina?
segfault può essere causato non solo perché si raggiunge limite di memoria – Andrey
Sono a conoscenza. Nei casi in cui ho visto un segfault, il processo ha utilizzato quantità di memoria vicine al limite che ho specificato. Sono abbastanza fiducioso che i segfault che ho visto non erano dovuti a bug nel mio codice. –
Hai considerato una semplice esecuzione in GDB (alcuni di loro) per vedere quale parte del codice segna errori? – Shiroko