__builtin_return_address(LEVEL)函数解释和运行实战

      gcc默认不支持__builtin_return_address(LEVEL)的参数为非0。好像只支持参数为0。
1、__builtin_return_address(0)的含义是,得到当前函数返回地址,即此函数被别的函数调用,然后此函数执行完毕后,返回,所谓返回地址就是那时候的地址。
2、__builtin_return_address(1)的含义是,得到当前函数的调用者的返回地址。注意是调用者的返回地址,而不是函数起始地址。

3、实战

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
 
#define MAX_LEVEL 4
void sigfunc(int signo)
{
    printf("%s(0): %p\n", __func__, __builtin_return_address(0));
    exit(1);
}
 
int b()
{
    printf("%s(0): %p\n", __func__, __builtin_return_address(0));
    printf("%s(1): %p\n", __func__, __builtin_return_address(1));
    while(1)
    {
        sleep(1);
    }
}
 
int a(int temp)
{
    temp += 1;
    printf("%s(0): %p\n", __func__, __builtin_return_address(0));
 
    b();
 
    return temp;
}
 
int main()
{
	signal(SIGINT, sigfunc);
	a(123);
 
    return 0;
}

执行后:
a(0): 0x400675
b(0): 0x400653
b(1): 0x400675
^Csigfunc(0): 0x30bda33140

用gdb调试:
gdb e
...
(gdb) l *0x400675
0x400675 is in main (e.c:37).
32    int main()
33    {
34        signal(SIGINT, sigfunc);
35        a(123);
36    
37        return 0;
38    }

 文字部分转载自:__builtin_return_address(LEVEL)函数解释

代码部分转载自:用__builtin_return_address获得程序运行栈情况

  • 0
    点赞
  • 2
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值