Linux调用栈获取分析及实现(3)

#include <stdio.h>    #include <string.h>    #include <execinfo.h>       /* 获取ebp寄存器值 */   void get_ebp(unsigned long *ebp)   {           __asm__ __volatile__("mov %%ebp, %0 \r\n"                    :"=m"(*ebp)                    ::"memory");      }      int my_backtrace(void **stack, int size, unsigned long ebp)   {           int layer = 0;       while(layer < size && ebp != 0 && *(unsigned long*)ebp != 0 && *(unsigned long *)ebp != ebp)       {               stack[layer++] = *(unsigned long *)(ebp+4);               ebp = *(unsigned long*)ebp;       }          return layer;   }      int func_3(int a, int b, int c)   {          void *stack_addr[10];          int layer;          int i;          char **ppstack_funcs;             /* 通过调用libc函数实现 */          layer = backtrace(stack_addr, 10);          ppstack_funcs = backtrace_symbols(stack_addr, layer);          for(i = 0; i < layer; i++)                printf("\n%s:%p\n", ppstack_funcs[i], stack_addr[i]);             /* 自己实现 */          unsigned long ebp = 0;          get_ebp(&ebp);          memset(stack_addr, 0, sizeof(stack_addr));          layer = my_backtrace(stack_addr, 10, ebp);          for(i = 0; i < layer; i++)                printf("\nmy: %p\n", stack_addr[i]);           free(ppstack_funcs);        return 3;   }      int func_int(int a, int b, int c, int d)   {           int aa,bb,cc;           int ret= func_3(aa,bb,cc);           return (a+ b+ c+ d + ret);   }      int func_str()   {           int a = 1, b = 2;           int ret;              ret = func_int(a, a, b, b);              return ret;   }      int B(int c, int d)   {           return c+d;   }      int A(int a, int b)   {           int c = 0xff, d = 0xffff;           return B(c, d);   }         int main(int argc, char *argv[])   {           int ret = func_str();           return 0;   }  

 

程序编译加上-rdynaminc  

 

否则获取调用栈只有地址,没有函数名信息。  

运行结果: 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwgszw.html