跟踪 Windows 进程退出代码

Posted

技术标签:

【中文标题】跟踪 Windows 进程退出代码【英文标题】:Track windows process exit codes 【发布时间】:2019-01-10 13:08:05 【问题描述】:

在我们的某些 Citrix Desktop 上,我们遇到了随机终止(崩溃?)应用程序的问题。事件日志没有显示任何内容。

我的想法是跟踪进程的启动和停止以及它们的退出/错误代码一段时间,并尝试找到一个模式。

我的方法是通过 Powershell:

function Enable-ProcessStopTrace             
[CmdLetBinding()]            
param(            
)             
$Query = "Select * From __InstanceDeletionEvent within 2 Where TargetInstance ISA 'Win32_Process'"            
$Identifier = "StopProcess"            
$ActionBlock =             
 $e = $event.SourceEventArgs.NewEvent.TargetInstance            
 write-host ("Process 0 with PID 1 has stopped at 2" -f $e.Name, $e.ProcessID, $event.TimeGenerated)      


 $fmt = 'ProcessStopped: (ID=0, Parent=1, Time=2, Name="3", ExitCode=4)'            
 $msg = $fmt -f $e.ProcessId, $e.ParentProcessId, $event.TimeGenerated, $e.Name, $e.Exitcode

 write-host ($msg)            
            
Register-WMIEvent -Query $Query -SourceIdentifier $Identifier -Action $ActionBlock            


Enable-ProcessStopTrace

(无耻地从博文中复制并修改)

每次进程终止时我都会得到一个不错的输出,但“exitcode”总是空的。

这是正确的方法吗?我可以通过这种方式获取退出代码或错误代码吗? 还是我必须走完全不同的路线?

【问题讨论】:

【参考方案1】:

我可以让它工作的唯一方法是:

https://social.technet.microsoft.com/Forums/lync/en-US/5b318b42-27c9-49d1-8c19-c5d7f0b9dbb2/getting-exit-code-from-startprocess?forum=winserverpowershell

PS C:\> $notepad = Start-Process notepad++ -Wait -PassThru
<close the application at this point>
PS C:\> $notepad.exitcode
PS C:\> 0

脚本在后台运行(等待)直到应用程序关闭(无论是否正常),然后您可以运行 $applicationname.exitxcode 来获取退出代码。

【讨论】:

嗯,看起来只有当我通过 PS 显式启动应用程序时才有效。我正在寻找一种跟踪所有应用程序的解决方案。尤其是那些自动启动的,比如“explorer”。但这是一个开始。我会测试它。也许它揭示了一些东西。

以上是关于跟踪 Windows 进程退出代码的主要内容,如果未能解决你的问题,请参考以下文章

可预测的Windows中崩溃进程的退出代码

使用windows api堆栈跟踪另一个进程c

使用 IOCP - C++ - Windows 检测子进程的退出/失败

如何使用 C# 中的 Windows 服务跟踪给定进程是不是引发异常

解决WSL2报错(请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用虚拟化[已退出进程,代码为 4294967295])

在退出之前跟踪 - 并正确结束 - C# - C++/CLI - C++ Windows 窗体应用程序中的本机和托管线程