摘要
我在调试pyQT的时候发现结束线程后会出现,进程已结束,退出代码为 -1073740791 (0xC0000409),这个错误,排查了一星期才发现问题在哪里,特此记录
解决方案
进程已结束,退出代码为 -1073740791 (0xC0000409),这个问题先是搜索了一下,意思是:
退出代码 -1073740791 (0xC0000409) 通常与 Windows 操作系统的应用程序崩溃有关,且它指向一个具体的错误,即
STATUS_STACK_BUFFER_OVERRUN。这通常意味着程序因为堆栈缓冲区溢出(stack buffer
overrun)而终止。堆栈缓冲区溢出发生在当函数或操作试图写入超出为其分配的缓冲区空间时,这种写入可能会覆盖掉相邻内存空间中存储的数据,导致数据损坏或者程序行为异常,严重时会导致程序崩溃。
之所以很难找是因为触发该问题时,debug模式下不会产生任何异常,我的窗口均已关闭,但是一直无法退出正常的程序退出,是返回0的
像一般的函数接口都可以通过try expect·捕获,或者在异常产生时进行捕获
由于使用了多线程,我就逐个任务关闭,进行排查,最后定位到其中一个任务,
之后尝试了很多方法来修复,例如重写close_event函数来关闭各个线程,利用信号量传递去关闭其他子页面,均无法消除该错误。
最终在该任务的初始化代码中发现异常,这个任务在另一个任务中被初始化
self.task = DeviceStateTask(self.DpDict,self)
QThread 是DeviceStateTask 的超类
问题就出在第二个参数上,这个任务配置了祖先到当前任务,在关闭窗口后,父页面进行了内存回收,这个任务再次调用回收时指针可能丢失了 ,导致了无法进行正常的资源回收,导致内存溢出,从而报错
在该语句改为后
self.task = DeviceStateTask(self.DpDict)
一切正常,该任务为独立运行,进行资源回收时不依赖其他资源,只给DeviceStateTask 的run函数需要设定合适的关闭条件即可