2009-12-17 5 views
3

J'ai une application de console écrite en Free Pascal, qui, comme la plupart des applications plus importantes, se bloque parfois. Comme cette application est en ligne, je demande généralement aux gens de m'écrire la trace de la pile lors d'un crash - je la distribue avec debug et lineinfo. Toutefois, l'application utilise la sortie FPC video.pas et parfois la pile de sortie de texte n'est pas visible.Attraper pile-trace dans Free Pascal

Existe-t-il un moyen d'intercepter le texte écrit sur des exceptions non gérées avec la trace de la pile, afin que je puisse l'écrire dans un fichier? Je ne peux pas simplement rediriger l'erreur standard vers un fichier, car la vidéo FPC ne fonctionne pas avec ça, et j'aimerais aussi que les gens exécutent simplement l'exécutable, pas un fichier batch ou un fichier shell.

À titre d'exemple, je voudrais prendre à un fichier ou une autre source de sortie:

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 

Toute possibilité de le faire proprement?

Répondre

2

Il y a deux (unité centrale) variables de procédure impliquées:

  • Exceptproc qui gère l'exception
  • et backtracestrfunc qui gère l'adresse de récupération LineInfo.

Le traitement actuel iirc est stratifiée

  • l'unité centrale se termine seulement avec une erreur mais au-dessus définit les variables de procédure pour remplacer ce produit.
  • l'unité sysutils convertit RTEs à l'exception de la langue et remplace exceptproc avec un gestionnaire d'exceptions de langue par défaut (sysutils.catchunhandledexception)
  • la LineInfo (pour les coups) ou le linfodward (naines, 2.4.0+) unités override la variable backtracestrfunc procédure pour fournir le lineinfo.

Donc en bref:

  • copie la routine sysutils.catchunhandledexception à votre propre code.
  • ne modifier la façon dont la copie ne sortie d'une manière que vous aimez, et le rendre solide comme le roc (depuis des exceptions pendant les exceptions sont confus et ennuyeux)
  • assignez la functionanme de la copie à exceptproc

Notez que l'unité lineinfo est implicitement incluse quand vous faites -gl

+0

Merci beaucoup, d'une certaine manière je m'attendrais à ce que vous soyez le seul à connaître la réponse:> –

+0

Naah, je ne suis qu'un des mineurs FPC se démonte. –