取得函数调用栈 - __builtin_frame_address (2007-08-08 13:39)
GCC提供了两个内置函数用来在运行时取得函数调用栈中的返回地址和框架地址
如果使用glibc 2.1或更新版本,可以使用backtrace()函数,参看<execinfo.h>,其他系统可能有不同的技术支持。
Built-in Function: void * __builtin_return_address (unsigned int level) Built-in Function: void * __builtin_frame_address (unsigned int level) |
一个例子
#include <memory.h> #include <stdlib.h> #include <stdio.h> #include <signal.h> #include <ucontext.h> #include <dlfcn.h> #include <execinfo.h> void showBacktrace() { void * ret = __builtin_return_address(1); printf("ret address [%x]\n", ret); void * caller = __builtin_frame_address(0); printf("call address [%x]\n", caller); #ifdef __cplusplus Dl_info dlinfo; void *ip = ret; if(!dladdr(ip, &dlinfo)) { perror("addr not found\n"); return; } const char *symname = dlinfo.dli_sname; int f = 0; fprintf(stderr, "% 2d: %p %s+%u (%s)\n", ++f, ip, symname, 0, // (unsigned)(ip - dlinfo.dli_saddr), dlinfo.dli_fname); #endif } int MyFunc_A() { showBacktrace(); return 10; } int MyFunc_B() { return MyFunc_A(); } int main() { MyFunc_B(); return 0; } |
$ g++ t.cpp -rdynamic -ldl -o t
$ ./t
ret address [80488ff]
call address [bfffb938]
1: 0x80488ff _Z8MyFunc_Bv+0 (./t)
原文地址:http://blog.chinaunix.net/space.php?uid=20593827&do=blog&id=1918421