linux下backtrace函数获取函数调用堆栈信息用法

2023-10-31 03:44

本文主要是介绍linux下backtrace函数获取函数调用堆栈信息用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

backtrace用途介绍:

使用backtrace可以查看函数的调用关系,也可以查看程序异常时的函数调用关系。配置生成coredump生成文件的方法也可以捕获异常,但产生的coredump文件内存较大,backtrace函数的方法占用的内存小。

需求:查看函数Print1函数是哪个函数调用。

代码实现如下:

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <execinfo.h>#define BT_NUM 20void PrintBackTrace(int signal)
{void *pBuf[BT_NUM] = {0};int nCallbackFunCnt = backtrace(pBuf, BT_NUM);printf("Current backtrace layer = %d\n", nCallbackFunCnt);char **pCallbackFuncInfos = nullptr;pCallbackFuncInfos = backtrace_symbols(pBuf, nCallbackFunCnt);if (pCallbackFuncInfos == nullptr){/* code */printf("Get func backtrace error\n");return;}for (size_t i = 0; i < nCallbackFunCnt; i++){/* code */printf("bt #%02ld: %s\n", nCallbackFunCnt - i, pCallbackFuncInfos[i]);}free(pCallbackFuncInfos);pCallbackFuncInfos = nullptr;//exit(1);  //signal异常信号触发时使用
}void Print1()
{printf("11111111111111111111\n");PrintBackTrace(0);
}void Print2()
{printf("22222222222222222222\n");Print1();
}int main(int argc, char **argv)
{Print2();return 0;
}

生成可执行文件的命令如下

g++ -g -rdynamic -no-pie main.cpp -o main

执行可执行文件

./main

运行结果如下:

 查看bt#05层函数所在行,可以根据bt05层后面的地址0x401338查看,执行命令如下:

addr2line -e main 0x401338

运行结果如下:

附加:

关于backtrace的介绍和用法可以参考: 

Linux程序异常退出用backtrace定位分析_libbacktrace-CSDN博客

 拒绝超大coredump - 用backtrace和addr2line搞定异常函数栈 - 知乎 (zhihu.com)

这篇关于linux下backtrace函数获取函数调用堆栈信息用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

python版本切换工具pyenv的安装及用法

《python版本切换工具pyenv的安装及用法》Pyenv是管理Python版本的最佳工具之一,特别适合开发者和需要切换多个Python版本的用户,:本文主要介绍python版本切换工具pyen... 目录Pyenv 是什么?安装 Pyenv(MACOS)使用 Homebrew:配置 shell(zsh

C#如何在Excel文档中获取分页信息

《C#如何在Excel文档中获取分页信息》在日常工作中,我们经常需要处理大量的Excel数据,本文将深入探讨如何利用Spire.XLSfor.NET,高效准确地获取Excel文档中的分页信息,包括水平... 目录理解Excel中的分页机制借助 Spire.XLS for .NET 获取分页信息为什么选择 S

Java中的CompletableFuture核心用法和常见场景

《Java中的CompletableFuture核心用法和常见场景》CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过... 目录1、引言2. 基本概念3. 创建 CompletableFuture3.1. 手动创建3.2.

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

Linux镜像文件制作方式

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

springboot的controller中如何获取applicatim.yml的配置值

《springboot的controller中如何获取applicatim.yml的配置值》本文介绍了在SpringBoot的Controller中获取application.yml配置值的四种方式,... 目录1. 使用@Value注解(最常用)application.yml 配置Controller 中