不使用调试器查看堆栈的调用情况(CallTrace)
来源:互联网 发布:网站防sql注入 编辑:程序博客网 时间:2024/05/24 07:46
转自:http://www.xue5.com/itedu/200707/127638.html
程序不大,调了三个小时,自己有必要在强化下对指针的理解:(
原理:函数调用的时候会建立栈帧,其大致存放如下
压栈传入的参数2
压栈传入的参数1
------------------------
函数返回时的地址
------------------------
栈帧-----------------------
局部变量1
局部变量2
注意:上面表示的内存方式为上面是高地址,下面为低地址。堆栈的生长方向向下。
ebp保存当前栈帧 ,当前栈帧指向的内存里面存放调用函数的栈帧,紧接着的就是返回地址
根据这个原则编写代码如下:
#define GetCurFrame( r )__asm mov r , ebp
#define GetNextFrame( m , r )r = ((void**)m)[0]
#define GetRetIns( m , r )r = ((void**)m)[1]
long Array[8];
void ShowFrame(long * npIns,int nDeep )
{
int 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;
printf("\nStack Frame\t:0x%08x\r\n",npIns[i*2]);
printf("\nIns Ret At\t:0x%08x\r\n",npIns[i*2+1]);
}
return;
}
栈帧存放在 npIns的偶索引,函数的返回地址存放在对应的奇索引。
由于程序中无法知道链接器和加载器所使用的符号表,无法在程序中
直接函数返回地址转换为函数名。需要使用外部工具,Addr2line 将函数返回地址转化为函数名。
- 不使用调试器查看堆栈的调用情况(CallTrace)
- 不使用调试器查看堆栈的调用情况(CallTrace)
- Visual studio如何使用“调用堆栈窗口”查看调试信息
- 使用dbghelp获取调用堆栈--release下的调试方法
- 使用dbghelp获取调用堆栈--release下的调试方法
- 函数调用时堆栈的变化情况
- 使用InspectiveC来查看调用堆栈
- XZ_iOS之崩溃信息的查看,调用堆栈的调试技巧
- 调试之堆栈的使用
- go 代码的调试---打印调用堆栈
- Linux下查看Java进程的运行期间堆栈情况
- Call Stack技巧(调用堆栈调试)
- Call Stack技巧(调用堆栈调试)
- 调试之调用堆栈
- 函数调用堆栈变化情况
- 函数调用堆栈变化情况
- updateHeaderShade调用堆栈情况分析
- 查看端口的使用情况
- asp.net 中文Cookie乱码问题
- joj 1004: Octal Fractions
- POJ 1051 P,MTHBGWB 简单字符串转换
- 真男人 最自然
- 习题(字节顺序)
- 不使用调试器查看堆栈的调用情况(CallTrace)
- 检测不了的错误(2) --- 分析
- android的Android 中Intent和PendingIntent的区别(转)
- java基础整理4--面向对象
- 实现最小高度,兼容Ie6,点击图片后留下的边框纹纹,块级元素浮动
- UIScrollView相关属性属性
- 中软国际java 笔试 面试题
- 【转】动态sql语句基本语法
- 怎么偶的分这么少啊