c语言exit退出前打印堆栈

打印堆栈函数

#include <stdio.h>
#include <stdlib.h>
#include <execinfo.h> // backtrace, backtrace_symbols

void print_stack_trace(void) {
    void *trace[16];
    char **messages = NULL;
    int i, trace_size = 0;

    trace_size = backtrace(trace, 16);
    messages = backtrace_symbols(trace, trace_size);
    printf("[bt] Execution path:\n");
    for (i = 0; i < trace_size; i++)
        printf("[bt] %s\n", messages[i]);
}

void foo(void) {
    print_stack_trace();
}

int main(int argc, char **argv) {
    foo();
    return 0;
}

注册 exit handler

《LINUX 系统编程》

 

系统调用 atexit() 是由 POSIX 1003.1-2001 所定义,Linux 也实现了该函数。它是用来注册一些在进程结束时要调用的函数:

#include <stdlib.h>

int atexit (void (*function)(void));

atexit() 调用成功时,会注册指定的函数作为终止函数,在程序正常结束时(即进程通过调用 exit() 或从 main() 函数返回)运行。如果进程调用了 exec 函数(exec函数族,用于在当前进程中执行一个新的程序),会清空所注册的函数列表(这些函数不再存在于新进程的地址空间中)。通过信号结束的进程也不会调用这些注册的函数。

指定函数必须是无参的,且没有返回值。函数形式如下:

void my_function (void);

函数调用的顺序和注册的顺序相反。也就是说,这些函数是存储在栈中,以后进先出的方式被调用(LIFO)。注册的函数不能调用 exit(),否则会导致递归调用死循环。如果需要提前结束进程,应该调用 _exit()。

POSIX 标准要求 atexit() 至少支持注册 ATEXIT_MAX 个注册函数,而且这个值至少是32.具体的最大值可以通过 sysconf() 得到,参数是 _SC_ATEXIT_MAX:

#include <unistd.h> // sysconf
#include <stdlib.h> // _SC_ATEXIT_MAX

long atexit_max = sysconf (_SC_ATEXIT_MAX);
printf ("atexit_max=%ld\n", atexit_max);

成功时,atexit() 返回 0。错误时,返回 -1。

 进一步解析堆栈信息

利用 addr2line 工具打印代码具体行数  -e 指定执行程序 -f 打印函数名称和具体行数

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tobybo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值