C语言获取程序崩溃信号,打印调用栈backtrace、backtrace_symbols、addr2line
源程序
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <execinfo.h>void crashHandler(int signal)
{void *bt[20];int btSize = 20;char **btStrings;switch (signal){case SIGINT:printf("SIGINT Interactive attention signal. \n");break;case SIGILL:printf("SIGILL Illegal instruction. \n");break;case SIGABRT:printf("SIGABRT Abnormal termination. \n");break;case SIGFPE:printf("SIGFPE Erroneous arithmetic operation. \n");break;case SIGSEGV:printf("SIGSEGV Invalid access to storage. \n");break;case SIGTERM:printf("SIGTERM Termination request. \n");break;case SIGHUP:printf("SIGHUP Hangup. \n");break;case SIGQUIT:printf("SIGQUIT Quit. \n");break;case SIGTRAP:printf("SIGTRAP Trace/breakpoint trap. \n");break;case SIGKILL:printf("SIGKILL Killed. \n");break;case SIGBUS:printf("SIGBUS Bus error. \n");break;case SIGSYS:printf("SIGSYS Bad system call. \n");break;case SIGPIPE:printf("SIGPIPE Broken pipe. \n");break;case SIGALRM:printf("SIGALRM Alarm clock. \n");break;case SIGURG:printf("SIGURG Urgent data is available at a socket. \n");break;case SIGSTOP:printf("SIGSTOP Stop, unblockable. \n");break;case SIGTSTP:printf("SIGTSTP Keyboard stop. \n");break;case SIGCONT:printf("SIGCONT Continue. \n");break;case SIGCHLD:printf("SIGCHLD Child terminated or stopped. \n");break;case SIGTTIN:printf("SIGTTIN Background read from control terminal. \n");break;case SIGTTOU:printf("SIGTTOU Background write to control terminal. \n");break;case SIGPOLL:printf("SIGPOLL Pollable event occurred (System V). \n");break;case SIGXCPU:printf("SIGXCPU CPU time limit exceeded. \n");break;case SIGXFSZ:printf("SIGXFSZ File size limit exceeded. \n");break;case SIGVTALRM:printf("SIGVTALRM Virtual timer expired. \n");break;case SIGPROF:printf("SIGPROF Profiling timer expired. \n");break;case SIGUSR1:printf("SIGUSR1 User-defined signal 1. \n");break;case SIGUSR2:printf("SIGUSR2 User-defined signal 2. \n");break;case SIGWINCH:printf("SIGWINCH Window size change (4.3 BSD, Sun). \n");break;default:printf("unkown signal:%d\n", signal);break;}btSize = backtrace(bt, btSize);btStrings = backtrace_symbols(bt, btSize);for (int i = 0; i < btSize; i++){printf("%s\n", btStrings[i]);}exit(signal);
}void testCrash()
{int *a = 0;int aa = *a;printf("%d\n", aa);
}void main()
{signal(SIGSEGV, &crashHandler);printf("start\n");testCrash();printf("done\n");
}
编译指令
gcc -g crashHandle.c
运行结果
yeqiang@yeqiang-PC:~/tmp$ ./a.out
start
SIGSEGV Invalid access to storage.
./a.out() [0x40136b]
/lib/x86_64-linux-gnu/libc.so.6(+0x37970) [0x7fab38850970]
./a.out() [0x4013db]
./a.out() [0x40141e]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xeb) [0x7fab3883d09b]
./a.out() [0x4010ba]
获取0x4013db对应源码行
yeqiang@yeqiang-PC:~/tmp$ addr2line -e a.out -f 0x4013db
testCrash
/home/yeqiang/tmp/crashHandle.c:119
对应源码
注意事项:
编译时需要增加-g参数,否则addr2line不能得到对应源码行信息。但可以通过汇编分析代码大概位置。
汇编分析:
objdump -d a.out | grep 4013db -C10
C语言获取程序崩溃信号,打印调用栈backtrace、backtrace_symbols、addr2line相关推荐
- backtrace打印调用栈
目录 1.backtrace打印调用栈 2.addr2line 1.backtrace打印调用栈 https://blog.csdn.net/hejinjing_tom_com/article/det ...
- Android-Hal-C++打印调用栈
Android-Hal-C++打印调用栈 debuggerd是android的一个daemon进程,负责在进程出错异常时,将进程的运行时信息给dump出来供分析. debuggerd的core dum ...
- java打印堆栈信息linux,在C/C++程序里打印调用栈信息(转载)
原文出处 http://blog.csdn.net/yetyongjin/article/details/7759144 以下不能windows + mingw下执行. windows下参考 ht ...
- linux backtrack函数,Linux调用backtrack函数打印程序崩溃时的调用堆栈
可以给自己的程序都加上这个东西,便于快速的找到错误吧,看到别人都是这么用的 #include #include #include #include //signal 函数用法参考http://www. ...
- 使用Backtrace函数打印调用栈 - Debug居家必备
glibc提供了backtrace这个库函数,可以用来打印call stack.比如我们可以在程序中注册常见的一些signal,比如SIGSEGMENT, SIGPIPE,然后在这些信号的回调函数中, ...
- php 打印函数调用栈,利用backtrace和backtrace_symbols函数打印调用栈信息
本帖最后由 kylin_try 于 2017-2-6 08:41 编辑 在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈. #include int ...
- linux程序崩溃时调用链,Linux 获取并分析程序崩溃时的调用堆栈
下面是一个小例子,说明了程序出现段错误时,如何打印程序的堆栈信息. #include #include #include #include static void WidebrightSegvHand ...
- 如何获取当前C#程序所有线程的调用栈信息 ?
咨询区 Daniel Sperry 请问如何获取 .NET 程序当前所有线程的调用栈信息?我知道在 java 中只需调用 java.lang.Thread.getAllStackTraces() 方法 ...
- linux 函数中打印调用栈
一.内核中 To print the stack contents and a backtrace to the kernel log, use the #include <linux/kern ...
最新文章
- spring访问oracle数据库表,Spring访问oracle数据库配置步骤
- CUDA学习-函数前缀__global__
- 解决Kali Linux没有声音
- ADExchange2010 简单安装部署(二)
- SegmentFault 高阳:从开发者到创业者
- 分布与并行计算—生产者消费者模型RabbitMQ(Java)
- 南大电子机器人入驻云南_园区优秀企业| 中科恒清清淤机器人,以智能科技为水环境治理保驾护航...
- 【转】Quartz.NET快速入门指南
- 斐讯k2路由器刷第三方固件
- arcgis 经纬度转大地坐标_arcgis下平面坐标与大地坐标的转换
- JAVA WEB学习笔记(一)
- 科普类毕业论文文献包含哪些?
- performance API与页面首屏加载分析
- JAVA:实现求StandardDeviation标准差算法(附完整源码)
- 前端项目:从0开始实现一个合成大西瓜
- SSI服务端包含技术
- 云服务器如何修改操作系统,云服务器如何修改操作系统
- 为什么一买就跌一卖就涨,主力如何利用AI大数据击穿散户的心理防线?
- HDU2099 整除的尾数
- CSS3实现的线条波浪动画效果
热门文章
- 广播域+冲突域的区别
- NC 报销单根据日期和单据号排序
- 隔离霜和防晒霜一样吗?隔离霜和防晒霜的这5大区别你得知道!
- 使目标朝向摄像机,随着摄像机转动
- Android实战场景 - 限制EditText仅支持输入数字、英文、汉字,禁止输入表情等特殊符号
- 启用Hadoop集群垃圾箱配置
- 【Docker学习总结】12.Docker守护进程的配置和操作
- 无线网络边缘“遇上”分布式机器学习讲座:Machine Learning at the Wireless Edge
- edge浏览器如何把网页放到桌面_win10系统设置edge浏览器快捷方式放到桌面的操作方法...
- 涨知识!关于外贸单证知识,什么是单证一致!