CG@CPPBLOG

/*=========================================*/
随笔 - 76, 文章 - 39, 评论 - 137, 引用 - 0
数据加载中……

20060815备忘——调用堆栈的获得

调用堆栈的获得:
     54:进入函数时,会调用 link a6 指令,将A6压栈,再将栈顶指针存入A6,退出函数做相反操作。
     VC(debug):进入函数时,会调用 push ebp ;mov ebp, esp,同54原理。退出函数做相反操作。
     以 VC 为例,说明调用堆栈的获得。
     ebp-+     +--------------------+
         |     |    . . . . . .     |
         |     +--------------------+
         +---  |         sp1        |---+
               +--------------------+   |
               |         pc1        |   |
               +--------------------+   |
               |    . . . . . .     |   |
               +--------------------+   |
          +--- |         sp2        |---+
          |    +--------------------+
          |    |         pc2        |
          |    +--------------------+
          |    |    . . . . . .     |
 
        获得 pc 指针的操作:
 1                 void GetCallStack()
 2                 {
 3                     unsigned int reg_bp;
 4                     unsigned int pc;
 5                     __asm{
 6                         mov [reg_bp],ebp
 7                     };
 8                     unsigned int *pbp = (unsigned int *)reg_bp;
 9                     printf("Call stack:\n");
10                     do{
11                         pbp = (unsigned int *)(*pbp);
12                         pc = *(pbp+1);
13                         printf("\t 0x%08x\n",pc);
14                     }while(pc);
15                 }

          若想得到函数名需要反查调试信息表。

posted on 2007-12-17 21:14 cuigang 阅读(523) 评论(0)  编辑 收藏 引用 所属分类: Windows


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理