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

相关文章

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与