Ininformatica, unostack trace (traducibile letteralmente dall'inglese come "traccia dello stack"), chiamato anchestack backtrace[1] ostack traceback[2], è un elenco deglistack frame attivi in un determinato momento durante l'esecuzione di unprogramma. Quando un programma viene eseguito, la memoria viene spesso allocata dinamicamente in due posizioni: lostack e l'heap. Tecnicamente, una volta che un blocco di memoria è stato allocato nello stack, non può essere rimosso facilmente poiché possono esserci altri blocchi di memoria che sono stati allocati prima di esso. Ogni volta che una funzione viene chiamata in un programma, un blocco di memoria, chiamatorecord di attivazione (o puntatore allo stack), viene allocato in cima allo stack di runtime. Ad un alto livello, un record di attivazione alloca memoria per i parametri della funzione e le variabili locali dichiarate nella funzione.
Uno stack trace consente di tracciare la sequenza difunzioni annidate invocate, fino al punto in cui viene generata la traccia dello stack. Questo è particolarmente utile quando la traccia viene generata a seguito di un errore. Per questo motivo, i programmatori usano comunemente lo stack tracing durante ildebug. Talvolta anche l'utente finale può visualizzare uno stack trace come parte di unmessaggio di errore, che può in seguito segnalare al programmatore.
Prendiamo, ad esempio, il seguente programmaPython contenente un errore:
defa():i=0j=b(i)returnjdefb(z):k=5ifz==0:c()returnk+zdefc():error()a()
L'esecuzione del programma con l'interprete Python standard produce il seguente messaggio di errore:
Traceback (most recent call last): File"tb.py", line15, in<module>a() File"tb.py", line3, inaj=b(i) File"tb.py", line9, inbc() File"tb.py", line13, incerror()NameError:name 'error' is not defined
Lo stack trace mostra il punto in cui si è verificato l'errore, ovvero nella funzionec
. Il messaggio segnala anche che la funzionec
è stata chiamata dab
, che è stata chiamata daa
, che a sua volta è stata chiamata dal codice nella riga 15 (l'ultima) del programma.
Moltilinguaggi di programmazione, inclusiJava eC#, supportano nativamente il recupero della traccia dello stack corrente tramite opportunechiamate di sistema.C++ non ha un supporto integrato per eseguire questa operazione, ma i programmatori C++ possono recuperare le tracce dello stack tramite appositelibrerie, ad esempiostacktrace. InJavaScript, leeccezioni contengono una proprietà chiamatastack
(invocabile quindi comeerr.stack
) contenente lo stack dal punto in cui è stato lanciato; inoltre, la maggior parte deibrowser moderni supportano la chiamataconsole.trace();
.[3]