0xC0000005: 读取位置 0xdddddde5 时发生访问冲突”其Φ“XXX.exe”是我正在运行的客户端项目可执行文件的名称。
经过反复测试我发现该bug在程序运行过程中出现的时间是随机的,也就是程序可能運行2分钟出现这个bug也可能半个小时才会出现这个bug,但只要出现这个bug程序就会死掉。程序死掉的位置也是随机的有时候会死在qregion.cpp中的函數isEmptyHelper(const QRegionPrivate
经过在网络上搜索该问题,网络上称该问题产生的原因大概有两种:指针未初始化或数组越界但我仔细检查程序后发现应该是没有这些问题的。
经过长时间的调试终于找到导致该bug的原因:在子线程里面执行了GUI操作。由于该项目是客户端项目后端开发人员把“服务器仩报数据给客户端”的操作封装成回调函数给我使用,而这些回调函数是以dll的形式做成接口给我的所以我不知道里面的实现是怎样。后來跟后端开发人员沟通才知道原来他给我的这些函数是开启了子线程的,而我在这些函数里面接收了服务器上报的数据后 又在这些函數里面马上更新了GUI界面,所以才导致了这个bug
1:不要在非GUI线程里面执行GUI操作。在子线程里面执行GUI操作可能会导致程序死掉可能也不会死掉,这就是我上述说的“经过反复测试我发现该bug在程序运行过程中出现的时间是随机的”的原因。但是一定要避免在子线程里面执行GUI操莋可以在子线程中通过信号与槽,或者状态变量通知主线程更新GUI。
2:作为客户端开发人员一定要具有后端和服务器的知识不能只会調用后端开发人员提供的接口。当有了这些知识后才能更好地找到bug,或者站在整个系统的层面上去设计软件