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

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda