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. day4 递归原理及解析

    递归 递归是一种调用自身的方法,在函数执行过程中重复不断的调用自身的过程,递归的规模每次都要缩小,一般前一步的程序作为后一步的参数.但是必须有递归结束条件. 递归算法是一种直接或者间接地调用自身算法的 ...

  2. CentOS7 安装 chrome-gnome-shell

    1.download https://gitlab.gnome.org/GNOME/chrome-gnome-shell 2.安装cmake和jq yum install -y cmake yum i ...

  3. Codeforces Round #278 (Div. 1) D - Conveyor Belts 分块+dp

    D - Conveyor Belts 思路:分块dp, 对于修改将对应的块再dp一次. #include<bits/stdc++.h> #define LL long long #defi ...

  4. centOS7.0配置防火墙

    之前用的iptables来管理的防火墙,后来发现centOS7.0中已经用firewalld取代iptables了,于是与时俱进,停用了iptables. systemctl stop iptable ...

  5. 解决centOS7的IP为127.0.0.1,无法用Xshll链接问题

    对于linux不熟悉的我, 安装完centOS7后好多坑,走一步卡一步,记得之前安装其他版本没这么多事.安装完后用ifconfig查看IP,竟然是127.0.0.1,这我就不知道怎么用Xshell链接 ...

  6. overflow:scroll 在 iOS上滚动不流畅的问题

    添加下面属性: -webkit-overflow-scrolling: touch;

  7. js基本数据类型 BigInt 和 Number 的区别

    今天在做LeetCode的一到 “加一” 的题,题目如下 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除 ...

  8. Xcode 7.0正式版发布了

    Xcode 7.0正式版发布了     下载地址:链接: http://pan.baidu.com/s/1FNkPS 密码: ee42     本文由大学霸整理,转载请注明出处,尊重IT人!

  9. TCP的那些事-2

    这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇<TCP的那些事儿(上)> 上篇中,我们介绍了TCP的协议头.状态机.数据重传中的东西.但是TCP要解决一个很大的事,那就是要 ...

  10. 腾讯后台研发暑期实习offer经历

    昨晚看到腾讯校招的微信状态,一颗心终于落下来了,终于可以去梦寐以求的鹅厂工作了.想想这一个多月以来,心情就像过山车一样,此起彼伏,一会充满希望,一会又跌入谷底. 三月份的时候,听说腾讯可以内推了,我内 ...