2008-12-07 24 views
11

estoy usando Delphi TApplication.OnException de eventos para capturar las excepciones no controladas¿Cómo puedo averiguar qué procedimiento arrojó una excepción en Delphi?

Esto funciona bien pero no da información suficiente acerca de dónde ocurrió la excepción es decir, 'Fallo catastrófico'

¿Cómo puedo averiguar qué procedimiento hace el error sucedió?

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; 

Respuesta

23

que pueda obtener la dirección de memoria donde la excepción fue lanzada por el uso de la variable ExceptAddr (unidad del sistema). Pero si quiere un seguimiento de la pila, puede usar una de las herramientas de 3rdParty, MadExcept, EurekaLog o JCLDebug de código abierto (parte del JCL).

+0

Hola Andy, bienvenido a SO ...! – Roddy

+0

Gracias - Acabo de recibir Eurekalog - funciona bien –

8

La forma más sencilla y rápida sería utilizar el apoyo JCL excepción y la depuración. Después de instalar el JCL, asegúrese de insertar los símbolos de depuración en el binario (Proyectos -> Experto en depuración JCL -> Insertar datos JDBG para este binario -> Habilitado) y agregue un cuadro de diálogo de excepción JCL al proyecto (Archivo -> Nuevo ... . -> Diálogos -> diálogo de excepción).

Si el instalador de JCL no puede agregar ese cuadro de diálogo al repositorio de objetos y no aparece (me pasó algunas veces), puede agregarlo manualmente copiando el archivo .pas y .dpr de jcl-install-dir\experts\debug\dialog en su proyecto y añadiendo manualmente, o cerca de Delphi, editar %DELHPIDIR%\bin\delphi32.dro en un editor de texto y añadir algo como esto a él (el ajuste de los caminos, por supuesto :)

 
[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= 
Cuestiones relacionadas