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

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                  }

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

你可能感兴趣的:(20060815备忘——调用堆栈的获得)