-
-
Qt UI异常崩溃调试
-
发表于:
2023-7-13 15:14
5084
-
在Qt应用程序中,UI的更新一般是异步的信号槽机制,所以当槽函数出现访问已经被释放的指针时,会出现很少的崩溃堆栈信息,从而找不到案发点的任何线索。接下来通过有限的信息,尝试追溯案发真相。
程序的崩溃信息如图所示。程序崩溃点看不到发生点的堆栈信息,根据经验,一般出现在Qt5Widgets.dll中,大概率是因为异步的事件出了问题。此次的崩溃现象是每次指向代码的点是不唯一的,这说明很可能堆栈有损坏。
祭出神器WinDbg,打开程序,操作到触发崩溃:
显然,是访问[eax+10h]内存出了问题,该内存指向的是不可访问的无效内存。这种情况,大致是原本有效的堆变量被释放了。根据该指令所在地址下断点:
断点被触发后:
其实在这里基本上可以判断问题出现在CreateBox!QGraphicsScene中,该对象出现了访问悬挂指针的问题。接下可以进一步查看一下,关于这个QGraphicsScene的指针和event的类型。
现在可以确定是ecx所指向的0x1c3da408这个对象被释放了,且在QGraphicsScene::event中被访问,当前QEvent的事件类型为0x18.
根据这些信息,基本上能快速定位到代码出错的地方。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-7-13 15:41
被_THINCT编辑
,原因: