Fab*_*ied 5 c++ windows multithreading process
为了调试锁定的文件问题,我们从 .NET 进程调用 SysInternal 的 Handle64.exe 4.11(通过Process.Start
异步输出重定向)。调用进程挂起,Process.WaitForExit
因为 Handle64 进程没有退出(超过两个小时)。
我们转储了相应的 Handle64 进程,并在 Visual Studio 2017 调试器中检查了它。它显示两个线程(“主线程”和“ntdll.dll!TppWorkerThread”)。
主线程的调用栈:
Run Code Online (Sandbox Code Playgroud)ntdll.dll!NtWaitForSingleObject () Unknown ntdll.dll!LdrpDrainWorkQueue() Unknown ntdll.dll!RtlExitUserProcess() Unknown kernel32.dll!ExitProcessImplementation () Unknown handle64.exe!000000014000664c() Unknown handle64.exe!00000001400082a5() Unknown kernel32.dll!BaseThreadInitThunk () Unknown ntdll.dll!RtlUserThreadStart () Unknown
工作线程的调用堆栈:
Run Code Online (Sandbox Code Playgroud)ntdll.dll!NtWaitForSingleObject() Unknown ntdll.dll!LdrpDrainWorkQueue() Unknown ntdll.dll!LdrpInitializeThread() Unknown ntdll.dll!_LdrpInitialize() Unknown ntdll.dll!LdrInitializeThunk() Unknown
我的问题是:为什么进程会挂起LdrpDrainWorkQueue
?从/sf/answers/2995277911/,我了解到这是正在工作的 Windows 10 并行加载器,但为什么它会在退出进程时卡住呢?这是否是由于我们从另一个进程调用 Handle64 的方式引起的?即,我们是否做错了什么,或者这是 Handle64 中的一个错误?
你等了多久?
根据这个分析,
工作线程空闲超时设置为 30 秒。执行时间少于 30 秒的程序将由于 ntdll!TppWorkerThread 在进程终止前等待空闲超时而挂起。
我建议尝试设置该文章中指定的注册表项以禁用并行加载器,并查看是否可以解决问题。
Parent Key: HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\handle64.exe
Value Name: MaxLoaderThreads
Type: DWORD
Value: 1 to disable
Run Code Online (Sandbox Code Playgroud)