如何在程序中得到调用堆栈?
就象在调试时按 ctrl + alt + s那样,显示出调用的函数堆栈
不知道能不能实现?
[解决办法]
汗,我按ctrl + alt + s没反应
[解决办法]
我还没有到那个级别,帮顶
[解决办法]
可以。
这是我抄别的人,没有深入研究:
看看高人是怎么说的:
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.
[解决办法]
不错
[解决办法]
参看开源的XAM和商业的EurekaLog这个
[解决办法]
什么呀