zoukankan      html  css  js  c++  java
  • 另类分析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 );//这里就可能会错误了。你访问的堆已经越界了。
    //但是,系统不知道。只有在他很不爽的时候,就让你的程序突然崩溃。
    //这个时候,你就很纳闷了。刚刚不是还运行的好好的吗
    
    }
    

      

  • 相关阅读:
    [Unity菜鸟] 协程Coroutine
    [Unity菜鸟] Unity发布web后,从HTML调用本地文件
    [Unity菜鸟] Unity鼠标双击,鼠标函数整理(未完)
    [Unity菜鸟] Unity Web Player 相关问题 (待完善)
    [Unity菜鸟] Unity读XML
    [Unity菜鸟] 术语
    [Unity菜鸟] 笔记2 —— 问题篇
    [Unity菜鸟] Mecanim 系统遇到的问题
    学习:条件[记录]断点
    学习:硬件断点
  • 原文地址:https://www.cnblogs.com/lvpblog/p/4538576.html
Copyright © 2011-2022 走看看