源程序

#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相关推荐

  1. backtrace打印调用栈

    目录 1.backtrace打印调用栈 2.addr2line 1.backtrace打印调用栈 https://blog.csdn.net/hejinjing_tom_com/article/det ...

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

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

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

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

  4. linux backtrack函数,Linux调用backtrack函数打印程序崩溃时的调用堆栈

    可以给自己的程序都加上这个东西,便于快速的找到错误吧,看到别人都是这么用的 #include #include #include #include //signal 函数用法参考http://www. ...

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

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

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

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

  7. linux程序崩溃时调用链,Linux 获取并分析程序崩溃时的调用堆栈

    下面是一个小例子,说明了程序出现段错误时,如何打印程序的堆栈信息. #include #include #include #include static void WidebrightSegvHand ...

  8. 如何获取当前C#程序所有线程的调用栈信息 ?

    咨询区 Daniel Sperry 请问如何获取 .NET 程序当前所有线程的调用栈信息?我知道在 java 中只需调用 java.lang.Thread.getAllStackTraces() 方法 ...

  9. linux 函数中打印调用栈

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

最新文章

  1. spring访问oracle数据库表,Spring访问oracle数据库配置步骤
  2. CUDA学习-函数前缀__global__
  3. 解决Kali Linux没有声音
  4. ADExchange2010 简单安装部署(二)
  5. SegmentFault 高阳:从开发者到创业者
  6. 分布与并行计算—生产者消费者模型RabbitMQ(Java)
  7. 南大电子机器人入驻云南_园区优秀企业| 中科恒清清淤机器人,以智能科技为水环境治理保驾护航...
  8. 【转】Quartz.NET快速入门指南
  9. 斐讯k2路由器刷第三方固件
  10. arcgis 经纬度转大地坐标_arcgis下平面坐标与大地坐标的转换
  11. JAVA WEB学习笔记(一)
  12. 科普类毕业论文文献包含哪些?
  13. performance API与页面首屏加载分析
  14. JAVA:实现求StandardDeviation标准差算法(附完整源码)
  15. 前端项目:从0开始实现一个合成大西瓜
  16. SSI服务端包含技术
  17. 云服务器如何修改操作系统,云服务器如何修改操作系统
  18. 为什么一买就跌一卖就涨,主力如何利用AI大数据击穿散户的心理防线?
  19. HDU2099 整除的尾数
  20. CSS3实现的线条波浪动画效果

热门文章

  1. 广播域+冲突域的区别
  2. NC 报销单根据日期和单据号排序
  3. 隔离霜和防晒霜一样吗?隔离霜和防晒霜的这5大区别你得知道!
  4. 使目标朝向摄像机,随着摄像机转动
  5. Android实战场景 - 限制EditText仅支持输入数字、英文、汉字,禁止输入表情等特殊符号
  6. 启用Hadoop集群垃圾箱配置
  7. 【Docker学习总结】12.Docker守护进程的配置和操作
  8. 无线网络边缘“遇上”分布式机器学习讲座:Machine Learning at the Wireless Edge
  9. edge浏览器如何把网页放到桌面_win10系统设置edge浏览器快捷方式放到桌面的操作方法...
  10. 涨知识!关于外贸单证知识,什么是单证一致!