Чтобы отладить проблему с заблокированным файлом, мы вызываем файл SysInternal's Handle64.exe 4.11 из процесса .NET (через Process.Start
с асинхронным перенаправлением вывода).Вызывающий процесс зависает на Process.WaitForExit
, потому что процесс Handle64 не завершается (более двух часов).
Мы взяли дамп соответствующего процесса 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?