Почему процесс зависает в RtlExitUserProcess / LdrpDrainWorkQueue? - PullRequest
0 голосов
/ 04 октября 2018

Чтобы отладить проблему с заблокированным файлом, мы вызываем файл 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

Мой вопрос: почему процесс зависает в LdrpDrainWorkQueuehttps://stackoverflow.com/a/42789684/62838, Я понял, что это параллельный загрузчик Windows 10 на работе, но почему он зависает при выходе из процесса?Может ли это быть вызвано тем, как мы вызываем Handle64 из другого процесса?То есть мы делаем что-то не так или это скорее ошибка в Handle64?

1 Ответ

0 голосов
/ 04 октября 2018

Как долго вы ждали?

Согласно этому анализу ,

Время ожидания простоя рабочего потока установлено на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...