2010-11-15 4 views
8

Quando il debug di un programma che termina con un segfault, recinto elettrico, in collaborazione con gdb, restituisce questo:Comprendere l'uscita del recinto elettrico e gdb

"ElectricFence Exiting: mprotect() failed: Cannot allocate memory [Thread 0xb0bd4b70 (LWP 5363) exited] Program exited with code 0377.

ho recinzione elettrica effettivamente pensato che sarebbe stato più utile . Cosa significa questo? Come posso interpretare questa informazione? Non sembra esserci nessuna pila che posso guardare, o almeno bt non restituirà nulla.

Qualsiasi suggerimento sarebbe molto apprezzato.

Grazie!

+0

Inoltre, quando il debug il programma, non sembra come se fosse consumare tutta la memoria ... c'è ancora ~ Lasciato 1 GB, che è la metà di esso. Quindi non dovrei nemmeno preoccuparmi dello spazio di scambio, giusto? –

risposta

4

L'output di ElectricFence significa semplicemente che è esaurito di memoria e non può aiutarti.

ElectricFence impone estremamente sovraccarico di memoria, in particolare per i programmi con molte piccole allocazioni di heap.

Se si utilizza Linux, provare invece Valgrind.

Si noti inoltre, che il primo passo di un programma che muore con SIGSEGV dovrebbe non essere in esecuzione con ElectricFence; piuttosto dovresti eseguire il programma sotto debugger e vedere dove si blocca.

+0

Hmm ... Ho ancora molta memoria disponibile quando restituisce quel messaggio. Potrebbe essere solo per usarlo tutto in una volta? È strano. –

+0

Quindi, in ogni caso, quando esattamente dovrei usare la recinzione elettrica, se non in questo caso? –

14

Probabilmente avete esaurito le aree della mappa di memoria. È noto che l'impostazione predefinita è bassa quando si utilizzano gli allocatori di debug. Questo può essere modificata durante l'esecuzione tramite

echo 128000 > /proc/sys/vm/max_map_count 

o aggiungendo questa riga a /etc/sysctl.conf e riavviare:

numero
vm.max_map_count = 128000 

La max_map_count default 65530 e può essere aumentata alto come MAX_INT se necessario.

Per ulteriori informazioni si veda: