博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

水龙卷

我是一个对自己进行debug的程序,所以行动迟缓些,不要见怪
  waterspout.cublog.cn

关于作者
姓名:何云龙
职业:Linux移动终端平台开发
介绍:走的更远些
|| << >> ||
我的分类


取得函数调用栈 - __builtin_frame_address

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)


发表于: 2007-08-08,修改于: 2007-08-08 14:00,已浏览406次,有评论0条 推荐 投诉


网友评论
 发表评论