要调试锁定文件的问题,我们从.NET进程(通过带有异步输出重定向的Process.Start
)调用SysInternal的Handle64.exe 4.11。由于Handle64进程没有退出(超过两个小时),因此调用进程挂在Process.WaitForExit
上。
我们转储了相应的Handle64进程,并在Visual Studio 2017调试器中对其进行了检查。它显示了两个线程(“主线程”和“ ntdll.dll!TppWorkerThread”)。
主线程的调用堆栈:
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
工作线程的调用堆栈:
ntdll.dll!NtWaitForSingleObject() Unknown ntdll.dll!LdrpDrainWorkQueue() Unknown ntdll.dll!LdrpInitializeThread() Unknown ntdll.dll!_LdrpInitialize() Unknown ntdll.dll!LdrInitializeThunk() Unknown
我的问题是:为什么LdrpDrainWorkQueue
中会挂起一个进程?从https://stackoverflow.com/a/42789684/62838中,我收集到这是Windows 10并行加载器正在工作,但是为什么退出进程时它会卡住?这可能是由于我们如何从另一个进程调用Handle64引起的吗?也就是说,我们是在做错什么,还是Handle64中的错误?
答案 0 :(得分:1)
你等了多久?
工作线程空闲超时设置为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