当前位置: 首页 > news >正文

打印堆栈信息

在Linux系统中,你可以使用backtrace和backtrace_symbols函数来打印当前线程的调用堆栈。这两个函数都定义在execinfo.h头文件中。以下是使用这些函数的示例:

#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>void print_stack_trace() {void *array[10];char **strings;int size, i;// 获取当前的调用堆栈size = backtrace(array, 10);// 打印堆栈信息到标准输出backtrace_symbols_fd(array, size, STDOUT_FILENO);// 获取符号名称的数组,以便进一步处理strings = backtrace_symbols(array, size);if (strings != NULL) {// 打印调用堆栈for (i = 0; i < size; i++) {printf("%s\n", strings[i]);}free(strings);}
}

在实际使用中,backtrace函数会填充传入的数组(在这个例子中是array)来获取当前的调用堆栈的指针。backtrace_symbols函数会根据这个指针数组生成一个字符串数组,每个字符串包含对应于堆栈帧的一个可打印的符号名称。

在编译时,你可能需要添加-rdynamic选项来确保符号信息包含在可执行文件里,以便backtrace_symbols可以利用这些信息。例如:

gcc -o my_program my_program.c -rdynamic
需要提醒的是,上述函数通常无法提供解析过的函数名称和源代码行号。如果你需要更详细的信息,你可能需要使用额外的工具,例如addr2line命令,它可以将内存地址转换成源文件的行号和文件名。通常情况下,需要编译时带上-g用以生成调试信息。

addr2line -e my_program 0xaddress

这里0xaddress是你想要解析的十六进制堆栈地址。
对于复杂的调试任务,更强大的工具如Valgrind、GDB或IDE集成调试器等可能更为合适。


http://www.mrgr.cn/news/57805.html

相关文章:

  • 接口自动化-框架搭建(Python+request+pytest+allure)
  • Leetcode4:寻找两个正数数组中的中位数
  • C++:模板(2)
  • Unity 开发学习笔记(0):
  • logback-spring.xml 配置
  • 掌握ElasticSearch(三):探索核心概念——文档、索引、分片、倒排索引
  • python实现数据库的增删改查功能,图形化版本
  • 2019-2020 CSP-J C++普及组 第一题题解汇编
  • nginx 隐藏版本号与WEB服务器信息(yum)
  • 用户身份和访问管理是保障企业数字化转型的安全基石
  • 地平线港交所挂牌上市,开启智能驾驶新征程
  • EFCore pgsql Join 查询
  • 502 错误码通常出现在什么场景?
  • c语言指针详解2
  • Java开发者必备!0元学习Maven环境最新版超详细配置教程
  • 安全见闻(9)——开阔眼界,不做井底之蛙
  • 排序算法在最坏情况下的性能差异:深入分析
  • dcef文件下载--程序节排坑二
  • 【Java】SpringBoot实现MySQL数据库的增删查改
  • 【ROS2】在启动文件launch中,配置节点崩溃后自动重启
  • 编程中的注意事项
  • 打印一张A4纸多少钱?
  • 精品推荐 | StarPure石蜡包埋样本DNA提取试剂盒
  • Linux:sh脚本
  • 【读书笔记·VLSI电路设计方法解密】问题21:为什么降低芯片的功耗如此重要
  • vuetify页面布局