在Linux程序中输出函数调用栈

30 篇文章 1 订阅
29 篇文章 1 订阅

在Linux程序中输出函数调用栈

程序发生异常时,将函数的调用栈打印出来,可以大大提高定位效率。

Linux中提供了三个函数用来获取调用栈:

示例代码:

 

编译时需要加上-rdynamic参数,以得到符号名称,像下面这样:

执行./backtrace运行程序,输出如下:

dump_stack_with_backtrace

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 下,程序崩溃后可以通过调用信息来帮助我们定位问题。我们可以使用一些工具和技术来获取程序崩溃时的调用信息。 1. 使用 GDB 调试器 GDB 是一个功能强大的调试器,在程序崩溃时可以用它来获取调用信息。我们可以在终端使用以下命令来使用 GDB 调试器: ``` gdb <程序名> ``` 进入 GDB 调试器后,可以使用 `bt` 命令来打印当前的调用信息。 2. 使用 Core Dump 文件 Core Dump 文件是程序崩溃时产生的一种文件,它可以包含程序崩溃时的状态信息,包括调用信息。我们可以使用一些工具来分析 Core Dump 文件,比如 GDB 或者 Valgrind 工具。 在 Linux ,可以使用以下命令来开启 Core Dump 文件的生成: ``` ulimit -c unlimited ``` 这个命令会将 Core Dump 文件的大小设置为无限制,这样当程序崩溃时就会生成 Core Dump 文件。 3. 使用 backtrace() 函数 在程序崩溃时,我们可以使用 backtrace() 函数来获取当前的调用信息。这个函数定义在 execinfo.h 头文件,使用时需要链接 libexecinfo 库。 backtrace() 函数的原型如下: ```c int backtrace(void **buffer, int size); ``` 第一个参数是一个指向 void* 类型的数组,用来存储调用信息;第二个参数是数组的大小,用来控制 backtrace() 函数最多返回多少个调用帧的信息。 在程序崩溃时,我们可以在程序的信号处理函数调用 backtrace() 函数来获取当前的调用信息,然后输出到日志文件。 4. 使用 libunwind 库 libunwind 是一个开源的 C/C++ 库,用于获取当前线程的调用信息。它可以在程序崩溃时获取调用信息,也可以在程序运行时获取调用信息。 使用 libunwind 库时,我们需要在程序链接 libunwind 库,并且包含 libunwind.h 头文件。然后,我们可以使用 libunwind 库的函数来获取当前线程的调用信息,例如: ```c #include <libunwind.h> void print_backtrace() { unw_cursor_t cursor; unw_context_t context; // 获取当前线程的上下文信息 unw_getcontext(&context); // 初始化 cursor unw_init_local(&cursor, &context); // 遍历调用帧,输出每个帧的信息 while (unw_step(&cursor) > 0) { unw_word_t ip; unw_get_reg(&cursor, UNW_REG_IP, &ip); printf("%lx\n", (long)ip); } } ``` 上面的代码,我们定义了一个函数 `print_backtrace()`,它可以输出当前线程的调用信息。使用时,我们只需要在程序崩溃时调用这个函数即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值