2008-11-03 8 views
15

Chciałbym wyświetlić ślad stosu w oknie dialogowym błędu w Delphi 2007 (Win32).Wyświetl stos wywołań w aplikacji Delphi Win32

Idealnie, chciałbym coś takiego:

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 

I wyjście być jak stos wywołań w IDE:

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

OT: użyję [ 'sLineBreak'] (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_sLineBreak.html) zamiast ustalony' # 13 # 10'. –

Odpowiedz

23

madExcept ma metodę StackTrace (w jednostce madStackTrace), który to robi.

JEDI Code Library oferuje podobną funkcjonalność w jednostce JclDebug.

+5

madExcept nie jest darmowy do użytku komercyjnego. JclDebug jest bezpłatny i open source. Istnieje również EurekaLog (http://www.euraalog.com/) –

+0

AFAIK, Eurekalog używa kodu JEDI. –

+1

>>> Eurekalog używa kodu JEDI To nie jest w 100% poprawne. Tak, EL zawiera części kodu JCL, ale tylko dla obsługującego format JDBG i podobnych problemów. Sam silnik jest napisany od zera. Ponadto EL używa własnego formatu do informacji o debugowaniu (nie JDBG). – Alex

8

Używamy Exceptional Magic i działa to bardzo dobrze dla nas. Dzięki niemu można zrobić coś takiego:

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; 

To daje dość szczegółowy stosu wywołań:

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 

Wyjątkowa Magic to tylko 25 $ bez źródła, więc jest to stosunkowo tani. Mam nadzieję, że pomaga!