另类分析SIGSEGV信号

关于SIGSEGV信号的含义就不解释了。网络上有很多解释。

今天记录一下,自己遇到的一个问题,想了好几天都没想出来的。今天终于想到原因了。

过程描述:

有个类 CBase,里面放了一个成员变量 DATA,这个成员变量是个 union结构。union结构里面数据长度不一样。

然后,我有个std::list链表。链表来存放这个CBase。CBase全部都是从网络上传送过来的。

接着,我按消息头的长度来分配堆,然后存放CBase。(错就错在这里)

最后,我把*pCBase push_back()到list链表里面。(此时,系统就可能会给程序发出SIGSEGV信号.)

注意上面说的。有个 可能。  可能 就表示说了,你偶尔会遇到这个信号,偶尔2个小时都不会遇到这个信号。

随机出现的问题,很蛋疼!!!

现在来说说,为什么会有这个信号。(如果你已经知道,就略过了)

根据消息头来分配长度在这里是不能保证能容纳 CBase的数据。当然,网络发送的数据肯定是正确的。然而在list保存到链表里面时,

list会按最大长度来保存数据。这个时候,你刚刚分配的长度不够最大长度时,就可能会出现SIGSEGV信号。再想想产生SIGSEGV的原因,就知道为什么

会产生这个错误了。

其实就是类似数组越界,或者你访问了不该访问的地址。 写个简单的示例程序,以此警戒。

class ABC
{
public:
union
{
    int nnn;
    int sdf;
    char sadf;
    int sadfkasdf[5];
}_BCD;
};

int _tmain(int argc, _TCHAR* argv[])
{
ABC* pa ;
char* p = new char;//我只分配一个字节的长度来容纳ABC。你觉得可以吗?
p[0] = ‘a‘;
pa = (ABC*)p;

vector<ABC> vr;
vr.push_back( *pa );//这里就可能会错误了。你访问的堆已经越界了。
//但是,系统不知道。只有在他很不爽的时候,就让你的程序突然崩溃。
//这个时候,你就很纳闷了。刚刚不是还运行的好好的吗

}

  

时间: 2024-08-30 03:41:30

另类分析SIGSEGV信号的相关文章

如何捕捉并分析SIGSEGV的现场

linux下程序对SIGSEGV信号的默认处理方式是产生coredump并终止程序,可以参考man 7 signal Signal Value Action Comment ────────────────────────────────────────────────────────────────────── SIGHUP 1 Term Hangup detected on controlling terminal or death of controlling process SIGINT

Qt源码分析之信号和槽机制

Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个函数中触发另一个类的另一个函数调用,而且还要把相关的参数传递过去.好像这和回调函数也有点关系,但是消息机制可比回调函数有用多了,也复杂多了 MFC中的消息机制没有采用C++中的虚函数机制,原因是消息太多,虚函数开销太大.在Qt中也没有采用C++中的虚函数机制,原因与此相同.其实这里还有更深层次上的原

Qt源码分析之信号和槽机制(QMetaObject是一个内部struct)

Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个函数中触发另一个类的另一个函数调用,而且还要把相关的参数传递过去.好像这和回调函数也有点关系,但是消息机制可比回调函数有用多了,也复杂多了 MFC中的消息机制没有采用C++中的虚函数机制,原因是消息太多,虚函数开销太大.在Qt中也没有采用C++中的虚函数机制,原因与此相同.其实这里还有更深层次上的原

信号相关函数的介绍及使用

1.信号 执行命令 kill -l 查看信号列表 信号分为两类:普通信号(1-31).实时信号(34-64) 注意:大部分情况下信号不会立刻执行,大部分情况下信号是默认终止程序的,信号会在合适的时候执行. 2.信号的产生 产生方式有:按键.异常(内存越界.除零).指令.调用系统函数 1)按键: 用户在终端按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产生SIGINT信 号,Ctrl-\产生SIGQUIT信号,Ctrl-Z产生SIGTSTP信号. 什么是core dumped?

利用linux信号机制调试段错误(Segment fault)

在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过串口.显示器可以查看消息,只要程序运行,通过GDB调试工具即可捕捉产生segment fault的具体原因.但是不知大家有没有想法,当程序运行在嵌入式设备上时,你所面临资源的缺乏,你没有串口打印信息,没有显示器可查看,你不知道程序运行的状态,如果程序的产生segment falut这种bug发生的周

crash日志的分析

怎样获得crash日志 怎样解析crash日志 怎样分析crash日志 1. iOS策略相关 2. 常见错误标识 3. 代码bug 一.怎样获得crash日志 当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上. 这份crash日志记录着应用程序崩溃时的信息,通常包括着每一个运行线程的栈调用信息(低内存闪退日志例外),对于开发者定位问题非常有帮助. 假设设备就在身边,能够连接设备,打开Xcode - Window - Organizer,在左側面板中选择Device Logs(

iOS应用的crash日志的分析基础

iOS应用的crash日志的分析基础 分类: iOS  |  作者: jasonblog 相关  |  发布日期 : 2013-06-22  |  热度 : 11° Outline 如何获得crash日志 如何解析crash日志 如何分析crash日志      1. iOS策略相关      2. 常见错误标识      3. 代码bug 一.如何获得crash日志 当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上.这份crash日志记录着应用程序崩溃时的信息,通常包含着每

信号中断与异步信号中断安全编程

1.什么是中断? 1.1.什么是中断 外围设备的速度远低于CPU的速度,所以为提高CPU计算效率,现代计算机变内核主动为硬件主动,只在硬件需要的时候才发送信号,通知内核来处理数据.这样外围设备与内核的协作方式即为中断机制.而设备发送的信号即为中断,其本质为一种特殊的电信号. 硬中断处理流程: 1.各外围设备与中断管理器各输入引脚相连: 2.中断管理器与CPU之间只存在一条中断管线: 3.设备发送一个中断到中断管理器: 4.中断管理器发送对应电信号给CPU. 5.CPU中断当前工作,开始处理中断,

linux内核分析之缺页中断【转】

转自:http://blog.csdn.net/bullbat/article/details/7108402 linux缺页异常程序必须能够区分由编程引起的异常以及由引用属于进程地址空间但还尚未分配物理页框的页所引起的异常.在x86-ia32体系上由do_page_fault函数处理,每个版本有所差异,现分析的版本为2.6.32 [cpp] view plain copy print? /* regs:该结构包含当异常发生时的微处理器寄存器的值 3位的error_code,当异常发生时由控制单