最近遇到了个问题:程序关闭后,程序可能因崩溃,导致这个进程又新拉了一个进程出来。下面是问题现象和排查原因。
1,现象
①在某个进程点击叉号关闭软件后,立刻通过taskkill命令行指令杀这个进程,命令行窗口却显示:
E:\\download\\A\\src>taskkill /f /im A.exe
错误: 无法终止进程 "A.exe",其 PID 为 89566。
原因: 没有此任务的实例在运行。
错误: 无法终止进程 "A.exe",其 PID 为 410004。
原因: 拒绝访问。
win11,执行命令taskkill
很明显,我只打开了一个A.exe,在taskkill时却有两个进程。并且两个进程都无法中止,说明遇到了异常。目前看到的异常是:不知道进程为啥无法终止,也不知道为啥会多出来一个进程。
②在Process Explorer进程树(工具使用,参考:Process Monitor调试工具-CSDN博客)中,确实能够观察到两个A进程。两个A进程为父子关系。
③新生出来的进程,通过任务管理器却看不到这个进程的存在,但是通过Process Explorer工具能够看到。
④日志中有打印:2026-03-19 19:41:23.293 : 36196 : default : fatal : 0 : unknown : QThread: Destroyed while thread is still running
2,排查到的原因
① exe在退出时,执行了QCoreApplication::quit();然后,程序开始析构某个QObject派生对象。
② QObject派生对象有个QThred对象。QThred对象在QObject被析构之后也被析构。但是此时QThred对象所管理的线程还在执行。导致 Qt 抛出致命错误 QThread: Destroyed while thread is still running,进程崩溃,异常代码为 c0000409(STATUS_STACK_BUFFER_OVERRUN)。
③程序崩溃或发生严重错误时, WerFault.exe系统自动触发(Windows 操作系统自带的组件),通过 Process Explorer 也会观察到崩溃进程通过Process Create操作拉起了 WerFault.exe。
④Windows 介入后,根据某种机制(程序可能的重启命令或系统默认的恢复策略),自动重新启动了一个新的 exe 进程。
⑤这个新进程并非由用户或程序主动拉起,而是操作系统崩溃恢复机制的结果。由于是系统级别的重启操作,任务管理器由于它自身的原因,没有查询到这个进程。(可能的原因是:新进程由 WER 服务启动,运行在 Session 0,而任务管理器默认只显示当前用户会话(Session 1)的进程。)
3,编码规则
在销毁任何可能拥有或引用线程的对象之前,必须确保线程已经停止并等待结束。比如:线程是类的成员。在销毁类时,要确保线程已经停止并退出。再比如:如果线程对象是 QThread* 但未作为成员管理,它可能是局部对象或未被管理的状态,需要在程序退出之前最统一的管理,进行线程停止和退出。
补充说明:
WerFault.exe 是 Windows 操作系统自带的 Windows 错误报告(Windows Error Reporting, WER)组件 。它的唯一职责是:当某个程序崩溃或发生严重错误时,被系统自动触发,用来收集错误信息、生成日志,并弹出“XXX已停止工作”的对话框。


