qt应用退出时crash

近日遇到QT应用退出时crash,非必现,但发生概率超过70%。
尝试用设断点debug,单步trace等方法来查找crash点,但是几乎每次死在不同的地方。基本上,QT应用在关闭退出时,主要做一些析构和销毁资源的操作。
到底是什么导致应用退出时crash呢?想起开发新功能之前的版本应该是稳定的,遂下载了一个老版本的代码编译测试。果然老版本的软件退出没有crash。推测应该是新增的代码有问题引入了crash。
祭出2分法分割新增的代码块,先屏蔽更新界面的功能,crash现象还是重现。继续屏蔽其他部分的代码,再测试是否crash。直到剩下最后2个函数,关闭其中一个函数,不再crash了。重点review这个嫌疑最大的函数。
最后发现这个函数确实有问题,函数内部的一个double数组,居然在更换输入参数后,数组写入越界了。并且越界有一定随机性,并非每次都发生!(前人遗留代码,前人挖坑,后人掉坑里)
重写这个坑人函数,最后解决应用退出时crash的问题。

小结:
1. 在QT中,数组写入越界,未必会在运行时就crash,但是越界造成内存里临近的其他对象变量被破坏了。在应用退出时,析构被破坏的对象变量时,引发各种crash。
2. 断点trace等方法在定位随机crash的问题上有一定局限性;通过在最近的稳定版本基础上,分部分屏蔽新增代码,逐步排查的方法,看似繁琐,耗时耗力,速度慢,实则是效率比较高的办法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值