我正在寻找一些指导来识别 C++ 运行时错误发生的时间,以便我可以自动恢复。
我的服务器上不断出现以下 C++ 运行时错误,这导致我的生产应用程序停止“工作”: C++ 运行时错误屏幕截图
虽然屏幕上出现了运行时错误消息,但从 Windows 的角度来看,我的应用程序正在“响应”(使用下面的 PowerShell 脚本),但应用程序实际上并没有“工作”。
((Get-Process -Name ReqMgr).Responding)
如果我
Get-Process
在 PowerShell 中,当运行时错误出现在屏幕上时,它并没有出现(对我而言)运行时错误作为它自己的应用程序/任务运行,我可以在 PowerShell 中对其进行测试(除非我遗漏了什么)。
我可以在任务管理器 > 应用程序选项卡中看到列出的“Microsoft Visual C++ 运行时库”,但是右键单击并转到进程会将我带到我的应用程序的进程,而不是运行时错误进程: 任务管理器 > 应用程序选项卡
直到我单击运行时错误对话框中的“确定”按钮,我才在事件日志中发现任何明显的信息,这显然不利于自动恢复。
Get-Process 的结果:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
33 5 1816 676 3.95 1328 0 conhost
32 5 1364 332 0.23 1356 0 conhost
90 9 6160 804 0.06 1348 0 coreFrameworkHost
3590 61 386300 16688 19,851.21 1260 0 coreServiceShell
871 13 2740 2204 56.74 572 0 csrss
72 8 8192 180 0.55 644 1 csrss
396 12 2800 4068 26.10 3368 2 csrss
196 15 4548 12472 0.12 5168 0 dllhost
31 3 1264 208 0.03 1436 0 ds_monitor
440 34 148236 110848 3,718.47 2332 0 dsa
87 7 2376 3476 0.76 2284 2 dwm
854 53 56444 50532 123.35 3576 2 explorer
0 0 0 24 0 0 Idle
168 24 9032 772 0.14 1004 1 LogonUI
2384 29 26688 25020 1,394.95 740 0 lsass
2725 12 16984 12796 572.24 752 0 lsm
390 38 75452 19412 4.23 9648 2 mmc
102 10 7704 10624 0.80 3924 0 mscorsvw
117 12 5032 9224 2.67 13304 0 mscorsvw
162 18 4252 2528 0.11 3092 0 msdtc
83 9 13972 5652 59.70 1232 2 Notifier
84 8 1900 2340 9.24 2476 0 Notifier
390 52 31760 42136 2.82 10136 2 perfmon
630 53 124556 101032 21.98 5364 2 powershell_ise
194 11 3268 4964 6.82 4048 2 rdpclip
801 302 849064 950080 9,286.37 13416 2 ReqMgr
278 14 7292 7320 36.35 732 0 services
37 3 808 664 2.95 476 0 smss
206 19 19912 1184 0.97 1484 0 SMSvcHost
186 16 5936 3372 845.09 1928 0 snmp
148 21 3388 924 21.59 1664 0 sntlkeyssrvr
385 12 2488 1128 107.95 1820 0 sntlsrtsrvr
144 20 3572 1884 2.70 1780 0 spnsrvnt
4365 113 42656 44056 962.76 492 0 svchost
570 41 24276 21796 70.12 532 0 svchost
283 21 7492 9192 17.35 536 0 svchost
1523 20 11352 10916 28.28 568 0 svchost
387 14 6404 6328 1,313.98 844 0 svchost
313 16 11084 10860 102.63 928 0 svchost
685 100 45972 32480 253.60 1020 0 svchost
311 33 7556 4732 6.46 1120 0 svchost
124 13 7180 5812 1.19 1388 0 svchost
157 12 4836 2276 1.20 1412 0 svchost
53 4 1304 128 0.00 1636 0 svchost
268 27 13256 6920 3.29 1960 0 svchost
140 13 6364 1256 0.08 2192 0 svchost
438 17 6676 8684 717.18 2804 0 svchost
117 13 2220 156 0.03 2844 0 svchost
904 0 132 1080 2,066.64 4 0 System
92 8 2460 2676 0.84 2724 2 taskeng
95 8 2936 2528 1.87 2984 0 taskeng
209 21 9568 6956 3.88 3988 2 taskhost
199 16 7144 14840 891.78 11976 2 taskmgr
351 23 8824 8200 607.48 2008 0 vmtoolsd
187 17 7444 3804 956.44 3448 2 vmtoolsd
91 10 1868 232 0.02 624 0 wininit
80 6 2064 216 0.08 676 1 winlogon
187 8 2392 2400 0.34 4084 2 winlogon
287 17 31496 15608 558.06 3908 0 WmiPrvSE
306 16 6304 13772 0.31 10224 0 WmiPrvSE
221 12 14736 20276 0.16 10796 0 WmiPrvSE
190 14 15504 2048 14.26 2224 0 zabbix_agentd
注意:我没有编写崩溃的应用程序。我必须在我们的生产服务器上运行它。该应用程序已“报废”,我无法获得任何支持来修复运行时错误的根本原因。
运行时错误在多年后才开始出现。我已经卸载了最近的 Windows 更新,以防上个月的 .NET 更新是根本原因,但问题仍然存在。
我有两台服务器在负载平衡配置中运行同一个应用程序。当我在一台服务器上收到运行时错误时,几分钟后,第二台服务器上也收到相同的运行时错误。
答案1
谢谢大家的帮助。
我实际上找到了一种在 PowerShell 中检测运行时错误并终止/重新启动应用程序的方法,如下所示:
$Title = Get-Process | Where-Object {$_.mainwindowhandle -ne 0} | Select-Object MainWindowTitle
if ($Title -like '*Visual C++*') {
$ReqMgr = Get-Process ReqMgr -ErrorAction SilentlyContinue
$ReqMgr | Stop-Process -Force
Start-Sleep -Seconds 10
Start-Process -FilePath "C:\Program Files (x86)\ReqMgr\Bin\ReqMgr.exe"
Start-Sleep -Seconds 10
}