Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2326|回复: 2
打印 上一主题 下一主题

0x1061E680 处引发的异常: 0xC0000005: 执行位置 0x1061E68...

[复制链接]

1272

主题

2067

帖子

7960

积分

认证用户组

Rank: 5Rank: 5

积分
7960
跳转到指定楼层
楼主
发表于 2020-3-9 11:30:15 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
0x1061E680 处(位于 xx.exe 中)引发的异常: 0xC0000005: 执行位置 0x1061E680 时发生访问冲突。
回复

使用道具 举报

1272

主题

2067

帖子

7960

积分

认证用户组

Rank: 5Rank: 5

积分
7960
板凳
 楼主| 发表于 2020-3-9 11:51:16 | 只看该作者
最近在用Qt写一个windows平台下的客户端项目,运行程序的时候发现,程序运行一段时间后会自动死掉,然后报错“XXX.exe 中的 0x6510af2d (QtGuid4.dll) 处未处理的异常: 0xC0000005: 读取位置 0xdddddde9 时发生访问冲突”或者“XXX.exe 中的 0x6510422c (QtGuid4.dll) 处未处理的异常: 0xC0000005: 读取位置 0xdddddde5 时发生访问冲突”。其中“XXX.exe”是我正在运行的客户端项目可执行文件的名称。

  经过反复测试,我发现该bug在程序运行过程中出现的时间是随机的,也就是程序可能运行2分钟出现这个bug,也可能半个小时才会出现这个bug,但只要出现这个bug,程序就会死掉。程序死掉的位置也是随机的,有时候会死在qregion.cpp中的函数isEmptyHelper(const QRegionPrivate *preg)中,有时候会死在qregion.cpp中的函数isEmpty()中,有时候会死在qvector.h中的函数size()中,还有时候会死在qvector.h中的函数realloc(int asize, int aalloc)中。总之程序死掉的时间跟位置都是随机的。

  经过在网络上搜索该问题,网络上称该问题产生的原因大概有两种:指针未初始化或数组越界。但我仔细检查程序后发现应该是没有这些问题的。

  经过长时间的调试,终于找到导致该bug的原因:在子线程里面执行了GUI操作。由于该项目是客户端项目,后端开发人员把“服务器上报数据给客户端”的操作封装成回调函数给我使用,而这些回调函数是以dll的形式做成接口给我的,所以我不知道里面的实现是怎样。后来跟后端开发人员沟通,才知道原来他给我的这些函数是开启了子线程的,而我在这些函数里面接收了服务器上报的数据后, 又在这些函数里面马上更新了GUI界面,所以才导致了这个bug。

  总结:

1:不要在非GUI线程里面执行GUI操作。在子线程里面执行GUI操作可能会导致程序死掉,可能也不会死掉,这就是我上述说的“经过反复测试,我发现该bug在程序运行过程中出现的时间是随机的”的原因。但是一定要避免在子线程里面执行GUI操作。可以在子线程中通过信号与槽,或者状态变量,通知主线程更新GUI。

2:作为客户端开发人员一定要具有后端和服务器的知识,不能只会调用后端开发人员提供的接口。当有了这些知识后,才能更好地找到bug,或者站在整个系统的层面上去设计软件。
————————————————
版权声明:本文为CSDN博主「cuijiecheng2018」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014552102/article/details/80638353
回复 支持 反对

使用道具 举报

1272

主题

2067

帖子

7960

积分

认证用户组

Rank: 5Rank: 5

积分
7960
沙发
 楼主| 发表于 2020-3-9 11:35:57 | 只看该作者
本帖最后由 Qter 于 2020-3-9 14:48 编辑

_btnNewGroup = new QPushButton(this);
        _btnNewGroup->setObjectName(QStringLiteral("_btnNewGroup"));
        _btnNewGroup->setText(qsl("新建立分组"));

        _btnClose = new QPushButton(this);
        _btnClose->setObjectName(QStringLiteral("_btnClose"));
        _btnClose->setText(qsl("关闭"));
        
        _hLayoutStyle->addWidget(_btnNewGroup);
        _hLayoutStyle->addWidget(_btnClose);

先建控件后一起再添加,不要建一个添加一个
再添加一个控件,又会报错

重新生成一下解决方案
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-23 12:37 , Processed in 0.059976 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表