Stack trace
In informatica, uno stack trace (traducibile letteralmente dall'inglese come "traccia dello stack"), chiamato anche stack backtrace[1] o stack traceback[2], è un elenco degli stack frame attivi in un determinato momento durante l'esecuzione di un programma. Quando un programma viene eseguito, la memoria viene spesso allocata dinamicamente in due posizioni: lo stack 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, chiamato record 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 di funzioni 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 il debug. Talvolta anche l'utente finale può visualizzare uno stack trace come parte di un messaggio di errore, che può in seguito segnalare al programmatore.
Esempio
[modifica | modifica wikitesto]Prendiamo, ad esempio, il seguente programma Python contenente un errore:
def a(): i = 0 j = b(i) return j def b(z): k = 5 if z == 0: c() return k + z def c(): 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", line 15, in <module> a() File "tb.py", line 3, in a j = b(i) File "tb.py", line 9, in b c() File "tb.py", line 13, in c error() NameError: name 'error' is not defined
Lo stack trace mostra il punto in cui si è verificato l'errore, ovvero nella funzione c
. Il messaggio segnala anche che la funzione c
è stata chiamata da b
, che è stata chiamata da a
, che a sua volta è stata chiamata dal codice nella riga 15 (l'ultima) del programma.
Linguaggi di programmazione
[modifica | modifica wikitesto]Molti linguaggi di programmazione, inclusi Java e C#, supportano nativamente il recupero della traccia dello stack corrente tramite opportune chiamate di sistema. C++ non ha un supporto integrato per eseguire questa operazione, ma i programmatori C++ possono recuperare le tracce dello stack tramite apposite librerie, ad esempio stacktrace. In JavaScript, le eccezioni contengono una proprietà chiamata stack
(invocabile quindi come err.stack
) contenente lo stack dal punto in cui è stato lanciato; inoltre, la maggior parte dei browser moderni supportano la chiamata console.trace();
.[3]
Note
[modifica | modifica wikitesto]- ^ (EN) Backtraces | The GNU C Library, su gnu.org. URL consultato il 15 dicembre 2020.
- ^ (EN) traceback — Print or retrieve a stack traceback, su docs.python.org. URL consultato il 15 dicembre 2020.
- ^ (EN) console.tracee() - Web APIs § Browser compatibility, su developer.mozilla.org, MDN. URL consultato il 15 dicembre 2020.
Voci correlate
[modifica | modifica wikitesto]Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Denis Howe, stack traceback, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL