.net 应用程序在 1 MB 的进程资源管理器中开始挂起时被阻止
.net application is blocked on start hanging in process explorer with 1 MB
我有一个用 C# 编写的 Windows 表单应用程序,它面向 .net Framework 4.8。
我 运行 此应用程序在客户 PC 上的 Windows 7 x86 上。我的应用程序运行良好,但有时我在启动时遇到神秘问题。有时我的应用程序只是拒绝启动,但是当我打开进程资源管理器时,我看到 MyAplication.exe 拥有 1MB 的 RAM。似乎有什么东西阻止了我的应用程序。
我检查了 windows 事件日志,但没有错误。我还尝试在 Program.cs 的第一行写入日志文件,但它根本没有发生。我终止了这个 1 MB 的进程并重新启动了我的应用程序。它打开并工作得很好,否则我必须重新启动它几次。我在另一个 WPF 应用程序甚至外部供应商的 .net 应用程序中都遇到过这种 1 MB RAM 问题。我使用进程资源管理器为我的应用程序创建了一个转储文件。
在 Windows 10 我的个人电脑上,我使用 Windows 商店中的 WinDbg 应用程序来分析我的应用程序的转储文件。我看到以下内容:
FAULTING_THREAD: 000002a0
PROCESS_NAME: MyApplication.exe
ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached.
EXCEPTION_CODE_STR: 80000003
MISSING_CLR_SYMBOL: 0
STACK_TEXT:
002be670 77176c04 ntdll!KiFastSystemCallRet+0x0
002be674 771765ac ntdll!NtWaitForSingleObject+0xc
002be678 77161db1 ntdll!RtlpWaitOnCriticalSection+0x13e
002be6dc 77161c95 ntdll!RtlEnterCriticalSection+0x150
002be704 76e5cc0f rpcrt4!PerformRpcInitialization+0x29
002be748 76e665fd rpcrt4!RpcStringBindingComposeW+0x15
002be758 72ab1ec0 DialogFilterProc!InitDialogFilterProc+0x32d
002be810 72ab18b3 DialogFilterProc!ReleaseDialogFilterProc+0x17d
002be828 72ab2157 DialogFilterProc!InitDialogFilterProc+0x5c4
002be844 72ab22be DialogFilterProc!InitDialogFilterProc+0x72b
002be8a4 771887cc ntdll!LdrpCallInitRoutine+0x14
002be8c4 77195adb ntdll!LdrpRunInitializeRoutines+0x26f
002be9b8 7718faf2 ntdll!LdrpLoadDll+0x472
002beb2c 77192105 ntdll!LdrLoadDll+0xaf
002beb64 7523b246 KERNELBASE!LoadLibraryExW+0x215
002bebac 772aefa4 user32!__ClientLoadLibrary+0x60
002bece0 77176b3e ntdll!KiUserCallbackDispatcher+0x2e
002bed7c 772b4f21 user32!NtUserMessageCall+0xc
002bed80 772e5d6e user32!CallNextHookEx+0x10b
002bedb0 6d460ef0 tiptsf!TabletCallWndProc+0x5f
002bedd0 772a7a02 user32!DispatchHookW+0x33
002bedec 772a4999 user32!fnHkINLPCWPSTRUCTW+0x52
002bee20 772ae952 user32!__fnINLPCREATESTRUCT+0x8b
002bee50 77176b3e ntdll!KiUserCallbackDispatcher+0x2e
002beec4 772aeb5c user32!NtUserCreateWindowEx+0xc
002beec8 772aeaf0 user32!VerNtUserCreateWindowEx+0x1a3
002bf16c 772aec1c user32!_CreateWindowEx+0x201
002bf218 772aec77 user32!CreateWindowExW+0x33
002bf254 7682633f ole32!InitMainThreadWnd+0x3e
002bf28c 768263fc ole32!wCoInitializeEx+0xef
002bf2a4 768209ff ole32!CoInitializeEx+0x2ee
002bf2c4 7124ab8f clr!Thread::SetApartment+0x13b
002bf310 7123e1b7 clr!SystemDomain::SetThreadAptState+0x92
002bf330 7123e892 clr!SystemDomain::ExecuteMainMethod+0x18c
002bf810 71242498 clr!ExecuteEXE+0x4c
002bf868 712425be clr!_CorExeMainInternal+0xdc
002bf8a8 7123def5 clr!_CorExeMain+0x4d
002bf8e4 7185fa84 mscoreei!_CorExeMain+0xd6
002bf91c 718e7f16 mscoree!ShellShim__CorExeMain+0x99
002bf92c 718e4de3 mscoree!_CorExeMain_Exported+0x8
002bf934 7616ef3c kernel32!BaseThreadInitThunk+0xe
002bf940 77193618 ntdll!__RtlUserThreadStart+0x70
002bf980 771935eb ntdll!_RtlUserThreadStart+0x1b
SYMBOL_NAME: DialogFilterProc!InitDialogFilterProc+32d
MODULE_NAME: DialogFilterProc
IMAGE_NAME: DialogFilterProc.dll
STACK_COMMAND: .ecxr ; kb ; dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ** Pseudo Context ** Pseudo ** Value: 88f6c30 ** ; kb
FAILURE_BUCKET_ID: BREAKPOINT_80000003_DialogFilterProc.dll!InitDialogFilterProc
OSPLATFORM_TYPE: x86
OSNAME: Windows 7
IMAGE_VERSION: 1.0.299.0
FAILURE_ID_HASH: {e56a1c21-26f9-3e25-d015-b9f79339b457}
Followup: MachineOwner
P.S:我禁用了杀毒软件和 windows 防御者,但它并没有解决我的问题。
我无法在客户的 PC 上访问互联网。不确定它是否会对我的问题产生影响。
谁能帮我解决这个神秘的问题?非常感谢任何想法!
让我们阅读调用堆栈
clr!_CorExeMain
clr!_CorExeMainInternal
已到达管理代码的主要方法 (SystemDomain::ExecuteMainMethod)
clr!ExecuteEXE
clr!SystemDomain::ExecuteMainMethod
clr!SystemDomain::SetThreadAptState
您的 Main 方法很可能有一个 STAThread Apartment 属性,因为
设置了 COM Appartmentstate Thread::SetApartment
clr!Thread::SetApartment
COM 初始化 (CoInitializeEx)
ole32!CoInitializeEx
ole32!wCoInitializeEx
ole32!InitMainThreadWnd
COM 需要一个隐藏的 window 来发送消息 (CreateWindowExW)
user32!CreateWindowExW
user32!_CreateWindowEx
user32!VerNtUserCreateWindowEx
user32!NtUserCreateWindowEx
ntdll!KiUserCallbackDispatcher
user32!__fnINLPCREATESTRUCT
user32!fnHkINLPCWPSTRUCTW
user32!DispatchHookW
在这种情况下,tiptsf 已将 (DispatchHookW) 挂接到 window 创建中以注入其自身的功能 (TabletCallWndProc)。我怀疑这是来自 Microsoft Ink 的。
tiptsf!TabletCallWndProc
user32!CallNextHookEx
user32!NtUserMessageCall
ntdll!KiUserCallbackDispatcher
user32!__ClientLoadLibrary
这会加载一些扩展 dll
KERNELBASE!LoadLibraryExW
ntdll!LdrLoadDll
ntdll!LdrpLoadDll
ntdll!LdrpRunInitializeRoutines
ntdll!LdrpCallInitRoutine
现在我们初始化在 Windows 7 around 2012
中有问题的 DialogFilterProc
在我的 Win10 机器上,我没有找到这个 DialogFilterProc。这是Windows7机器吗?这一个根本没有记录,所以这里几乎没有关于这个试图做什么的信息。根据 this,它似乎是一个可以被禁用的系统服务,因此挂起。
DialogFilterProc!InitDialogFilterProc
DialogFilterProc!InitDialogFilterProc
DialogFilterProc!ReleaseDialogFilterProc
DialogFilterProc!InitDialogFilterProc
DialogFilter 调用 RpcStringBindingComposeW 显然挂起。从文档
我可以看到它处理进程间通信。
COM 单元尚未完全初始化导致此 RPC 方法挂起或无法建立远程连接。
参见例如here 使用此方法的示例。
rpcrt4!RpcStringBindingComposeW
rpcrt4!PerformRpcInitialization
ntdll!RtlEnterCriticalSection
ntdll!RtlpWaitOnCriticalSection
ntdll!NtWaitForSingleObject
ntdll!KiFastSystemCallRet
如果第一个问题是 Microsoft Ink 过早加载,您可以尝试禁用它并检查是否可以解决您的问题。如果问题仍然存在,您可以尝试在主方法上设置 [STAThread] 或 [MTAThread] 属性。也许另一种公寓模式也能解决你的僵局。
或者,如果这确实是试图调用崩溃或未崩溃的服务的对话框过滤器 运行,那么您需要重新启动服务以使 UI 弹出。
正如我可以(希望)向您展示的那样,很容易从任何方法中找出它在做什么以及如何关闭它。基于此,您现在应该有更多的选择来探索实际的根本原因或找到肮脏的解决方法。
附录
您的 DialogFilterProc.dll 版本为 1.0.299.0,似乎比 2012 年修复版本中的版本 1.0.542.0 更旧。安装古老的修复程序可能会解决您的问题。
> File name File version File size Date Time Platform
> Dialogfilterproc.dll 1.0.542.0 13,312 24-Jul-12 17:11 x86
我有一个用 C# 编写的 Windows 表单应用程序,它面向 .net Framework 4.8。 我 运行 此应用程序在客户 PC 上的 Windows 7 x86 上。我的应用程序运行良好,但有时我在启动时遇到神秘问题。有时我的应用程序只是拒绝启动,但是当我打开进程资源管理器时,我看到 MyAplication.exe 拥有 1MB 的 RAM。似乎有什么东西阻止了我的应用程序。 我检查了 windows 事件日志,但没有错误。我还尝试在 Program.cs 的第一行写入日志文件,但它根本没有发生。我终止了这个 1 MB 的进程并重新启动了我的应用程序。它打开并工作得很好,否则我必须重新启动它几次。我在另一个 WPF 应用程序甚至外部供应商的 .net 应用程序中都遇到过这种 1 MB RAM 问题。我使用进程资源管理器为我的应用程序创建了一个转储文件。 在 Windows 10 我的个人电脑上,我使用 Windows 商店中的 WinDbg 应用程序来分析我的应用程序的转储文件。我看到以下内容:
FAULTING_THREAD: 000002a0
PROCESS_NAME: MyApplication.exe
ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached.
EXCEPTION_CODE_STR: 80000003
MISSING_CLR_SYMBOL: 0
STACK_TEXT:
002be670 77176c04 ntdll!KiFastSystemCallRet+0x0
002be674 771765ac ntdll!NtWaitForSingleObject+0xc
002be678 77161db1 ntdll!RtlpWaitOnCriticalSection+0x13e
002be6dc 77161c95 ntdll!RtlEnterCriticalSection+0x150
002be704 76e5cc0f rpcrt4!PerformRpcInitialization+0x29
002be748 76e665fd rpcrt4!RpcStringBindingComposeW+0x15
002be758 72ab1ec0 DialogFilterProc!InitDialogFilterProc+0x32d
002be810 72ab18b3 DialogFilterProc!ReleaseDialogFilterProc+0x17d
002be828 72ab2157 DialogFilterProc!InitDialogFilterProc+0x5c4
002be844 72ab22be DialogFilterProc!InitDialogFilterProc+0x72b
002be8a4 771887cc ntdll!LdrpCallInitRoutine+0x14
002be8c4 77195adb ntdll!LdrpRunInitializeRoutines+0x26f
002be9b8 7718faf2 ntdll!LdrpLoadDll+0x472
002beb2c 77192105 ntdll!LdrLoadDll+0xaf
002beb64 7523b246 KERNELBASE!LoadLibraryExW+0x215
002bebac 772aefa4 user32!__ClientLoadLibrary+0x60
002bece0 77176b3e ntdll!KiUserCallbackDispatcher+0x2e
002bed7c 772b4f21 user32!NtUserMessageCall+0xc
002bed80 772e5d6e user32!CallNextHookEx+0x10b
002bedb0 6d460ef0 tiptsf!TabletCallWndProc+0x5f
002bedd0 772a7a02 user32!DispatchHookW+0x33
002bedec 772a4999 user32!fnHkINLPCWPSTRUCTW+0x52
002bee20 772ae952 user32!__fnINLPCREATESTRUCT+0x8b
002bee50 77176b3e ntdll!KiUserCallbackDispatcher+0x2e
002beec4 772aeb5c user32!NtUserCreateWindowEx+0xc
002beec8 772aeaf0 user32!VerNtUserCreateWindowEx+0x1a3
002bf16c 772aec1c user32!_CreateWindowEx+0x201
002bf218 772aec77 user32!CreateWindowExW+0x33
002bf254 7682633f ole32!InitMainThreadWnd+0x3e
002bf28c 768263fc ole32!wCoInitializeEx+0xef
002bf2a4 768209ff ole32!CoInitializeEx+0x2ee
002bf2c4 7124ab8f clr!Thread::SetApartment+0x13b
002bf310 7123e1b7 clr!SystemDomain::SetThreadAptState+0x92
002bf330 7123e892 clr!SystemDomain::ExecuteMainMethod+0x18c
002bf810 71242498 clr!ExecuteEXE+0x4c
002bf868 712425be clr!_CorExeMainInternal+0xdc
002bf8a8 7123def5 clr!_CorExeMain+0x4d
002bf8e4 7185fa84 mscoreei!_CorExeMain+0xd6
002bf91c 718e7f16 mscoree!ShellShim__CorExeMain+0x99
002bf92c 718e4de3 mscoree!_CorExeMain_Exported+0x8
002bf934 7616ef3c kernel32!BaseThreadInitThunk+0xe
002bf940 77193618 ntdll!__RtlUserThreadStart+0x70
002bf980 771935eb ntdll!_RtlUserThreadStart+0x1b
SYMBOL_NAME: DialogFilterProc!InitDialogFilterProc+32d
MODULE_NAME: DialogFilterProc
IMAGE_NAME: DialogFilterProc.dll
STACK_COMMAND: .ecxr ; kb ; dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; ** Pseudo Context ** Pseudo ** Value: 88f6c30 ** ; kb
FAILURE_BUCKET_ID: BREAKPOINT_80000003_DialogFilterProc.dll!InitDialogFilterProc
OSPLATFORM_TYPE: x86
OSNAME: Windows 7
IMAGE_VERSION: 1.0.299.0
FAILURE_ID_HASH: {e56a1c21-26f9-3e25-d015-b9f79339b457}
Followup: MachineOwner
P.S:我禁用了杀毒软件和 windows 防御者,但它并没有解决我的问题。 我无法在客户的 PC 上访问互联网。不确定它是否会对我的问题产生影响。
谁能帮我解决这个神秘的问题?非常感谢任何想法!
让我们阅读调用堆栈
clr!_CorExeMain
clr!_CorExeMainInternal
已到达管理代码的主要方法 (SystemDomain::ExecuteMainMethod)
clr!ExecuteEXE
clr!SystemDomain::ExecuteMainMethod
clr!SystemDomain::SetThreadAptState
您的 Main 方法很可能有一个 STAThread Apartment 属性,因为 设置了 COM Appartmentstate Thread::SetApartment
clr!Thread::SetApartment
COM 初始化 (CoInitializeEx)
ole32!CoInitializeEx
ole32!wCoInitializeEx
ole32!InitMainThreadWnd
COM 需要一个隐藏的 window 来发送消息 (CreateWindowExW)
user32!CreateWindowExW
user32!_CreateWindowEx
user32!VerNtUserCreateWindowEx
user32!NtUserCreateWindowEx
ntdll!KiUserCallbackDispatcher
user32!__fnINLPCREATESTRUCT
user32!fnHkINLPCWPSTRUCTW
user32!DispatchHookW
在这种情况下,tiptsf 已将 (DispatchHookW) 挂接到 window 创建中以注入其自身的功能 (TabletCallWndProc)。我怀疑这是来自 Microsoft Ink 的。
tiptsf!TabletCallWndProc
user32!CallNextHookEx
user32!NtUserMessageCall
ntdll!KiUserCallbackDispatcher
user32!__ClientLoadLibrary
这会加载一些扩展 dll
KERNELBASE!LoadLibraryExW
ntdll!LdrLoadDll
ntdll!LdrpLoadDll
ntdll!LdrpRunInitializeRoutines
ntdll!LdrpCallInitRoutine
现在我们初始化在 Windows 7 around 2012
中有问题的 DialogFilterProc在我的 Win10 机器上,我没有找到这个 DialogFilterProc。这是Windows7机器吗?这一个根本没有记录,所以这里几乎没有关于这个试图做什么的信息。根据 this,它似乎是一个可以被禁用的系统服务,因此挂起。
DialogFilterProc!InitDialogFilterProc
DialogFilterProc!InitDialogFilterProc
DialogFilterProc!ReleaseDialogFilterProc
DialogFilterProc!InitDialogFilterProc
DialogFilter 调用 RpcStringBindingComposeW 显然挂起。从文档 我可以看到它处理进程间通信。 COM 单元尚未完全初始化导致此 RPC 方法挂起或无法建立远程连接。 参见例如here 使用此方法的示例。
rpcrt4!RpcStringBindingComposeW
rpcrt4!PerformRpcInitialization
ntdll!RtlEnterCriticalSection
ntdll!RtlpWaitOnCriticalSection
ntdll!NtWaitForSingleObject
ntdll!KiFastSystemCallRet
如果第一个问题是 Microsoft Ink 过早加载,您可以尝试禁用它并检查是否可以解决您的问题。如果问题仍然存在,您可以尝试在主方法上设置 [STAThread] 或 [MTAThread] 属性。也许另一种公寓模式也能解决你的僵局。 或者,如果这确实是试图调用崩溃或未崩溃的服务的对话框过滤器 运行,那么您需要重新启动服务以使 UI 弹出。 正如我可以(希望)向您展示的那样,很容易从任何方法中找出它在做什么以及如何关闭它。基于此,您现在应该有更多的选择来探索实际的根本原因或找到肮脏的解决方法。
附录
您的 DialogFilterProc.dll 版本为 1.0.299.0,似乎比 2012 年修复版本中的版本 1.0.542.0 更旧。安装古老的修复程序可能会解决您的问题。
> File name File version File size Date Time Platform
> Dialogfilterproc.dll 1.0.542.0 13,312 24-Jul-12 17:11 x86