2008-12-07 28 views
11

Tôi đang sử dụng Delphi TApplication.OnException tổ chức sự kiện để bắt unhandled ngoại lệLàm thế nào tôi có thể tìm ra thủ tục nào đã ném một ngoại lệ trong Delphi?

này hoạt động tốt nhưng không cung cấp đầy đủ thông tin về nơi ngoại trừ xảy ra tức là 'thất bại thảm khốc'

Làm thế nào tôi có thể tìm ra các thủ tục làm lỗi xảy ra?

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; 

Trả lời

23

Bạn có thể lấy địa chỉ bộ nhớ nơi mà các ngoại lệ được ném bằng cách sử dụng biến exceptAddr (Đơn vị hệ thống). Nhưng nếu bạn muốn có một dấu vết ngăn xếp, bạn có thể sử dụng một trong những công cụ 3Party MadExcept, EurekaLog hoặc JCLDebug nguồn mở (một phần của JCL).

+0

Xin chào Andy - chào mừng bạn đến với SO ...! – Roddy

+0

Cảm ơn - Tôi vừa mới có được Eurekalog - nó hoạt động tốt –

8

Cách đơn giản và nhanh nhất là sử dụng hỗ trợ ngoại lệ và gỡ lỗi JCL. Sau khi cài đặt JCL, đảm bảo chèn các biểu tượng gỡ lỗi vào nhị phân (Dự án -> Chuyên gia gỡ lỗi JCL -> Chèn dữ liệu JDBG cho nhị phân này -> Đã bật) và thêm hộp thoại ngoại lệ JCL vào dự án (Tệp -> Mới .. . -> Hộp thoại -> Hộp thoại ngoại lệ).

Nếu trình cài đặt JCL không thêm hộp thoại đó vào kho đối tượng và nó không xuất hiện (đã xảy ra với tôi một vài lần), hãy thêm thủ công bằng cách sao chép tệp .pas và .dpr từ jcl-install-dir\experts\debug\dialog vào dự án của bạn và bổ sung chúng bằng tay, hoặc gần Delphi, sửa %DELHPIDIR%\bin\delphi32.dro trong một trình soạn thảo văn bản và thêm một cái gì đó như thế này để nó (điều chỉnh các đường dẫn dĩ nhiên :)

 
[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= 
Các vấn đề liên quan