Catturare lo stack-trace in Free Pascal
-
20-09-2019 - |
Domanda
Ho un'applicazione console scritta in Free Pascal, che, come la maggior parte delle applicazioni più grandi, a volte si blocca.Poiché questa applicazione è attiva, di solito chiedo alle persone di scrivermi lo stack-trace in caso di arresto anomalo: lo distribuisco sia con debug che con lineinfo.Tuttavia, l'applicazione utilizza l'output video.pas FPC e talvolta lo stacktrace dell'output di testo non è visibile.
Esiste un modo per intercettare il testo scritto su eccezioni non gestite CON l'analisi dello stack, in modo da poterlo scrivere su file?Non posso semplicemente reindirizzare l'errore standard a un file, perché il video FPC in qualche modo non funziona con quello, e inoltre vorrei che le persone eseguissero semplicemente l'eseguibile e non un file batch o shell.
Ad esempio, vorrei catturarlo in un file o in un'altra fonte di output:
ERangeError : Range check error∙
$0048C0EA TCELLS__GETCELL, line 104 of dfmap.pas
$004AD133 TDOOMGENERATOR__GENERATECITYDUNGEON, line 397 of dfdungen.pas
$004AF87D TDOOMGENERATOR__GENERATE, line 760 of dfdungen.pas
$0041293B TDOOM__RUN, line 354 of doombase.pas
$00401CD6 main, line 51 of doomrl.pas
C'è qualche possibilità di farlo in modo pulito?
Soluzione
Sono coinvolte due variabili di procedura (unità di sistema):
- Tranne proc che gestisce l'eccezione
- E backtracestrfunc che gestisce il recupero dell'indirizzo per la lineainfo.
L'attuale gestione iirc è a più livelli
- l'unità di sistema termina solo con un errore ma definisce le variabili della procedura sopra per sovrascriverlo.
- l'unità sysutils converte gli RTE in un'eccezione di linguaggio e sovrascrive tranne proc con un gestore di eccezioni della lingua predefinito (sysutils.catchunhandledexception)
- le unità lineinfo (per stabs) o linfodward (dwarf, 2.4.0+) sovrascrivono le unità backtracestrfunc variabile di procedura per fornire il lineinfo.
Quindi in breve:
- copia la routine sysutils.catchunhandledexception nel tuo codice.
- modifica solo il modo in cui la copia esegue l'output nel modo che preferisci e rendilo solido (poiché le eccezioni durante le eccezioni sono confuse e fastidiose)
- assegnare il nomefunzionale della copia a esclusoproc
Tieni presente che l'unità lineinfo è implicitamente inclusa quando esegui -gl