2013-02-19 74 views
15

我们有一个在.NET 4,Windows 2008 R2上运行的混合模式程序集应用程序(MFC + WinForms),它在一个线程上不断使用100%cpu。.Net 4不断浪费StrongNameSignatureVerification上的一个CPU内核

使用ProcessExplorer,我们在繁忙线程上看到以下堆栈。我们还可以看到另外10个线程只使用运行clr.dll!的Strong%SignatureVerification的0.01%CPU。

旋转线程不会阻止应用程序的其余部分运行,但会浪费CPU时间。

繁忙的线程的堆栈跟踪如下:

ntoskrnl.exe!IoAcquireRemoveLockEx+0xe7 
ntoskrnl.exe!memset+0x22a 
ntoskrnl.exe!KeWaitForSingleObject+0x2cb 
ntoskrnl.exe!KeDetachProcess+0x120d 
ntoskrnl.exe!PsReturnProcessNonPagedPoolQuota+0x3a3 
ntoskrnl.exe!CcSetDirtyPinnedData+0x433 
mscorlib.ni.dll+0x2b066a 
mscorlib.ni.dll+0x2317ac 
mscorlib.ni.dll+0x2b066a 
mscorlib.ni.dll+0x2317ac 
mscorlib.ni.dll+0x26ccf7 
mscorlib.ni.dll+0x237fc4 
mscorlib.ni.dll+0x26cc3c 
clr.dll+0x21bb 
clr.dll!CoUninitializeEE+0xee9b 
clr.dll!CoUninitializeEE+0x11463 
clr.dll!CoUninitializeEE+0x114dc 
clr.dll!CoUninitializeEE+0x1154b 
clr.dll!StrongNameErrorInfo+0xa638 
clr.dll!StrongNameSignatureVerification+0x144fb 
clr.dll!StrongNameSignatureVerification+0x1457d 
clr.dll!StrongNameSignatureVerification+0x14638 
clr.dll!StrongNameSignatureVerification+0x146d2 
clr.dll!StrongNameErrorInfo+0x9977 
clr.dll!StrongNameErrorInfo+0xa5bc 
clr.dll!StrongNameErrorInfo+0xa553 
clr.dll!StrongNameErrorInfo+0xa517 
clr.dll!StrongNameErrorInfo+0xa151 
clr.dll!StrongNameErrorInfo+0x9501 
clr.dll!StrongNameErrorInfo+0xad67 
clr.dll!StrongNameSignatureVerification+0x164d9 
ntdll.dll!RtlCreateUserProcess+0x8c 
ntdll.dll!RtlCreateProcessParameters+0x4e 

唯一类似的帐户,我已经能够找到在这个问题:clr.sll!StrongNameSignatureVerification CPU consumption虽然线程似乎已经冷了。

我们不签署我们的程序集并且愿意相信他们,是否有办法彻底禁用强名称验证?

+0

你见过吗? http://msdn.microsoft.com/en-us/library/cc713694.aspx – 2013-02-25 13:14:00

+0

@SimonMourier - 是的,从我的理解,这禁用了“绕过”,从而导致所有程序集受到强名称签名验证,类与我所追求的相反。 – chillitom 2013-02-25 13:23:48

+0

哦,对不起,你是对的。这是什么:http://www.ryangerard.net/post/8768827919/assembly-verification-skipping-on-win7-64-bit-and – 2013-02-25 13:34:12

回答

14

clr.dll!StrongNameSignatureVerification + 0x164d9

这不会做你认为它。标识符右侧的数字很重要,它给出了通过StrongNameSignatureVerification函数地址的已知位置的字节数。这是91353字节,这是很多。你唯一可以告诉的是,它是而不是执行StrongNameSignatureVerification,该函数并没有那么长。堆栈跟踪中的其余标识符同样不可靠。

问题是调试器没有这些DLL的PDB文件。它只能发现导出的函数的地址,它并不知道它们之间的所有函数。如果偏移量小于大约0x100字节,则只能信任显示的名称。给或拿。

您将需要获得这些PDB文件以了解真正发生了什么。这需要启用Microsoft Symbol Server。调试器将在您开始调试时从该服务器下载所需的PDB文件。现在您将获得更可靠的符号,让您更好地了解代码的执行情况。

启用符号服务器很简单,MSDN页面is here

+0

感谢汉斯 - 伟大的地方!我能假定程序集名称是正确的吗? – chillitom 2013-03-04 09:00:00

+0

是的,他们是正确的。只有mscorlib在堆栈上,其余的是CLR和操作系统可执行文件。 – 2013-03-04 12:18:17

+0

为了记录,在汉斯描述的正确加载符号后,我可以看到问题与NLog异步日志代码(https://github.com/NLog/NLog/issues/162)中的错误有关。 – chillitom 2014-03-12 14:04:55