Я сталкиваюсь со специфической проблемой, которую не могу исправить. Недавно я обнаружил, что мое Win 8.1 Update 1 (со всеми обновлениями через WSUS в автономном режиме) начинает пожирать весь процессор при открытии окна "устройство и принтеры".
Задержка 5-10 ', пока не появятся устройства, однако процессор продолжает вращаться даже после того, как значки отображаются в течение еще 5-10 минут.
Файл Xperf (спасибо @ magicandre1981 за инструкции) размещен на Dropbox - 24 МБ, распакованный на 145 МБ.
При просмотре проводника процессов Sysinternals кажется, что проблема вызвана вызовом MultiByteToUnicodeN
(к сожалению, я не могу опубликовать изображение):
ntdll.dl!RtlMultiByteToUnicodeN+0x1cf0
ntdll.dl!RtlMultiByteToUnicodeN+0x1cf0
ntdll.dl!RtlMultiByteToUnicodeN+0x1cf0
ntdll.dl!RtlMultiByteToUnicodeN+0x1cf0
ntdll.dl!RtlMultiByteToUnicodeN+0x1cf0
SHCORE.dll!GetScaleFactorForDevice+0x1d4
FunDisc.dll!DllCanUnloadNow+0x2e8
SHCORE.dll!GetScaleFactorForDevice+0x1d4
SHCORE.dll!GetScaleFactorForDevice+0x1d4
windows.immersiveshell.serviceprovider.dll!
SHCORE.dll!GetScaleFactorForDevice+0x1d4
SHCORE.dll!GetScaleFactorForDevice+0x1d4
SHCORE.dll!GetScaleFactorForDevice+0x1d4
SHCORE.dll!GetScaleFactorForDevice+0x1d4
Explorer.EXE
Любые идеи, как это исправить? Либо я жду 20 'или около того или должен убить задачу исследователя. Я попытался переустановить все устройства безрезультатно; по какой-то причине рендеринг этого окна приводит к тому, что перевод в Unicode поглощает весь процессор
Обновление с символами
Основываясь на полученных комментариях, я установил розничные символы для Windows 8.1 и наведенный проводник процессов (как объяснено в этом посте, однако вывод выглядит примерно так же. Я посмотрел на стек для потока, и кажется, что он проводит большую часть своего времени в синхронизации на одном объекте:
ntoskrnl.exe!KeSynchronizeExecution+0x2246
ntoskrnl.exe!KeRemoveQueueEx+0x108e
ntoskrnl.exe!KeRemoveQueueEx+0xae9
ntoskrnl.exe!KeWaitForSingleObject+0x22a
ntoskrnl.exe!KeSetBasePriorityThread+0x4ec
ntoskrnl.exe!KeRemoveQueueEx+0x281d
ntoskrnl.exe!KiCheckForKernelApcDelivery+0x23
ntoskrnl.exe!SeQuerySessionIdToken+0x1b99
ntoskrnl.exe!SeQuerySessionIdToken+0x15f9
ntoskrnl.exe!SeQuerySessionIdToken+0x1440
ntoskrnl.exe!FsRtlAllocateExtraCreateParameter+0x744e
ntoskrnl.exe!FsRtlAllocateExtraCreateParameter+0x52c4
ntoskrnl.exe!FsRtlAllocateExtraCreateParameter+0x13c8
ntoskrnl.exe!FsRtlAllocateExtraCreateParameter+0x10da
ntoskrnl.exe!IoDeleteAllDependencyRelations+0x14d0
ntoskrnl.exe!FsRtlAllocateExtraCreateParameter+0xa96
ntoskrnl.exe!FsRtlAllocateExtraCreateParameter+0x898
ntoskrnl.exe!ObReferenceObjectByHandleWithTag+0xe92
ntoskrnl.exe!NtDeviceIoControlFile+0x56
ntoskrnl.exe!setjmpex+0x34b3
ntdll.dll!NtDeviceIoControlFile+0xa
KERNELBASE.dll!GetModuleHandleExA+0xb6
KERNEL32.DLL!DeviceIoControl+0x80
cfgmgr32.dll!SwMemFree+0x6a7
KERNELBASE.dll!SetKernelObjectSecurity+0xc1
ntdll.dll!RtlAcquireSRWLockExclusive+0x31e
ntdll.dll!RtlMultiByteToUnicodeN+0x20a3
KERNEL32.DLL!BaseThreadInitThunk+0xd
ntdll.dll!RtlUserThreadStart+0x1d
Вот еще один стек из одного из инициирующих потоков (SHCORE.dll!GetScaleFactorForDevice
):
ntoskrnl.exe!KeSynchronizeExecution+0x2246
ntoskrnl.exe!KeRemoveQueueEx+0x108e
ntoskrnl.exe!KeRemoveQueueEx+0xae9
ntoskrnl.exe!KeWaitForSingleObject+0x22a
ntoskrnl.exe!KeSetBasePriorityThread+0x4ec
ntoskrnl.exe!KeRemoveQueueEx+0x281d
ntoskrnl.exe!KiCheckForKernelApcDelivery+0x23
win32k.sys+0x12aaea
win32k.sys+0x6d10d
win32k.sys+0xca699
win32k.sys+0x35a9f
win32k.sys+0x2a514
win32k.sys+0x138e28
win32k.sys+0x19fa8
win32k.sys+0x4921e
ntoskrnl.exe!setjmpex+0x34b3
USER32.dll!WindowFromPhysicalPoint+0x1a
USER32.dll!CallWindowProcW+0x2bf
USER32.dll!SendMessageW+0x111
UxTheme.dll!DrawThemeParentBackgroundEx+0x18f
Comctl32.dll!ImageList_GetIconSize+0xee3
Comctl32.dll!ImageList_GetIconSize+0x1107
Comctl32.dll!DrawScrollBar+0x12bf
USER32.dll!DispatchMessageW+0x154
USER32.dll!CallWindowProcW+0x132
Comctl32.dll!DefSubclassProc+0xb2
Comctl32.dll!DefSubclassProc+0x77
explorerframe.dll!Ordinal111+0x655d
Comctl32.dll!DPA_GetPtr+0x282
Comctl32.dll!DPA_GetPtr+0x152
USER32.dll!DispatchMessageW+0x154
USER32.dll!OffsetRect+0x172
USER32.dll!OffsetRect+0x22d
ntdll.dll!KiUserCallbackDispatcher+0x1f
USER32.dll!WindowFromPhysicalPoint+0x1a
USER32.dll!CallWindowProcW+0x2bf
USER32.dll!SendMessageW+0x111
UxTheme.dll!DrawThemeParentBackgroundEx+0x1a6
explorerframe.dll!Ordinal111+0xabef
explorerframe.dll!Ordinal111+0x6ae5
USER32.dll!DispatchMessageW+0x154
USER32.dll!OffsetRect+0x172
USER32.dll!OffsetRect+0x22d
ntdll.dll!KiUserCallbackDispatcher+0x1f
USER32.dll!WindowFromPhysicalPoint+0x1a
USER32.dll!CallWindowProcW+0x2bf
USER32.dll!SendMessageW+0x111
UxTheme.dll!DrawThemeParentBackgroundEx+0x1a6
explorerframe.dll!Ordinal111+0xaa52
Comctl32.dll!DPA_GetPtr+0x282
Comctl32.dll!DPA_GetPtr+0x152
USER32.dll!GetWindowLongPtrA+0x265
USER32.dll!OffsetRect+0x172
USER32.dll!OffsetRect+0x22d
ntdll.dll!KiUserCallbackDispatcher+0x1f
USER32.dll!SendMessageW+0x1aa
USER32.dll!SendMessageW+0x1bc
explorerframe.dll!Ordinal111+0x546e
explorerframe.dll!Ordinal111+0x10568
explorerframe.dll!Ordinal111+0x11d50
explorerframe.dll!Ordinal111+0x11d00
explorerframe.dll!Ordinal111+0xeee3
SHELL32.dll!SHGetKnownFolderPathWorker+0x84c
SHELL32.dll!SHGetKnownFolderPathWorker+0xa23
SHCORE.dll!GetScaleFactorForDevice+0x333
KERNEL32.DLL!BaseThreadInitThunk+0xd
ntdll.dll!RtlUserThreadStart+0x1d
Обратите внимание, что на этот раз это заняло около 30 минут - успел установить символы, прочитать сообщения, выполнить некоторую диагностику и отправить сообщение обратно, но процессор все еще был поднят.
Второе обновление для символов
Благодаря @kinokijuf я использовал Защитник Windows Debug.dll и имею более точную информацию. Темы теперь выглядят следующим образом:
ntdll.dll!TppWorkerThread
ntdll.dll!TppWorkerThread
ntdll.dll!TppWorkerThread
ntdll.dll!TppWorkerThread
ntdll.dll!TppWorkerThread
SHCORE.dll!Microsoft::WRL::FtmBase::MarshalInterface+0x1c
SHCORE.dll!Microsoft::WRL::FtmBase::MarshalInterface+0x1c
FunDisc.dll!CNotificationQUeue::ThreadProc
SHCORE.dll!Microsoft::WRL::FtmBase::MarshalInterface+0x1c
windows.immersiveshell.serviceprovicer.dll!CImmersiveShellController::s_ImmersiveShellComponentsThreadProc
Explorer.EXE!wWinMainCRTStartup
В то время как потоки верхнего уровня по-прежнему показывают конфликты потоков / блокировок?
ntoskrnl.exe!KiSwapContext+0x76
ntoskrnl.exe!KiSwapThread+0x14e
ntoskrnl.exe!KiCommitThreadWait+0x129
ntoskrnl.exe!KeWaitForSingleObject+0x22a
ntoskrnl.exe!KiSchedulerApc+0x74
ntoskrnl.exe!KiDeliverApc+0x1fd
ntoskrnl.exe!KiSwapThread+0x2da
ntoskrnl.exe!KiCommitThreadWait+0x129
ntoskrnl.exe!KeRemoveQueueEx+0x27b
ntoskrnl.exe!IoRemoveIoCompletion+0x8a
ntoskrnl.exe!NtWaitForWorkViaWorkerFactory+0x30a
ntoskrnl.exe!KiSystemServiceCopyEnd+0x13
ntdll.dll!NtWaitForWorkViaWorkerFactory+0xa
ntdll.dll!TppWorkerThread+0x286
KERNEL32.DLL!BaseThreadInitThunk+0xd
ntdll.dll!RtlUserThreadStart+0x1d
Спасибо,