使用backtrace和backtrace_symbols打印函数调用链
来源:互联网 发布:淘宝外围会场有用吗 编辑:程序博客网 时间:2024/05/22 14:42
代码来源:http://man7.org/linux/man-pages/man3/backtrace.3.html
#include <execinfo.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>void myfunc3(void){ int j, nptrs;#define SIZE 100 void *buffer[100]; char **strings; nptrs = backtrace(buffer, SIZE); printf("backtrace() returned %d addresses\n", nptrs); /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) * would produce similar output to the following: */ strings = backtrace_symbols(buffer, nptrs); if (strings == NULL) { perror("backtrace_symbols"); exit(EXIT_FAILURE); } for (j = 0; j < nptrs; j++) printf("%s\n", strings[j]); free(strings);}static void /* "static" means don't export the symbol... */ myfunc2(void){ myfunc3();}void myfunc(int ncalls){ if (ncalls > 1) myfunc(ncalls - 1); else myfunc2();}int main(int argc, char *argv[]){ if (argc != 2) { fprintf(stderr, "%s num-calls\n", argv[0]); exit(EXIT_FAILURE); } myfunc(atoi(argv[1])); exit(EXIT_SUCCESS);}
编译需要带上-rdynamic选项
$ cc -rdynamic prog.c -o prog
运行结果
$ ./prog 3 backtrace() returned 8 addresses ./prog(myfunc3+0x5c) [0x80487f0] ./prog [0x8048871] ./prog(myfunc+0x21) [0x8048894] ./prog(myfunc+0x1a) [0x804888d] ./prog(myfunc+0x1a) [0x804888d] ./prog(main+0x65) [0x80488fb] /lib/libc.so.6(__libc_start_main+0xdc) [0xb7e38f9c] ./prog [0x8048711]
注意函数myfunc2使用了static
在编译时候被优化掉了
打印的调用链里没有myfunc2函数
0 0
- 使用backtrace和backtrace_symbols打印函数调用链
- backtrace 和 backtrace_symbols 打印函数调用关系
- 利用backtrace和backtrace_symbols打印函数的调用关系
- 利用backtrace和backtrace_symbols打印函数的调用关系
- 利用backtrace和backtrace_symbols打印函数的调用关系
- 利用backtrace和backtrace_symbols函数打印调用栈信息
- 利用backtrace和backtrace_symbols打印函数的调用关系
- 利用backtrace和backtrace_symbols函数打印调用栈信息
- 利用backtrace和backtrace_symbols函数打印调用栈信息
- 【程序中打印调用栈信息方法】 backtrace和backtrace_symbols函数
- 使用backtrace和backtrace_symbols追踪段错
- 使用backtrace打印函数调用栈
- backtrace backtrace_symbols
- 使用Backtrace函数打印调用栈 - Debug居家必备
- 使用Backtrace函数打印调用栈 - Debug居家必备
- 利用backtrace函数打印函数调用栈
- linux打印当前函数调用栈backtrace
- backtrace&&backtrace_symbols 查找段错误 打印堆栈信息
- 【深度探索C++对象模型读书笔记】【第7章】站在对象模型的尖端
- struts2接收参数的几种形式
- STM32串口悬空导致CPU持续进入中断函数
- C#中的线程 -- 线程入门
- poj_1062
- 使用backtrace和backtrace_symbols打印函数调用链
- 文章标题
- SSD 之Trim指令
- Android设置透明、半透明等效果
- hdoj 2603 Wiskey's Power 【物理题。。。】
- POJ 3368 Frequent values(线段树)
- 改进型Clock算法
- linux进程调度CFS
- 通过分析 JDK 源代码研究 Hash 存储机制