终端产品一般部署在客户的环境中,那么奇奇怪怪的问题也就容易出现了。比如Windows产品进程为什么忽然停止了?这个时候稍微有些经验的程序员会做出以下判断:
- 中型的产品中,代码比较复杂。是不是程序中有什么退出逻辑,没有注意到?
- 是不是程序崩溃了,比如资源不足或者代码bug?
- 是不是系统中的其他程序关闭了我们的进程?比如客户的脚本或者其他的软件。
是不是程序中有什么退出逻辑,没有注意到?
常见的程序退出的时候会有Log记录,这种情况一般通过Debug Log 结合代码审查可以进行追踪。
是不是程序崩溃了,比如资源不足或者代码bug?
如果你的程序是一个Windows服务
,也许可以先看看Windows Event
。当然如果是Crash,最好的方式还是通过收集dump来进行确认,可以参考我之前写过的一篇文章<<Windows程序Dump收集>>,然后再通过Windbg进行分析,可以参考<<Windbg分析程序崩溃实践>>,从而定位问题。
是不是系统中的其他程序关闭了我们的进程?
这个看似是最难查找的了,用户环境纷繁复杂。但是Windows调试工具集中的gflags
可以满足我们的需求。
第一步
先使用gflags
设置需要监视的进程如下图所示, 并且开启Enable Silent Process Exit Monitoring
第二步
故意kill
这个进程notepad.exe
,可以手动通过任务管理或者windows调试工具集中的kill.exe
。
第三步
查看Windows Event,在应用程序事件中可以查看到是谁把你的进程给kill掉了。(下图来自于:MSDN https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/registry-entries-for-silent-process-exit)