2008-11-03 24 views
15

Me gustaría mostrar un seguimiento de pila en un cuadro de diálogo de error en Delphi 2007 (Win32).Mostrar la pila de llamadas en una aplicación Delphi Win32

Idealmente, me gustaría algo como esto:

try 
    //do something 
except on e : exception do 
    begin 
    //rollback a transaction or whatever i need to do here  
    MessageDlg('An error has occurred!' + #13#10 + 
       e.Message + #13#10 + 
       'Here is the stack trace:' + #13#10 + 
       e.StackTrace,mtError,[mbOK],0); 
    end; //except 
end; /try-except 

Y para que la salida sea igual que la pila de llamadas en el IDE:

MYPROGRAM.SomeFunction 
MYPROGRAM.SomeProcedure 
MYPROGRAM.MYPROGRAM 
:7c817067 kernel32.RegisterWaitForInputIdle + 0x49 
+1

OT: Usaría ['sLineBreak'] (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_sLineBreak.html) en lugar de hardcoded' # 13 # 10'. –

Respuesta

23

madExcept tiene un método StackTrace (en la unidad madStackTrace) que hace eso.

JEDI Code Library ofrece una funcionalidad similar en la unidad JclDebug.

+5

madExcept no es gratuito para uso comercial. JclDebug es gratuito y de código abierto. También está EurekaLog (http://www.eurekalog.com/) –

+0

AFAIK, Eurekalog usa el código JEDI. –

+1

>>> Eurekalog utiliza el código JEDI Eso no es 100% correcto. Sí, EL incluye partes del código JCL, pero solo para el formato JDBG de soporte y problemas similares. El motor en sí está escrito desde cero. También EL usa su propio formato para la información de depuración (no JDBG). – Alex

8

Utilizamos Exceptional Magic y funciona muy bien para nosotros. Con ella se puede hacer algo como esto:

try 
    raise Exception.Create('Something bad happened...'); 
except 
    on e: Exception do begin 
     CallStack := TStringList.Create; 
     try 
      ExceptionHook.LogException; // Logs call stack 
      ExceptionHook.CallStack.Dump(CallStack); 
      ShowMessage(CallStack.Text); 
     finally 
      CallStack.Free; 
      end; 
     end; 
    end; 

Esto produce una pila de llamadas bastante detallada:

Exception 'Exception' in module BOAppTemplate.exe at 003F3C36 
Something bad happened... 

Module: BOAppUnit, Source: BOAppUnit.pas, Line 66 
Procedure: MyProcedure 

Call stack: 
:007F4C36 [BOAppTemplate.exe] MyProcedure (BOAppUnit.pas, line 66) 
:7C812AFB [kernel32.dll] 
:007F4C36 [BOAppTemplate.exe] MyProcedure (BOAppUnit.pas, line 66) 
:00404DF4 [BOAppTemplate.exe] System::__linkproc__ AfterConstruction 
Recursive call (2 times): 
:007F4C36 [BOAppTemplate.exe] MyProcedure (BOAppUnit.pas, line 66) 
:007F4CE6 [BOAppTemplate.exe] MyProcedure (BOAppUnit.pas, line 79) 
:007F4D22 [BOAppTemplate.exe] Boappunit::TBOAppForm::Button1Click (BOAppUnit.pas, line 82) 
:004604C2 [BOAppTemplate.exe] Controls::TControl::Click 
:004487FB [BOAppTemplate.exe] Stdctrls::TButton::Click 
:004488F9 [BOAppTemplate.exe] Stdctrls::TButton::CNCommand 
:0045FFBA [BOAppTemplate.exe] Controls::TControl::WndProc 

magia excepcional es de sólo $ 25, sin la fuente, por lo que es relativamente barato. ¡Espero que ayude!

Cuestiones relacionadas