2008-12-07 38 views
11

我使用德爾福TApplication.OnException事件捕捉未處理的異常如何找出哪個程序在Delphi中拋出異常?

這種運作良好,但沒有給出異常發生的位置 即「災難性失敗」

我如何才能找到足夠的信息,該過程由錯誤發生了?

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; 

回答

23

你可以得到其中的例外是使用拋出的內存地址ExceptAddr變量(系統單位)。但是如果你想要一個堆棧跟蹤,你可以使用3rdParty工具MadExcept,EurekaLog或開源JCLDebug(JCL的一部分)之一。

+0

嗨安迪 - 歡迎來到SO ...! – Roddy 2008-12-07 10:07:36

8

最簡單和最快捷的方法是使用JCL異常和調試支持。在安裝JCL之後,確保將調試符號插入到二進制文件中(項目 - > JCL調試專家 - >插入此二進制文件的JDBG數據 - >啓用)並添加一個JCL異常對話框到項目中(文件 - >新建.. 。 - >對話框 - >異常對話框)。

如果JCL安裝程序無法將該對話框添加到對象存儲庫並且沒有出現(發生在我身上幾次),可以通過將.pas和.dpr文件從jcl-install-dir\experts\debug\dialog複製到您的項目中手動添加它與手動添加或接近德爾福,在文本編輯器中編輯%DELHPIDIR%\bin\delphi32.dro像這樣添加的東西給它(當然調整的:)路徑

 
[P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLG] 
Type=FormTemplate 
Name=Exception Dialog 
Page=Dialogs 
Icon=P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLG.ICO 
Description=JCL Application exception dialog 
Author=Project JEDI 
DefaultMainForm=0 
DefaultNewForm=0 
Ancestor= 

[P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL] 
Type=FormTemplate 
Name=Exception Dialog with Send 
Page=Dialogs 
Icon=P:\DELPHI11\EXTERNALLIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL.ICO 
Description=JCL Application exception dialog 
Author=Project JEDI 
DefaultMainForm=0 
DefaultNewForm=0 
Ancestor=