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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top