Come rilevare Stack Overflow

August 17

Come rilevare Stack Overflow


linguaggi di programmazione informatica si basano su una struttura di dati stack di chiamate --- alcuni fanno la propria presenza esplicita al programmatore, mentre tutti si basano su una pila per il programma salti che deve tornare al luogo in cui il programma originale era interrotto, dopo aver eseguito una sorta di subroutine . Prima di trasferire il controllo al codice utente, un programma imposta la dimensione massima per lo stack di chiamate, tra le altre preparazioni. Talvolta un programma interrompe a causa di un errore di segmentazione, che può essere causato da una varietà di fattori. Si può facilmente rilevare è un overflow dello stack è alla radice del problema utilizzando un debugger.

istruzione

1 Ricompilare il programma che sta dando la colpa di segmentazione in modo che tutti i simboli di debug sono collegate in esso. Ad esempio, per un programma C ++ su qualsiasi sistema operativo con la suite GNU di strumenti, eseguire:

"G ++ -g program.c -o programma"

in cui l'opzione "-g" indica al compilatore di includere i simboli di debug.

2 Eseguire il programma finché non si ferma a causa di un errore di segmentazione. Per l'esempio, eseguire:

"programma"

3 Richiamare il debugger sul programma giusto dopo il guasto di segmentazione. Per l'esempio, eseguire:

"Il programma gdb"

4 Visualizzare un backtrace utilizzando il debugger. Tutti i debugger a livello sorgente hanno la capacità di visualizzare la catena di invocazioni funzione annidata al momento del crash del programma. Per il nostro esempio "gdb", inserire "gdb:" all'interno

"Backtrace"

5 Esaminare la backtrace per i segni di una ricorsione infinita. È un singolo nome di una funzione ripetuta più volte del necessario prima del crollo? Sono alcune funzioni di chiamata tra di loro (per esempio, la ricorsione mutua) troppe volte prima del crollo? Se la risposta a una domanda è "sì", il programma interrotto a causa di un overflow dello stack. La causa più probabile dello stack overflow in linguaggi di alto livello sono codificati in modo non corretto i casi di base.