Delphi怎的打印函数调用堆栈信息
Delphi怎样打印函数调用堆栈信息
我想问下,在Delphi中怎样在出异常后打印出函数调用堆栈,包括行号,函数名。
我知道Eurekalog有这个的完整功能,我想自己实现一套,看了下Eurekalog的源码,功能太复杂,没搞明白。
有谁有自己实现这一套的代码吗?
------解决方案--------------------
这个是系统级的东西了。。。。
每个函数执行后,首先往一个stack压入直接的函数名——行号似乎都没有直接的办法能得到
------解决方案--------------------
调试时调试窗口不就能查看栈信息了,你是要自己写调试器跟踪器么?有啥意义嘛?
// 用断言来获得行号这是最简单的,也可以自己扩展异常类
我想问下,在Delphi中怎样在出异常后打印出函数调用堆栈,包括行号,函数名。
我知道Eurekalog有这个的完整功能,我想自己实现一套,看了下Eurekalog的源码,功能太复杂,没搞明白。
有谁有自己实现这一套的代码吗?
Delphi
栈
异常
堆栈
------解决方案--------------------
这个是系统级的东西了。。。。
每个函数执行后,首先往一个stack压入直接的函数名——行号似乎都没有直接的办法能得到
------解决方案--------------------
调试时调试窗口不就能查看栈信息了,你是要自己写调试器跟踪器么?有啥意义嘛?
// 用断言来获得行号这是最简单的,也可以自己扩展异常类
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Test(Sender: TClass; i: Integer; str: string);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
procName: ShortString;
procedure ErrorProc(const msg, fileName: string; lineNum: Integer; errorAddr: Pointer);
var
li: TStringList;
begin
li := TStringList.Create;
try
li.Add('程序出现错误,相关信息:');
li.Add('所在文件: ' + fileName);
li.Add('所在行号: ' + IntToStr(lineNum));
li.Add('所在函数: ' + procName);
li.Add('函数地址: $' + IntToHex(Integer(errorAddr), 8));
li.Add('______________________________________________________' + #10);
li.Add('是否终止程序?');
if Application.MessageBox(PChar(li.Text), PChar(msg), MB_OKCANCEL + MB_ICONWARNING +
MB_DEFBUTTON2) = IDOK then