取得函数调用栈 - __builtin_frame_address

取得函数调用栈 - __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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值