调用堆栈:不使用调试器查看堆栈的调用情况的方法

BS CSDN写了半天居然说丢就丢了

这次直接帖代码了

不大调了三个小时自己有必要在强化下对指针理解:(

原理:时候会建立栈帧其大致存放如下

压栈传入参数2

压栈传入参数1

------------------------

返回时地址

------------------------

栈帧

-----------------------

局部变量1

局部变量2

注意:上面表示内存方式为上面是高地址下面为低地址堆栈生长方向向下

ebp保存当前栈帧 当前栈帧指向内存里面存放栈帧紧接着就是返回地址

根据这个原则编写代码如下:


# GetCurFrame( r )__asm mov r , ebp
# GetNextFrame( m , r )r = ((void**)m)[0]
# GetRetIns( m , r )r = ((void**)m)[1]

long Array[8];

void ShowFrame(long * npIns, nDeep )
{
i =0;
long* nCurFrame;
long* nNextFrame;
long* nRetIns;

GetCurFrame(nCurFrame);

for (i =0; i<nDeep; i)
{
GetNextFrame(nCurFrame,nNextFrame);
GetRetIns(nCurFrame,nRetIns);

npIns[i*2] = (long)nNextFrame;
npIns[i*2 +1] = (long)nRetIns;
nCurFrame = nNextFrame;

prf(\"\\nStack Frame\\t:0x%08x\\r\\n\",npIns[i*2]);
prf(\"\\nIns Ret At\\t:0x%08x\\r\\n\",npIns[i*2+1]);
}
;
}

栈帧存放在npIns偶索引返回地址存放在对应奇索引

由于中无法知道链接器和加载器所使用符号表无法在

直接返回地址转换为需要使用外部工具Addr2line 将返回地址转化为

Tags:  实时调试器 串口调试器 调试器 调用堆栈

延伸阅读

最新评论

发表评论