backtrace打印调用栈
目录
- 1、backtrace打印调用栈
- 2、addr2line
1、backtrace打印调用栈
https://blog.csdn.net/hejinjing_tom_com/article/details/90767359 参考博客
SYNOPSIS
#include <execinfo.h>
//获取函数调用栈,地址存入buffer数组,size为实际个数
int backtrace(void **buffer, int size);//将调用地址转化为字符串,字符串会被malloc,但也会在stacktrace 分配的内存块下.
char **backtrace_symbols(void *const *buffer, int size);// backtrace_symbols_fd与backtrace_symbols 函数具有相同的功能,不同的是它不会给调用者返回字符串数 组,而是将结果写入文件描述符为fd的文件中,每个函数对应一行.它不需要调用malloc函数,因此适用于有可能调 用该函数会失败的情况
void backtrace_symbols_fd(void *const *buffer, int size, int fd);
测试文件
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>void fun1();
void fun2();
void print_backtrace();int main()
{fun1();exit(EXIT_SUCCESS);
}void fun1()
{fun2();
}void fun2()
{print_backtrace();
}void print_backtrace()
{#define MAX_STACK_SIZE 32int size = MAX_STACK_SIZE;void * array[MAX_STACK_SIZE];
//获取函数调用栈,并把地址存入array数组, 返回实际个数int stack_num = backtrace(array, size);
//将调用地址转化为字符串,字符串会被malloc,但也会在stacktrace 分配的内存块下.
// 可见backtrace_symbols 这个函数需要很好的管理内存.char ** stacktrace = backtrace_symbols(array, stack_num);for (int i = 0; i < stack_num; ++i){printf("%s\n", stacktrace[i]);}
//释放函数分配的内存,这会连分条目字符串也一块释放,分条目字符串也在这块内存之下!free(stacktrace);
}
执行结果
g++ backtrace.c -g //编译命令加 -g 不然解栈信息文件名会解析不出来./a.out
./a.out() [0x400723]
./a.out() [0x4006fb]
./a.out() [0x4006f0]
./a.out() [0x4006dd]
/lib64/libc.so.6(__libc_start_main+0x100) [0x7fdcd7a05d20]
./a.out() [0x400619]
解栈信息
c++filt 用来还原C++编译后的函数名
addr2line -e ./a.out 0x400619 0x4006dd 0x4006f0 0x4006fb 0x400723 -f|c++filt
_start
??:0
main
/home/233391/eclipse/backtrace.c:22
fun1()
/home/233391/eclipse/backtrace.c:28
fun2()
/home/233391/eclipse/backtrace.c:32
print_backtrace()
/home/233391/eclipse/backtrace.c:41
2、addr2line
NAMEaddr2line - convert addresses into file names and line numbers.SYNOPSISaddr2line [-a|--addresses]在函数名、文件和行号信息之前,显示地址,以十六进制形式。[-b bfdname|--target=bfdname]指定目标文件的格式为bfdname[-C|--demangle[=style]]将低级别的符号名解码为用户级别的名字[-e filename|--exe=filename]指定需要转换地址的可执行文件名。[-f|--functions]在显示文件名、行号输出信息的同时显示函数名信息[-s|--basename]仅仅显示每个文件名的基址(即不显示文件的具体路径,只显示文件名)。[-i|--inlines]如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息[-p|--pretty-print]使得该函数的输出信息更加人性化:每一个地址的信息占一行[-j|--section=name]给出的地址代表指定section的偏移,而非绝对地址。[-H|--help] [-V|--version][addr addr ...]
backtrace打印调用栈相关推荐
- 关于ceph源码 backtrace 打印函数调用栈
当集中精力看一个问题的时候,时间久了就会有这样一个状态,天空飘来五个字,那都不算事 ceph源码庞大的体量以及复杂的设计让很多人望而却步,尤其是大量的纯虚函数更是让读者迷失在代码的海洋,这个时候函数调 ...
- Android-Hal-C++打印调用栈
Android-Hal-C++打印调用栈 debuggerd是android的一个daemon进程,负责在进程出错异常时,将进程的运行时信息给dump出来供分析. debuggerd的core dum ...
- php 打印函数调用栈,利用backtrace和backtrace_symbols函数打印调用栈信息
本帖最后由 kylin_try 于 2017-2-6 08:41 编辑 在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈. #include int ...
- 使用Backtrace函数打印调用栈 - Debug居家必备
glibc提供了backtrace这个库函数,可以用来打印call stack.比如我们可以在程序中注册常见的一些signal,比如SIGSEGMENT, SIGPIPE,然后在这些信号的回调函数中, ...
- backtrace - 线程调用栈
backtrace函数 1.函数原型 #include <execinfo.h> int backtrace(void **buffer, int size); 该函数获取当前线程的调用堆 ...
- c/c++ backtrace打印函数调用栈
效果 解析动态库libtest.so和可执行文件m: 打印原始栈 #include <execinfo.h> void *array[32] = {0};size_t size;char ...
- java打印堆栈信息linux,在C/C++程序里打印调用栈信息(转载)
原文出处 http://blog.csdn.net/yetyongjin/article/details/7759144 以下不能windows + mingw下执行. windows下参考 ht ...
- linux 函数中打印调用栈
一.内核中 To print the stack contents and a backtrace to the kernel log, use the #include <linux/kern ...
- C语言获取程序崩溃信号,打印调用栈backtrace、backtrace_symbols、addr2line
源程序 #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <execin ...
最新文章
- 【安装PHP】如何在openSUSE42.1下编译安装PHP7
- js createElement appendChild createTextNode用法
- C++STL常用查找算法
- c语言输入整数要求输出字符,求C语言 将输入整数转换成字符串输出!
- cuda 核函数 for循环_【CUDA 基础】4.4 核函数可达到的带宽
- ipa去除时间锁_Java中的锁以及sychronized实现机制(十)
- C++字符串的不同存放类型 (string/char[])
- oracle blob update,Oracle数据库中对BLOB数据的操作问题
- 来讨论一下这些常见的 Redis 面试题
- coreldraw x4怎么会蓝屏_电脑蓝屏怎么办 七种方案轻松搞定【图文】
- html中css层叠样式表(行内样式,内嵌式,外部式)
- 李广难封–有感于团队建设
- JavaScript 运算符
- 历史影像高清晰历史卫星影像
- linux 重命名文件夹
- 5G推动下,XR的需求“爆发”会来自B端还是C端?
- 《系统集成项目管理》第七章 项目范围管理
- 计算机义务维修事迹材料,学雷锋义务维修电脑活动策划书与学雷锋事迹材料:身边的榜样合集.doc...
- 中国大学MOOC C语言程序设计(大连理工大学) 课后编程题 第十三周题解(个人向仅供参考)
- B2G:来自Web平台的挑战者