12

Delphi TApplication.OnException イベントを使用して未処理の例外をキャッチしています

これはうまく機能しますが、例外が発生した場所、つまり「壊滅的な障害」について十分な情報を提供しません。

どの手順でエラーが発生したかを調べるにはどうすればよいですか?

procedure TFrmMain.FormCreate(Sender: TObject);
begin
  Application.OnException := MyExceptionHandler;
end;

procedure TFrmMain.MyExceptionHandler(Sender : TObject; E : Exception );
begin
  LogException (E.Message);     
  Application.ShowException( E );
end;
4

3 に答える 3

25

例外がスローされたメモリ アドレスは、ExceptAddr 変数 (システム ユニット) を使用して取得できます。ただし、スタック トレースが必要な場合は、サードパーティ ツールの MadExcept、EurekaLog、またはオープン ソースの JCLDebug (JCL の一部) のいずれかを使用できます。

于 2008-12-07T08:27:02.897 に答える
9

最も簡単で迅速な方法は、JCL例外とデバッグ サポートを使用することです。JCL をインストールした後、必ずデバッグ シンボルをバイナリに挿入し ([プロジェクト] -> [JCL デバッグ エキスパート] -> [このバイナリの JDBG データを挿入] -> [有効])、JCL 例外ダイアログをプロジェクトに追加します ([ファイル] -> [新規].. . -> ダイアログ -> 例外ダイアログ)。

JCL インストーラーがそのダイアログをオブジェクト リポジトリに追加できず、表示されない場合 (私は数回発生しました)、.pas および .dpr ファイルをjcl-install-dir\experts\debug\dialogプロジェクトにコピーして手動で追加するか、手動で追加します。または、Delphi を閉じ%DELHPIDIR%\bin\delphi32.dro、テキスト エディタで編集し、次のようなものを追加します (もちろんパスを調整します:)

[P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLG]
タイプ=フォームテンプレート
名前=例外ダイアログ
ページ=ダイアログ
アイコン=P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLG.ICO
Description=JCL アプリケーション例外ダイアログ
著者=Project JEDI
DefaultMainForm=0
DefaultNewForm=0
祖先=

[P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL]
タイプ=フォームテンプレート
Name=Exception Dialog with Send
ページ=ダイアログ
アイコン=P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL.ICO
Description=JCL アプリケーション例外ダイアログ
著者=Project JEDI
DefaultMainForm=0
DefaultNewForm=0
祖先=
于 2008-12-07T08:24:29.563 に答える
6

主に関連するもの: Delphi での例外処理

于 2008-12-07T09:14:50.583 に答える