关于C/C++ 异常定位的一些小小心得

hello 大家好,我又回来了,今天想跟大家分享一点有关程序崩溃的一些经验。我们知道C++捕获的异常往往是自己已经定义好的,但是真正的错误层出不穷,往往还没等你捕捉到,程序就已经崩溃了,所以保留有关程序异常的信息就尤为重要。可问题是我怎么知道程序什么时候会崩溃,然后把信息保留呢?这就需要一个工具,就是信号(signal)

我把一些常用的信号及其类型摆在了下面

#define _NSIG             16    //能够使用的信号的数量 

#define SIGHUP             1    // 挂起 
#define SIGINT             2    // 中断 (DEL) 
#define SIGQUIT            3    // 退出 (ASCII FS) 
#define SIGILL             4    // 非法指令 
#define SIGTRAP            5    // 跟踪中断 (捕捉的时候没有重置) 
#define SIGABRT            6    // IOT 指令 
#define SIGIOT             6    // 终止使用PDP-11 
#define SIGUNUSED          7    // 备用代码 
#define SIGFPE             8    // 浮点型异常 
#define SIGKILL            9    // kill (不能捕获或忽略) 
#define SIGUSR1           10    // 用户定义信号 # 1 
#define SIGSEGV           11    // 内存段异常 
#define SIGUSR2           12    // 用户定义信号 # 2 
#define SIGPIPE           13    // 在管道上写操作没有其他的读操作 
#define SIGALRM           14    // 警告 
#define SIGTERM           15    // kill后获得软件终止信号 

#define SIGEMT             7    // 旧式 
#define SIGBUS            10    // 旧式 

/* POSIX 要求定义下面的信号, 即使它们不被支持. 这里给出这些定义, 但是它们不被支持. */
#define SIGCHLD           17    // 子进程终止或停止 
#define SIGCONT           18    // 如果停止则继续 
#define SIGSTOP           19    // 停止信号 
#define SIGTSTP           20    // 交互式停止信号 
#define SIGTTIN           21    // 后台进程试图读 
#define SIGTTOU           22    // 后台进程试图写 

你们可能会觉得很疑惑,这是用来干嘛的?其实是这样的,因为当程序在运行的时候,比如说数组越界,那么系统就会发送一个SIGEGV的信号来停止程序运行,然后使用void (*signal(int sig, void (*func)(int)))(int)该函数设置一个函数来处理信号,即信号处理程序。其中他和func函数指针指向你定义的函数(实际上就是把函数名作为参数传给他,但是要保证函数的类型要一致即接受一个int类型,不返回任何结果)。这样我们就可以在自己定义的函数中处理想要的结果了,比如说把堆栈信息写在某个文件中。

打字不易,希望能帮助到大家

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值