I'd like to display a stack trace in an error dialog in Delphi 2007 (Win32).
我想在Delphi 2007(Win32)的错误对话框中显示堆栈跟踪。
Ideally, I'd like something like this:
理想情况下,我喜欢这样的事情:
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
And for the output to be like the Call Stack in the IDE:
并且输出与IDE中的调用堆栈类似:
MYPROGRAM.SomeFunction
MYPROGRAM.SomeProcedure
MYPROGRAM.MYPROGRAM
:7c817067 kernel32.RegisterWaitForInputIdle + 0x49
3 个解决方案
#1
23
madExcept has a method StackTrace (in unit madStackTrace) that does that.
madExcept有一个方法StackTrace(在单元madStackTrace中)可以做到这一点。
JEDI Code Library offers similar functionality in unit JclDebug.
JEDI代码库在JclDebug单元中提供类似的功能。
#2
8
We use Exceptional Magic and it works really well for us. With it you can do something like this:
我们使用Exceptional Magic,它对我们非常有用。有了它你可以做这样的事情:
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;
This yields a pretty detailed call stack:
这会产生一个非常详细的调用堆栈:
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
Exceptional Magic is only $25 without the source, so it's relatively cheap. Hope that helps!
Exceptional Magic只有25美元没有来源,所以它相对便宜。希望有所帮助!
#3
4
You may be interested in this article: "New Exception class in Delphi 2009 and above".
您可能对本文感兴趣:“Delphi 2009及更高版本中的新异常类”。
#1
23
madExcept has a method StackTrace (in unit madStackTrace) that does that.
madExcept有一个方法StackTrace(在单元madStackTrace中)可以做到这一点。
JEDI Code Library offers similar functionality in unit JclDebug.
JEDI代码库在JclDebug单元中提供类似的功能。
#2
8
We use Exceptional Magic and it works really well for us. With it you can do something like this:
我们使用Exceptional Magic,它对我们非常有用。有了它你可以做这样的事情:
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;
This yields a pretty detailed call stack:
这会产生一个非常详细的调用堆栈:
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
Exceptional Magic is only $25 without the source, so it's relatively cheap. Hope that helps!
Exceptional Magic只有25美元没有来源,所以它相对便宜。希望有所帮助!
#3
4
You may be interested in this article: "New Exception class in Delphi 2009 and above".
您可能对本文感兴趣:“Delphi 2009及更高版本中的新异常类”。