一个默认operator=引起的C++服务器随机崩溃,以及对应的小技巧

22 篇文章 0 订阅
10 篇文章 0 订阅


今天在对服务器进行更新的时候发现更新服务器崩溃了,而且崩溃的还很频繁,每次重启程序之后没多久就会崩溃,又是崩溃的问题,这让我很头疼。又是那种随机位置崩溃,而且没有任何规律可言。同样的,引起了堆内存的损坏,无法获取到dmp文件和log文件。

第一时间,能下的判断是内存问题。就是不知道是写越界还是其他错误。还是老规矩,给这个程序打开page heap,用vs来调试,发现每次都是在创建或则删除对象的时候崩溃。而且几乎都是对成员变量的内存操作出错,比如临界区,vector之类的,这一点就可以排除是缓冲区溢出的问题。因为缓冲区溢出如果开了page heap,一般会在写越界的时候中断下来。这种类型的错误也不是无迹可寻,一般的可能的情况,就是类的成员变量内部写越界,或则成员变量被覆盖,大方向找到了,就按照代码的路径一个一个的看。

从引起崩溃测试的流程来看,包括连接、登录、获取报表、断开连接这几个步骤,那么,安排测试人员一步一步的反复测试,比如连接,反复测试几十次,然后登录反复测试几十次,一套流程下来发现在获取报表后出现崩溃。那么大概的位置就确定了。

接着开始复审代码,一行一行的看获取报表相关的代码,果然发现了一行赋值语句。

toclient = result;

看起来非常的简单,按理论上应该不会出错的代码,引起了我的注意,因为这个变量的类CArchive在我记忆中似乎没有operator=函数。我打开这个类的的代码仔细看了一下,确认没有operator=的实现。那么问题就是在这儿。C++会给每一个类或则结构体实现一个缺省的operator=,其实就是直接内存拷贝,这种方法对静态的成员无所谓,但对有动态内存分配的成员就是噩梦!

我想了一下,为了避免以后再有人犯类似的错,在代码中加了一个函数:

            #ifdef  _DEBUG
            //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
            CArchive & operator=(const CArchive & in)
            {
                //TODO Auto-generated method stub
                // this function used to debug only. CArchive NOT allow operator =.
                throw( std::bad_function_call() );
                return( * this );
            }
            #endif //  _DEBUG

这样可以保证在测试阶段,有任何类似的情况可以第一时间发现。然后将那行出错的代码进行了修改,再编译服务器,重新测试了流程,问题解决。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值