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

2024-04-01 11:20

本文主要是介绍【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

在这里插入图片描述

这篇关于【Linux在程序运行时打印调用栈信息(函数名,文件行号等)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/867035

相关文章

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

pandas使用apply函数给表格同时添加多列

《pandas使用apply函数给表格同时添加多列》本文介绍了利用Pandas的apply函数在DataFrame中同时添加多列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、Pandas使用apply函数给表格同时添加多列二、应用示例一、Pandas使用apply函

在C#中调用Windows防火墙界面的常见方式

《在C#中调用Windows防火墙界面的常见方式》在C#中调用Windows防火墙界面(基础设置或高级安全设置),可以使用进程启动(Process.Start)或Win32API来实现,所以本文给大家... 目录引言1. 直接启动防火墙界面(1) 打开基本防火墙设置(firewall.cpl)(2) 打开高

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

Python中Namespace()函数详解

《Python中Namespace()函数详解》Namespace是argparse模块提供的一个类,用于创建命名空间对象,它允许通过点操作符访问数据,比字典更易读,在深度学习项目中常用于加载配置、命... 目录1. 为什么使用 Namespace?2. Namespace 的本质是什么?3. Namesp

python调用dubbo接口的实现步骤

《python调用dubbo接口的实现步骤》本文主要介绍了python调用dubbo接口的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录 ​​其他实现方式与注意事项​​ ​​高级技巧与集成​​用 python 提供 Dubbo 接口

Linux下屏幕亮度的调节方式

《Linux下屏幕亮度的调节方式》文章介绍了Linux下屏幕亮度调节的几种方法,包括图形界面、手动调节(使用ACPI内核模块)和外接显示屏调节,以及自动调节软件(CaliseRedshift和Reds... 目录1 概述2 手动调节http://www.chinasem.cn2.1 手动屏幕调节2.2 外接显

Linux(centos7)虚拟机没有IP问题及解决方案

《Linux(centos7)虚拟机没有IP问题及解决方案》文章介绍了在CentOS7中配置虚拟机网络并使用Xshell连接虚拟机的步骤,首先,检查并配置网卡ens33的ONBOOT属性为yes,然后... 目录输入查看ZFhrxIP命令:ip addr查看,没有虚拟机IP修改ens33配置文件重启网络Xh

linux实现对.jar文件的配置文件进行修改

《linux实现对.jar文件的配置文件进行修改》文章讲述了如何使用Linux系统修改.jar文件的配置文件,包括进入文件夹、编辑文件、保存并退出编辑器,以及重新启动项目... 目录linux对.jar文件的配置文件进行修改第一步第二步 第三步第四步总结linux对.jar文件的配置文件进行修改第一步进