您的位置:程序门 -> delphi -> windows sdk/api



如何在程序中得到调用堆栈?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


如何在程序中得到调用堆栈?
发表于:2007-04-23 13:38:20 楼主
就象在调试时按   ctrl   +   alt   +   s那样,显示出调用的函数堆栈
不知道能不能实现?
发表于:2007-04-23 14:07:551楼 得分:0
汗,我按ctrl   +   alt   +   s没反应
发表于:2007-11-21 21:55:452楼 得分:0
我还没有到那个级别,帮顶
发表于:2007-11-22 11:00:333楼 得分:0
可以。

这是我抄别的人,没有深入研究:
看看高人是怎么说的:
http://blog.csdn.net/linzhengqun/archive/2007/07/13/1688690.aspx    

unit   unit1;

interface

uses
    windows,   messages,   sysutils,   variants,   classes,   graphics,   controls,   forms,
    dialogs,   stdctrls;

type
    pstackframe   =   ^tstackframe;

    tstackframe   =   record
        prevframe   :   pstackframe;
        calleraddr:   pointer;
    end;

    tform1   =   class(tform)
        button1:   tbutton;
        button2:   tbutton;
        listbox1:   tlistbox;
        procedure   button1click(sender:   tobject);
        procedure   button2click(sender:   tobject);
    private
        {   private   declarations   }
    public
        {   public   declarations   }
    end;

var
    form1:   tform1;

implementation

{$r   *.dfm}

procedure   tform1.button1click(sender:   tobject);
var
    m_sbase:   pstackframe;
    m_stop   :   pointer;
begin
    asm
        mov   m_sbase,   ebp;
        mov   m_stop   ,   esp;
    end;

    while   (dword(m_sbase)   <   dword(m_stop^))   do
    begin
        listbox1.items.add(format('0x00%u',   [longint(m_sbase.calleraddr)]));
        m_sbase:=   m_sbase.prevframe;
    end;
end;

procedure   tform1.button2click(sender:   tobject);
var
    p:   pchar;
begin
    p:=   nil;
    p^:=   'a';
end;

end.
发表于:2007-11-25 13:18:244楼 得分:0
不错
发表于:2007-11-25 21:59:005楼 得分:0
参看开源的xam和商业的eurekalog这个


快速检索

最新资讯
热门点击