C语言写的程序跑飞了,怎样打印出函数调用链呢?

linux_dev_framework软件包中的trace_exception_test.c就是一个实现演示样例。

该程序有益产生一个内存訪问异常,然后打出调用链。

程序源代码:

/* 
 * 本软件为免费、开源软件。
 * 本软件的版权(包含源代码及二进制公布版本号)归一切公众全部。  * 您能够自由使用、传播本软件。
 * 您也能够以不论什么形式、不论什么目的使用本软件(包含源代码及二进制公布版本号),而不受不论什么版权限制。
 * =====================
 * 作者: 孙明保
 * 邮箱: sunmingbao@126.com
 */ #include <stdio.h>
#include "debug.h"
#include "trace_exception.h" //以下的代码有益产生一个内存訪问异常
static int a;
int __attribute__((noinline)) gen_SIGSEGV(int *bad_pointer)
{
    DBG_PRINT("==");     a = *bad_pointer;
    return a;
} int __attribute__((noinline)) SIGSEGV_test(int para)
{
    DBG_PRINT("==");     return gen_SIGSEGV(NULL)+para;
} int __attribute__((noinline)) main(int argc, char *argv[])
{
    DBG_PRINT("==");     trace_exception_init();
    SIGSEGV_test(555);
    return 0;
}

执行效果:

[root@localhost ~]# cd linux-dev-framework
[root@localhost ~]# make
...
[root@localhost linux-dev-framework]# ./target/trace_exception_test.exe  ***********************
*******EXCEPTION*******
***********************
[program]:/root/linux_dev_framework/target/trace_exception_test.exe
received signal 11 (SIGSEGV).
The process will exit. pc=0x080497bd access invalid mem addr=0x00000000
value of general regs:
GS =0x00000033 FS =0x00000000 ES =0x0000007b DS =0x0000007b
EDI =0x00000000 ESI =0x00000000 EBP =0xbfd82328 ESP =0xbfd82310
EBX =0x007dfff4 EDX =0xbfd82264 ECX =0xbfd822f8 EAX =0x00000000
TRAPNO =0x0000000e ERR =0x00000004 EIP =0x080497bd CS =0x00000073
EFL =0x00010292 UESP =0xbfd82310 SS =0x0000007b function call links:
0x080497bd - gen_SIGSEGV+45 (/root/linux_dev_framework/target/trace_exception_test.exe)
0x08049806 - SIGSEGV_test+54 (/root/linux_dev_framework/target/trace_exception_test.exe)
0x0804984e - main+62 (/root/linux_dev_framework/target/trace_exception_test.exe) stack contents:
bfd82310 : e2 b9 04 08 ac b9 04 08 13 00 00 00 07 ba 04 08 : ****************
bfd82320 : 34 23 d8 bf f4 ff 7d 00 48 23 d8 bf 06 98 04 08 : 4#****}*H#******
bfd82330 : 00 00 00 00 ac b9 04 08 1b 00 00 00 fa b9 04 08 : ****************
bfd82340 : f4 ff 7d 00 00 00 00 00 68 23 d8 bf 4e 98 04 08 : **}*****h#**N***
bfd82350 : 2b 02 00 00 ac b9 04 08 22 00 00 00 f5 b9 04 08 : +*******"*******
bfd82360 : e0 b8 04 08 00 00 00 00 e8 23 d8 bf c6 fc 66 00 : *********#****f*
bfd82370 : 01 00 00 00 14 24 d8 bf 1c 24 d8 bf 00 d0 7c b7 : *****$***$****|*
bfd82380 : f4 6f 80 00 ff ff ff ff c4 5f 65 00 e0 8c 04 08 : *o*******_e*****
bfd82390 : 01 00 00 00 d0 23 d8 bf e5 57 64 00 b0 6a 65 00 : *****#***Wd**je*
bfd823a0 : 80 d3 7c b7 f4 ff 7d 00 00 00 00 00 00 00 00 00 : **|***}*********
bfd823b0 : e8 23 d8 bf 9f 3c c5 1f e0 cb 7a 62 00 00 00 00 : *#***<****zb****
bfd823c0 : 00 00 00 00 00 00 00 00 01 00 00 00 d0 96 04 08 : ****************
bfd823d0 : 00 00 00 00 f0 b9 64 00 eb fb 66 00 c4 5f 65 00 : ******d***f**_e*
bfd823e0 : 01 00 00 00 d0 96 04 08 00 00 00 00 f1 96 04 08 : ****************
bfd823f0 : 10 98 04 08 01 00 00 00 14 24 d8 bf e0 b8 04 08 : *********$******
bfd82400 : d0 b8 04 08 20 62 64 00 0c 24 d8 bf 00 00 00 00 : **** bd**$******
bfd82410 : 01 00 00 00 e5 27 d8 bf 00 00 00 00 07 28 d8 bf : *****'*******(**
bfd82420 : 20 28 d8 bf 3f 28 d8 bf 4f 28 d8 bf 5a 28 d8 bf : (**? (**O(**Z(**
bfd82430 : 68 28 d8 bf 7e 28 d8 bf 8b 28 d8 bf a9 28 d8 bf : h(**~(***(***(**
bfd82440 : b3 28 d8 bf b2 2d d8 bf cf 2d d8 bf e9 2d d8 bf : *(***-***-***-**
bfd82450 : a4 2e d8 bf b5 2e d8 bf d3 2e d8 bf e4 2e d8 bf : *.***.***.***.**
bfd82460 : ef 2e d8 bf 22 2f d8 bf 39 2f d8 bf 41 2f d8 bf : *.**"/**9/**A/**
bfd82470 : 4c 2f d8 bf 59 2f d8 bf 73 2f d8 bf 7f 2f d8 bf : L/**Y/**s/***/**
bfd82480 : a1 2f d8 bf b6 2f d8 bf 00 00 00 00 20 00 00 00 : */***/****** ***
bfd82490 : 14 b4 35 00 21 00 00 00 00 b0 35 00 10 00 00 00 : **5*!*****5*****
bfd824a0 : ff fb eb 0f 06 00 00 00 00 10 00 00 11 00 00 00 : ****************
bfd824b0 : 64 00 00 00 03 00 00 00 34 80 04 08 04 00 00 00 : d*******4*******
bfd824c0 : 20 00 00 00 05 00 00 00 08 00 00 00 07 00 00 00 : ***************
bfd824d0 : 00 00 00 00 08 00 00 00 00 00 00 00 09 00 00 00 : ****************
bfd824e0 : d0 96 04 08 0b 00 00 00 00 00 00 00 0c 00 00 00 : ****************
bfd824f0 : 00 00 00 00 0d 00 00 00 00 00 00 00 0e 00 00 00 : ****************
bfd82500 : 00 00 00 00 17 00 00 00 00 00 00 00 19 00 00 00 : ****************

本程序的完整源代码在linux-dev-framework源代码包中。

linux-dev-framework源代码包的介绍:

http://blog.csdn.net/crazycoder8848/article/details/22491525

SIGSEGV异常时打印函数调用链的更多相关文章

  1. AOP之拦截函数调用链实现

    AOP之拦截函数调用链实现 定义函数A,B,C,调用A->B->C,这样就形成了函数静态调用链,而AOP要做的是能动态的添加多个B,形成A->B1->B2->B3...- ...

  2. NullPointerException异常没有异常栈打印问题追踪

    今天去服务器后台看日志,发现有很多NullPointerException异常.我下意识的找异常栈,想看下到底是哪行代码导致了空指针.但是发现日志中只打印出了如下日志: null java.lang. ...

  3. Android 中调试手段 打印函数调用栈信息

    下面来简单介绍下 android 中的一种调试方法. 在 android 的 app 开发与调试中,经常需要用到打 Log 的方式来查看函数调用点. 这里介绍一种方法来打印当前栈中的函数调用关系 St ...

  4. 编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]

    前言 自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过.迄今为止,CLR异常机制让人关注最多的一点就是“效率”问题.其实,这里存在认识上的误区,因为正常控制流程下的代码运行并不会出现问题, ...

  5. 编写高质量代码改善C#程序的157个建议——建议60:重新引发异常时使用Inner Exception

    建议60:重新引发异常时使用Inner Exception 当捕获了某个异常,将其包装或重新引发异常的时候,如果其中包含了Inner Exception,则有助于程序员分析内部信息,方便代码调试. 以 ...

  6. 在linux代码中打印函数调用的堆栈的方法

    之前一直有这样的需求,当时问到,也没搜到方法,现在竟然既问到了,也搜到了,哎,世事真是不能强求啊! 在Linux内核调试中,经常用到的打印函数调用堆栈的方法非常简单,只需在需要查看堆栈的函数中加入: ...

  7. 出现异常时直接把e输出比输出e.getMessage()好得多

    之前研究态度不好,出异常时处理草草了事,今天出现问题才觉得该认真对待每个分支.

  8. tomcat不能多次startup.sh,异常时直接,分析logs目录下的日志。

    tomcat不能多次startup.sh,异常时直接干掉其进程. 分析logs目录下的日志.

  9. linux下系统对于sigsegv错误时的处理

    一般来讲,对非法地址的访问会导致应用程序收到由系统发送的sigsegv信号,默认情况下,函数对于这个信号的处理是退出. 但是为了方便调试,我们可以自己设置处理函数,使用signal函数. 这里比较重要 ...

随机推荐

  1. RabbitMQ指南之二:工作队列(Work Queues)

    在上一章的指南中,我们写了一个命名队列:生产者往该命名队列发送消息.消费从从该命名队列中消费消息.在本章中,我们将创建一个工作队列,用于在多个工作者之间分配耗时的任务.工作队列(即任务队列)的主要思想 ...

  2. linux命令---查找文件中的内容

    linux命令---查找文件中的内容   [yang@localhost ~]$ cat 1.txt |egrep '123456789|second'-------匹配123456789或者seco ...

  3. LR参数和变量

    一.参数: 1. 在LR函数中可以直接使用参数.参数必须在双引号“”中才能应用.大部分情况下,可以直接用参数代替函数中双引号内的数据.如下使用方法: lr_save_string("http ...

  4. CentOS7 logstash配置部署

    (1)logstash介绍 `Logstash是一个开源的数据收集引擎,可以水平伸缩,而且logstash是整个ELK当中拥有最多插件的一个组件,其可以接收来自不同源的数据并统一输入到指定的且可以是不 ...

  5. eclipse 创建 maven 项目时如何修改 web 的版本和 jdk 的版本

    eclipse 创建 maven 项目时如何修改 web 的版本和 jdk 的版本 在使用 eclipse 创建 maven 项目的时候,默认的 web.xml 的版本时 2.3,默认 jre 的版本 ...

  6. HTML5实战与剖析之跨文档消息传递(iframe传递信息)

    在来自不同域名的页面间传递消息一般统称为跨文档消息传送,简称XDM.如,www.leemagnum.com域中的页面与位于一个内嵌框架中的http://blog.csdn.net/lee_magnum ...

  7. Docker CentOS 网段与公司网段冲突

    参考文章: <Docker修改默认地址172.17.0.1> 在公司内网的一个虚拟服务器(CentOS 7)安装Docker后,发现网段172.18.0.1和172.17.0.1与公司内部 ...

  8. PHP原理之变量

    作者: Laruence(   ) 本文地址: http://www.laruence.com/2008/08/22/412.html 转载请注明出处 或许你知道,或许你不知道,PHP是一个弱类型,动 ...

  9. ref:mysql命令大全

    Mysql常用命令行大全 ref:https://www.cnblogs.com/bluealine/p/7832219.html 1)查看表结构:desc table_name; 2)查看创建表的s ...

  10. CodeForces 785C Anton and Fairy Tale

    二分. 如果$n≤m$,显然只能$n$天. 如果$n>m$,至少可以$m$天,剩余还可以支撑多少天,可以二分计算得到,也可以推公式.二分计算的话可能爆$long$ $long$,上了个$Java ...