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

【Linux在程序运行时打印调用栈信息(函数名,文件行号等)】

  • 在程序运行时打印相关调用栈信息(函数名,文件行号等),便于梳理调用逻辑等
//stack.c
#include <stdio.h>
#include <execinfo.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>#define MAX_FRAMES   128
#define BUFFER_SIZE  512// 函数:打印函数调用栈
void PrintStackTrace()
{// 用于存储调用栈帧的地址void *callstack[MAX_FRAMES];// 获取当前调用栈中的函数帧数int frames = backtrace(callstack, MAX_FRAMES);// 如果帧数小于等于0,则表示获取调用栈失败if (frames <= 0){fprintf(stderr, "Failed to retrieve backtrace\n");return;}// 获取调用栈中每个函数对应的符号名char **strs = backtrace_symbols(callstack, frames);if (strs == NULL){fprintf(stderr, "Failed to retrieve backtrace symbols\n");return;}// 打印函数调用栈信息printf("Stack trace:\n");for (int i = 0; i < frames; ++i){// 查找符号名中的地址部分char *address = strchr(strs[i], '[');if (address != NULL){// 将地址部分替换为字符串结束符,以获取纯地址字符串*address = '\0';++address;// 构造命令,使用 addr2line 工具获取地址对应的函数名char command[BUFFER_SIZE];snprintf(command, BUFFER_SIZE, "addr2line -f -e ./stack %s", address);// 执行命令,并读取输出结果FILE *fp = popen(command, "r");if (fp != NULL){char buffer[BUFFER_SIZE];while (fgets(buffer, BUFFER_SIZE, fp) != NULL){// 打印每行输出结果printf("  %s", buffer);}// 关闭命令输出流pclose(fp);}else{// 执行命令失败时输出错误消息fprintf(stderr, "Failed to execute addr2line command\n");}}}// 释放 backtrace_symbols 函数分配的内存free(strs);
}void Bar()
{PrintStackTrace();
}void Foo()
{Bar();
}int main()
{Foo();return 0;
}
  • 编译、执行:
gcc -g stack.c -o stack -rdynamic
./stack
  • result

在这里插入图片描述

http://www.lryc.cn/news/329368.html

相关文章:

  • 9.包和工具【go】
  • 判断一个字符串是否是真实手机号:JavaScript
  • 3D检测:从pointnet,voxelnet,pointpillar到centerpoint
  • 使用canvas内置api完成图片的缩放平移和导出和添加提示
  • 数据结构——二叉树——堆
  • 算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)
  • 状态模式详解:管理对象状态的利器
  • 探索----------------阿里云
  • Tidb和MySQL性能简单测试对比
  • 2024.2.6力扣每日一题——魔塔游戏
  • C# OAuth单点登录的实现
  • AtCoder Beginner Contest 347 (ABCDEF题)视频讲解
  • 【vue2+antvx6】报错Cannot read properties of undefined (reading ‘toUpperCase‘)
  • 主流的开发语言、环境及其特点
  • Android知识 - 代码混淆ProGuard规则介绍
  • 【Linux的进程篇章 - 冯诺依曼的体系结构】
  • flask-(数据连接池的使用,定制命令,信号的使用,表关系的建立和查询)
  • 设计模式学习笔记 - 设计模式与范式 -行为型:2.观察者模式(下):实现一个异步非阻塞的EventBus框架
  • 数据挖掘|贝叶斯分类器及其Python实现
  • Linux文件(系统)IO(含动静态库的链接操作)
  • CI/CD实战-jenkins结合ansible 7
  • 内网渗透-(黄金票据和白银票据)详解(一)
  • 学习transformer模型-Dropout的简明介绍
  • 游戏引擎中的大气和云的渲染
  • 华为鲲鹏云认证考试内容有哪些?华为鲲鹏云认证考试报名条件
  • v3-admin-vite 改造自动路由,view页面自解释Meta
  • FIFO存储器选型参数,结构原理,工艺与注意问题总结
  • jvm高级面试题-2024
  • DeepL Pro3.1 下载地址及安装教程
  • 第十一届 “MathorCup“- B题:基于机器学习的团簇能量预测及结构全局寻优方法