Delphi怎的打印函数调用堆栈信息

Delphi怎样打印函数调用堆栈信息
我想问下,在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