.net 进程退出时挂起在CRT_INIT中

.net 进程退出时挂起在CRT_INIT中,.net,msvcrt,.net,Msvcrt,我有一个控制台应用程序,退出时有时会挂起。也许千分之一,它会挂起来。当它挂起时,只剩下一个线程,它会消耗100%的CPU 如果我在ProcessExplorer中查看进程,当我转到ProcessExplorer的“线程”选项卡时,我的进程会正常退出 查看WinDbg中挂起的进程,调用堆栈如下所示: . 0 Id: 830.d00 Suspend: 1 Teb: 000007ff`fffde000 Unfrozen Start: MyHost!COM+_Entry_Point <PE

我有一个控制台应用程序,退出时有时会挂起。也许千分之一,它会挂起来。当它挂起时,只剩下一个线程,它会消耗100%的CPU

如果我在ProcessExplorer中查看进程,当我转到ProcessExplorer的“线程”选项卡时,我的进程会正常退出

查看WinDbg中挂起的进程,调用堆栈如下所示:

.  0  Id: 830.d00 Suspend: 1 Teb: 000007ff`fffde000 Unfrozen
  Start: MyHost!COM+_Entry_Point <PERF> (MyHost+0x71ee) (00000000`002571ee) 
  Priority: 0  Priority class: 16384  Affinity: ff
Child-SP          RetAddr           Call Site
00000000`003ddc50 000007fe`ec3f7646 System_EnterpriseServices_Wrapper_7feec3f0000!CRT_INIT+0x65
00000000`003ddc90 000007fe`f91a4485 System_EnterpriseServices_Wrapper_7feec3f0000!DllMainCRTStartup+0x126
00000000`003ddcd0 000007fe`f93f3281 mscoreei!CorDllMain+0x1f5
00000000`003ddd50 000007fe`f93f32cf MSCOREE!ShellShim__CorDllMain+0xe1
00000000`003ddd80 00000000`77a54371 MSCOREE!CorDllMain_Exported+0x37
00000000`003dddb0 00000000`77a54180 ntdll!LdrShutdownProcess+0x1db
00000000`003dded0 000007fe`f91926d2 ntdll!RtlExitUserProcess+0x90
00000000`003ddf00 000007fe`f9192848 mscoreei!RuntimeDesc::ShutdownAllActiveRuntimes+0x294
00000000`003de1f0 000007fe`f89cc919 mscoreei!CLRRuntimeHostInternalImpl::ShutdownAllRuntimesThenExit+0x14
00000000`003de220 000007fe`f897ef51 clr!EEPolicy::ExitProcessViaShim+0x69
00000000`003de270 000007fe`f8976776 clr!SafeExitProcess+0x9d
00000000`003de4e0 000007fe`f8d56971 clr!EEPolicy::GetFinalAction+0x9a
00000000`003de510 000007fe`f7b5f93b clr!SystemNative::Exit+0x52
00000000`003de560 000007fe`99142057 mscorlib_ni+0xcaf93b
00000000`003de630 000007fe`f87f07f3 0x7fe`99142057
00000000`003de900 000007fe`f87f02fe clr!CallDescrWorkerInternal+0x83
00000000`003de940 000007fe`f87f03c7 clr!CallDescrWorkerWithHandler+0x4a
00000000`003de980 000007fe`f892cdf0 clr!MethodDescCallSite::CallTargetWorker+0x2e6
00000000`003deb30 000007fe`f892d54e clr!RunMain+0x1e7
00000000`003ded00 000007fe`f892d448 clr!Assembly::ExecuteMainMethod+0xb6
00000000`003deff0 000007fe`f892cfc2 clr!SystemDomain::ExecuteMainMethod+0x45e
00000000`003df5b0 000007fe`f892cf0e clr!ExecuteEXE+0x3f
00000000`003df620 000007fe`f8929914 clr!CorExeMainInternal+0xae
00000000`003df6b0 000007fe`f91874e5 clr!CorExeMain+0x14
00000000`003df6f0 000007fe`f93e5b21 mscoreei!CorExeMain+0xe0
00000000`003df740 00000000`7782652d MSCOREE!CorExeMain_Exported+0x57
00000000`003df770 00000000`77a5c521 KERNEL32!BaseThreadInitThunk+0xd
00000000`003df7a0 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
。0 Id:830.d00暂停:1 Teb:000007ff`fffde000未冻结
开始:我的主人!COM+入口点(MyHost+0x71ee)(00000000`002571ee)
优先级:0优先级类别:16384关联性:ff
子SP重新寻址呼叫站点
00000000`003ddc50 000007fe`ec3f7646系统\u企业服务\u包装\u 7feec3f0000!CRT_INIT+0x65
00000000`003ddc90 000007fe`f91a4485系统\u企业服务\u包装\u 7feec3f0000!DllMainCRTStartup+0x126
00000000`003ddcd0 000007fe`f93f3281 MSCorei!CorDllMain+0x1f5
00000000`003ddd50 000007fe`f93f32cf MSCOREE!ShellShim_u_CorDllMain+0xe1
00000000`003ddd80 00000000`77a54371 MSCOREE!CorDllMain_导出+0x37
00000000`003dddb0 00000000`77a54180 ntdll!LdrShutdownProcess+0x1db
00000000`003dded0 000007fe`f91926d2 ntdll!RtlExitUserProcess+0x90
00000000`003ddf00 000007fe`f9192848 mscoreei!RuntimeDesc::ShutdowAllActiverUnitimes+0x294
00000000`003DE1F0000007FE`f89cc919 mscoreei!CLRRuntimeHostInternalImpl::ShutdownAllRuntimesThenExit+0x14
00000000`003de220 000007fe`f897ef51 clr!EEPolicy::ExitProcessViaShim+0x69
00000000`003de270 000007fe`f8976776 clr!安全退出进程+0x9d
00000000`003DE4E0000007FE`f8d56971 clr!EEPolicy::GetFinalAction+0x9a
00000000`003de510 000007fe`f7b5f93b clr!SystemNative::退出+0x52
00000000`003DE560000007FE`99142057 mscorlib_ni+0xcaf93b
00000000`003DE630000007FE`f87f07f3 0x7fe`99142057
00000000`003de900 000007fe`f87f02fe clr!CallDescrWorkerInternal+0x83
00000000`003de940 000007fe`f87f03c7 clr!CallDescrWorkerWithHandler+0x4a
00000000`003de980 000007fe`f892cdf0 clr!MethodDescrCallSite::CallTargetWorker+0x2e6
00000000`003deb30 000007fe`f892d54e clr!RunMain+0x1e7
00000000`003ded00 000007fe`f892d448 clr!程序集::ExecuteMainMethod+0xb6
00000000`003DEFF0000007FE`f892cfc2 clr!SystemDomain::ExecuteMainMethod+0x45e
00000000`003DF5B0000007FE`f892cf0e clr!ExecuteEXE+0x3f
00000000`003DF620000007FE`f8929914 clr!CorexeMain内部+0xae
00000000`003DF6B0000007FE`f91874e5 clr!CorExeMain+0x14
00000000`003DF6F0000007FE`f93e5b21 mscoreei!CorExeMain+0xe0
00000000`003DF74000000000`7782652d MSCOREE!CorExeMain_导出+0x57
00000000`003df770 00000000`77a5c521内核32!BaseThreadInitThunk+0xd
00000000`003DF7A000000000`00000000 ntdll!RtlUserThreadStart+0x1d

我如何知道这是在做什么?

此挂起是由于在Workflow应用程序完成之前退出应用程序造成的。我们在收到“已完成”事件后退出,但需要等待完成并卸载

很难追踪,因为挂在我们的代码中,而不是在工作流基础代码中。这是一个循环,等待一个计数器递减到零,但是,没有任何东西会使计数器递减。我们让Microsoft查看进程转储,他们可以看到它被挂起的原因,但无法找到导致挂起的事件序列,因为它只挂起1000次中的1次,并且当我们插入检测时,它不会挂起

我们最终通过在返回之前放置一个延迟找到了原因,我们意识到我们得到的卸载事件没有延迟就看不到