在Linux程序中输出函数调用栈
2015-06-24 14:54
716 查看
程序发生异常时,将函数的调用栈打印出来,可以大大提高定位效率。Linux中提供了三个函数用来获取调用栈:
/* 获取函数调用栈 */ int backtrace(void **buffer, int size); /* 将调用栈中的函数地址转化为函数名称 并返回一个字符串数组 */ char **backtrace_symbols(void *const *buffer, int size); /* 将调用栈中的函数地址转化为函数名称 并将其定入到文件中 */ void backtrace_symbols_fd(void *const *buffer, int size, int fd);示例代码:
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
/* 打印调用栈的最大深度 */
#define DUMP_STACK_DEPTH_MAX 16
/* 打印调用栈函数 */
void dump_trace() {
void *stack_trace[DUMP_STACK_DEPTH_MAX] = {0};
char **stack_strings = NULL;
int stack_depth = 0;
int i = 0;
/* 获取栈中各层调用函数地址 */
stack_depth = backtrace(stack_trace, DUMP_STACK_DEPTH_MAX);
/* 查找符号表将函数调用地址转换为函数名称 */
stack_strings = (char **)backtrace_symbols(stack_trace, stack_depth);
if (NULL == stack_strings) {
printf(" Memory is not enough while dump Stack Trace! \r\n");
return;
}
/* 打印调用栈 */
printf(" Stack Trace: \r\n");
for (i = 0; i < stack_depth; ++i) {
printf(" [%d] %s \r\n", i, stack_strings[i]);
}
/* 获取函数名称时申请的内存需要自行释放 */
free(stack_strings);
stack_strings = NULL;
return;
}
/* 测试函数 2 */
void test_meloner() {
dump_trace();
return;
}
/* 测试函数 1 */
void test_hutaow() {
test_meloner();
return;
}
/* 主函数 */
int main(int argc, char *argv[]) {
test_hutaow();
return 0;
}源文件下载:链接编译时需要加上-rdynamic参数,以得到符号名称,像下面这样:
gcc -rdynamic backtrace.c -o backtrace执行./backtrace运行程序,输出如下:
相关文章推荐
- Linux原始套接字实现分析
- linux下eclipse交叉开发环境搭建
- linux下安装svn记录
- linux操作系统-设置静态ip
- Linux 可执行文件结构与进程结构
- Linux编译安装 简版
- 详解Linux安装GCC方法(下载、解压缩、安装、卸载)
- 我在阿里云Linux服务器上的第一次操作
- linux邮箱系统sendmail惊魂
- [转]Linux中设置服务自启动的三种方式
- epoll 底层实现源码分析
- Linux下配置DHCP服务器
- 与linux相处的日子里
- 从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
- 解决隐式声明与内建函数不兼容问题
- Linux系统编程——进程管理
- linux下ctrl+alt+down和eclipse的复制快捷键冲突
- Centos: Screen tips
- 如何在Linux服务器中隐藏PHP版本
- centos学习(之一)-centos6.6环境搭建