Process Explorer не отображает 32-разрядный стек для 32-разрядных процессов в Win10 x64 - PullRequest
0 голосов
/ 13 февраля 2019

Если я использую Process Explorer для просмотра стеков вызовов 32-битных процессов в моей 64-битной системе Windows 10, Process Explorer отображает только 64-битную (верхнюю) часть стека вызовов и не более интересную (нижнюю)) 32-битная часть.Например, стек вызовов основного потока 32-разрядного процесса wmplayer.exe показывает:

ntoskrnl.exe!KiSwapContext+0x76
ntoskrnl.exe!KiSwapThread+0x2c6
ntoskrnl.exe!KiCommitThreadWait+0x13b
ntoskrnl.exe!KeWaitForSingleObject+0x1ff
ntoskrnl.exe!KiSchedulerApc+0x30a
ntoskrnl.exe!KiDeliverApc+0x27b
ntoskrnl.exe!KiSwapThread+0x501
ntoskrnl.exe!KiCommitThreadWait+0x13b
ntoskrnl.exe!KeWaitForSingleObject+0x1ff
ntoskrnl.exe!KeWaitForMultipleObjects+0x4b5
win32kfull.sys!xxxRealSleepThread+0x32a
win32kfull.sys!xxxSleepThread2+0xa0
win32kfull.sys!xxxRealInternalGetMessage+0xf19
win32kfull.sys!NtUserGetMessage+0x8c
ntoskrnl.exe!KiSystemServiceCopyEnd+0x13
wow64win.dll!NtUserGetMessage+0x14
wow64win.dll!whNtUserGetMessage+0x30
wow64.dll!Wow64SystemServiceEx+0x153
wow64cpu.dll!ServiceNoTurbo+0xb
wow64cpu.dll!BTCpuSimulate+0x9
wow64.dll!RunCpuSimulation+0xa
wow64.dll!Wow64LdrpInitialize+0x120
ntdll.dll!LdrpInitializeProcess+0x1887
ntdll.dll!_LdrpInitialize+0x4aa45
ntdll.dll!LdrpInitialize+0x3b
ntdll.dll!LdrInitializeThunk+0xe
0x0000000000000000

В то время как стек вызовов для 64-разрядного процесса wmplayer.exe (C: \ Program Files \Проигрыватель Windows Media \ wmplayer.exe) завершен и также содержит вызовы в коде приложения:

ntoskrnl.exe!KiSwapContext+0x76
ntoskrnl.exe!KiSwapThread+0x2c6
ntoskrnl.exe!KiCommitThreadWait+0x13b
ntoskrnl.exe!KeWaitForSingleObject+0x1ff
ntoskrnl.exe!KiSchedulerApc+0x30a
ntoskrnl.exe!KiDeliverApc+0x27b
ntoskrnl.exe!KiSwapThread+0x501
ntoskrnl.exe!KiCommitThreadWait+0x13b
ntoskrnl.exe!KeWaitForSingleObject+0x1ff
ntoskrnl.exe!KeWaitForMultipleObjects+0x4b5
win32kfull.sys!xxxRealSleepThread+0x32a
win32kfull.sys!xxxSleepThread2+0xa0
win32kfull.sys!xxxRealInternalGetMessage+0xf19
win32kfull.sys!NtUserGetMessage+0x8c
ntoskrnl.exe!KiSystemServiceCopyEnd+0x13
win32u.dll!NtUserGetMessage+0x14
USER32.dll!GetMessageW+0x2b
wmp.dll!Ordinal3002+0x731
wmp.dll!Ordinal3002+0x65f
wmp.dll!Ordinal3000+0x12e
wmplayer.exe!_PlayerEntry+0x747
KERNEL32.DLL!BaseThreadInitThunk+0x14
ntdll.dll!RtlUserThreadStart+0x21

Если бы мне пришлось угадывать, я бы сказал, что это адрес 0x0000000000000000 в первом стеке, который препятствует процессуИсследователь идет дальше по 32-битной части, но я не уверен на 100% в этом.Как я могу заставить Process Explorer отображать 32-битный стек для 32-битных процессов?

Дополнительная информация о моей настройке:

Windows 10 version 1803 build 17134.556
Windows SDK 10.0.17763.132 installed
Process Explorer version 16.22
Symbol configuration:
Dbghelp.dll path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbghelp.dll
Symbols path: symsrv*symsrv.dll*C:\LocalSymbols*http://msdl.microsoft.com/download/symbols

Обновление: при просмотрестеки вызовов 32-разрядных процессов с помощью Process Hacker вместо Process Explorer показывают ожидаемые 32-разрядные стеки.Для основного потока 32-разрядного wmplayer.exe Process Hacker отображает:

0, wow64win.dll!NtUserGetMessage+0x14
1, wow64win.dll!whNtUserGetMessage+0x30
2, wow64.dll!Wow64SystemServiceEx+0x153
3, wow64cpu.dll!ServiceNoTurbo+0xb
4, wow64cpu.dll!BTCpuSimulate+0x9
5, wow64.dll!RunCpuSimulation+0xa
6, wow64.dll!Wow64LdrpInitialize+0x120
7, ntdll.dll!LdrpInitializeProcess+0x1887
8, ntdll.dll!_LdrpInitialize+0x4aa45
9, ntdll.dll!LdrpInitialize+0x3b
10, ntdll.dll!LdrInitializeThunk+0xe
11, win32u.dll!NtUserGetMessage+0xc
12, user32.dll!GetMessageW+0x30
13, wmp.dll!DllGetClassObject+0x1bf48 (No unwind info)
14, wmp.dll!DllGetClassObject+0x1bccb (No unwind info)
15, wmp.dll!Ordinal3000+0x75 (No unwind info)
16, wmplayer.exe!_PlayerEntry+0x4ff
17, kernel32.dll!BaseThreadInitThunk+0x24
18, ntdll.dll!__RtlUserThreadStart+0x2f
19, ntdll.dll!_RtlUserThreadStart+0x1b

Обновление 2: проблема проявляется только в 64-разрядном обозревателе процессов (procxp64.exe)).При принудительном запуске Process Explorer в 32-разрядном режиме он отображает 32-разрядный стек:

0x00000000
win32u.dll!NtUserGetMessage+0xc
USER32.dll!GetMessageW+0x30
wmp.dll!DllGetClassObject+0x1bf48
wmp.dll!DllGetClassObject+0x1bccb
wmp.dll!Ordinal3000+0x75
wmplayer.exe!_PlayerEntry+0x4ff
KERNEL32.DLL!BaseThreadInitThunk+0x24
ntdll.dll!__RtlUserThreadStart+0x2f
ntdll.dll!_RtlUserThreadStart+0x1b

Обновление 3: . Тем временем я смог подтвердить, что то же самоепроблема возникает при чистой установке Windows 10 x64.Это исключает конфликт с существующим драйвером или программным обеспечением в моей системе и повышает вероятность появления теории об ошибке в Process Explorer.Тем не менее, нет никаких признаков того, что это будет исправлено в ближайшее время.Поскольку мне действительно нужно иметь возможность просматривать 32-разрядные стеки вызовов, и Process Hacker по-прежнему делает это правильно, я не вижу другого выбора, кроме как прекратить использование Process Explorer в пользу Process Hacker.

...