目录

  • 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打印调用栈相关推荐

  1. 关于ceph源码 backtrace 打印函数调用栈

    当集中精力看一个问题的时候,时间久了就会有这样一个状态,天空飘来五个字,那都不算事 ceph源码庞大的体量以及复杂的设计让很多人望而却步,尤其是大量的纯虚函数更是让读者迷失在代码的海洋,这个时候函数调 ...

  2. Android-Hal-C++打印调用栈

    Android-Hal-C++打印调用栈 debuggerd是android的一个daemon进程,负责在进程出错异常时,将进程的运行时信息给dump出来供分析. debuggerd的core dum ...

  3. php 打印函数调用栈,利用backtrace和backtrace_symbols函数打印调用栈信息

    本帖最后由 kylin_try 于 2017-2-6 08:41 编辑 在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈. #include int ...

  4. 使用Backtrace函数打印调用栈 - Debug居家必备

    glibc提供了backtrace这个库函数,可以用来打印call stack.比如我们可以在程序中注册常见的一些signal,比如SIGSEGMENT, SIGPIPE,然后在这些信号的回调函数中, ...

  5. backtrace - 线程调用栈

    backtrace函数 1.函数原型 #include <execinfo.h> int backtrace(void **buffer, int size); 该函数获取当前线程的调用堆 ...

  6. c/c++ backtrace打印函数调用栈

    效果 解析动态库libtest.so和可执行文件m: 打印原始栈 #include <execinfo.h> void *array[32] = {0};size_t size;char ...

  7. java打印堆栈信息linux,在C/C++程序里打印调用栈信息(转载)

    原文出处  http://blog.csdn.net/yetyongjin/article/details/7759144 以下不能windows + mingw下执行.  windows下参考 ht ...

  8. linux 函数中打印调用栈

    一.内核中 To print the stack contents and a backtrace to the kernel log, use the #include <linux/kern ...

  9. C语言获取程序崩溃信号,打印调用栈backtrace、backtrace_symbols、addr2line

    源程序 #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <execin ...

最新文章

  1. 【安装PHP】如何在openSUSE42.1下编译安装PHP7
  2. js createElement appendChild createTextNode用法
  3. C++STL常用查找算法
  4. c语言输入整数要求输出字符,求C语言 将输入整数转换成字符串输出!
  5. cuda 核函数 for循环_【CUDA 基础】4.4 核函数可达到的带宽
  6. ipa去除时间锁_Java中的锁以及sychronized实现机制(十)
  7. C++字符串的不同存放类型 (string/char[])
  8. oracle blob update,Oracle数据库中对BLOB数据的操作问题
  9. 来讨论一下这些常见的 Redis 面试题
  10. coreldraw x4怎么会蓝屏_电脑蓝屏怎么办 七种方案轻松搞定【图文】
  11. html中css层叠样式表(行内样式,内嵌式,外部式)
  12. 李广难封–有感于团队建设
  13. JavaScript 运算符
  14. 历史影像高清晰历史卫星影像
  15. linux 重命名文件夹
  16. 5G推动下,XR的需求“爆发”会来自B端还是C端?
  17. 《系统集成项目管理》第七章 项目范围管理
  18. 计算机义务维修事迹材料,学雷锋义务维修电脑活动策划书与学雷锋事迹材料:身边的榜样合集.doc...
  19. 中国大学MOOC C语言程序设计(大连理工大学) 课后编程题 第十三周题解(个人向仅供参考)
  20. B2G:来自Web平台的挑战者

热门文章

  1. 线性代数——求给定向量组的极大线性无关组
  2. Android12 WebView无法播放视频的问题 浏览器暂不支持播放该格式
  3. 自学python三个月能做什么兼职_自学Python能干些什么副业
  4. 2022-大脑与认知科学-台湾交通大学-黃植懋
  5. dataframe 时间戳转日期
  6. CATransaction
  7. 用渲染农场【渲染101】渲染的地产动画效果如何
  8. 一次性弄懂马尔可夫模型、隐马尔可夫模型、马尔可夫网络和条件随机场!
  9. 写标书的时候,有一些内容实在没有材料或者不会写怎么办
  10. 【win10】如何非乱码打开.db文件