背景: 我正在开发基于WinForm的.NET 4.0桌面应用程序,该应用程序具有很少的线程和计时器,并使用一些GDI处理来进行用户控制.在开发过程中,我经常窥视sysinternal的Process Explorer,以确保我的应用程序没有任何异常,例如GDI句柄数或用户对象等.
问题: 使用Process Explorer时,我发现Process Explorer 中我的应用程序属性的Threads选项卡显示了很多很多条目"clr.dll!LogHelp_TerminateOnAssert + 0x58f68".这是正常的吗?我认为这不是因为非其他.net应用程序(我以前编写的)在Process Explorer的属性中显示相同的条目.
什么是LogHelp_TerminateOnAssert()?(我相信它是clr.dll中的一个函数)
为什么LogHelp_TerminateOnAssert()被调用了这么多次?
任何指针都会非常有用.
提前致谢.
clr.dll!LogHelp_TerminateOnAssert + 0x58f68
大数(+ 58f68)表示clr.dll中的实际方法远离LogHelp_TerminateOnAssert().您应该修复符号并再次尝试以获得正确的调用堆栈.然后,您可以找出真正的方法.
它不是LogHelp_TerminateOnAssert(),因此找出LogHelp_TerminateOnAssert()的作用是没用的.
要修复符号:在Process Explorer中,转到Options/Configure Symbols
,然后输入
SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Run Code Online (Sandbox Code Playgroud)
这里c:\symbols
是要存储下载文件的路径.
您提到使用线程 - 由于每个线程都有自己的堆栈,因此可能会在某个时刻超出默认堆栈大小,从而导致异常,然后由 .NET 运行时捕获该异常。您在线程中执行什么类型的工作(递归、大量堆栈变量等)?
我相信默认线程堆栈大小设置为 1MB - 尝试在线程构造函数中将堆栈大小设置为 4MB,并查看错误是否仍然存在。