3

Free Pascalで記述されたコンソールアプリケーションがありますが、ほとんどの大規模なアプリケーションと同様に、クラッシュすることがあります。このアプリケーションは稼働しているので、私は通常、クラッシュ時にスタックトレースを書き留めるように人々に依頼します。デバッグとlineinfoの両方で配布します。ただし、アプリケーションはFPC video.pas出力を使用し、テキスト出力のスタックトレースが表示されない場合があります。

未処理の例外に書き込まれたテキストをスタックトレースでインターセプトして、ファイルに書き込むことができるようにする方法はありますか?FPCビデオはどういうわけかそれで動作しないので、標準エラーをファイルにパイプすることはできません。また、バッチファイルやシェルファイルではなく、実行可能ファイルを実行するだけでよいのです。

例として、これをファイルまたは他の出力ソースにキャッチしたいと思います。

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

それをきれいに行う可能性はありますか?

4

1 に答える 1

2

関連する 2 つの (システム ユニット) プロシージャ変数があります。

  • 例外を処理するExceptproc
  • アドレスから lineinfo への取得を処理するbacktracestrfunc

現在の取り扱いiircは階層化されています

  • システムユニットはエラーで終了するだけですが、上記のプロシージャ変数を定義してこれをオーバーライドします。
  • sysutils ユニットは RTE を言語例外に変換し、exceptprocをデフォルトの言語例外ハンドラー (sysutils.catchunhandledexception) でオーバーライドします。
  • lineinfo (スタブ用) または linfodward (dwarf、2.4.0+) ユニットは、 backtracestrfunc プロシージャー変数をオーバーライドして、lineinfo を提供します。

要するに:

  • sysutils.catchunhandledexception ルーチンを独自のコードにコピーします。
  • コピーが出力する方法を好きな方法で変更するだけで、しっかりとしたものにします (例外中の例外は混乱を招き、迷惑なので)。
  • コピーの機能をexceptprocに割り当てます

-gl を実行すると、lineinfo ユニットが暗黙的に含まれることに注意してください。

于 2009-12-19T15:29:17.910 に答える