2013-02-19 51 views
15

पर एक सीपीयू कोर बर्बाद कर हम एक मिश्रित मोड विधानसभा आवेदन (MFC + WinForms) है नेट 4 पर चल रहा है, विंडोज 2008 R2 कि लगातार एक धागे पर 100% CPU उपयोग करता है।नेट 4 लगातार StrongNameSignatureVerification

ProcessExplorer इस्तेमाल करते हुए हम व्यस्त धागे पर निम्नलिखित ढेर देखते हैं। हम केवल 0.01% सीपीयू का उपयोग कर एक और 10 धागे देख सकते हैं जो clr.dll चला रहे हैं! StrongNameSignatureVerification।

कताई धागा चल रहा है, लेकिन कचरे 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 –

+0

@ सिमोन मॉरीयर - हाँ, मेरी समझ से यह 'बाईपास' अक्षम करता है जिससे सभी असेंबली मजबूत नाम हस्ताक्षर सत्यापन के अधीन हो जाते हैं, प्रकार की तरह इसके बाद मैं क्या कर रहा हूँ। – chillitom

+0

ओह, क्षमा करें, आप सही हैं। इसके बारे में क्या: http://www.ryangerard.net/post/8768827919/assembly-verification-skipping-on-win7-64-bit-and –

उत्तर

14

clr.dll! StrongNameSignatureVerification + 0x164d9

यह आप क्या सोचते हैं यह करता है नहीं करता है। पहचानकर्ता के दाईं ओर की संख्या महत्वपूर्ण है, जो StrongNameSignatureVerification फ़ंक्शन पते के ज्ञात स्थान से पहले बाइट्स की संख्या देता है। यह 91353 बाइट है, यह बहुत है। केवल एक चीज जिसे आप इससे बता सकते हैं कि यह स्ट्रॉन्गनाम सिग्नेचर सत्यापन को निष्पादित करता है, फ़ंक्शन लगभग इतना लंबा नहीं है। स्टैक ट्रेस में बाकी पहचानकर्ता समान रूप से अविश्वसनीय हैं।

समस्या यह है कि डिबगर इन DLLs के लिए एक PDB फ़ाइल नहीं है। यह केवल निर्यात किए गए कार्यों का पता खोज सकता है, यह बीच के सभी कार्यों के बारे में पर्याप्त नहीं जानता है। यदि ऑफ़सेट लगभग 0x100 बाइट से कम है तो आप केवल प्रदर्शित नाम पर भरोसा कर सकते हैं। दे या ले।

आपको इन पीडीबी फाइलों को यह जानने के लिए जरूरी है कि वास्तव में क्या चल रहा है। इसके लिए माइक्रोसॉफ्ट सिंबल सर्वर को सक्षम करने की आवश्यकता है। जब आप डीबगिंग शुरू करते हैं तो डीबगर उस सर्वर से आवश्यक पीडीबी फ़ाइलों को डाउनलोड करेगा। अब आपको अधिक विश्वसनीय प्रतीकों मिलेगा, जिससे आपको वास्तव में कौन सा कोड वास्तव में निष्पादित किया जा रहा है, इस बारे में आपको बेहतर जानकारी मिलती है।

प्रतीक सर्वर को सक्षम करने के लिए आसान है, MSDN पेज is here

+0

धन्यवाद हंस - महान स्थान! क्या मैं मान सकता हूं कि विधानसभा के नाम सही हैं? – chillitom

+0

हां, वे सही हैं। केवल mscorlib ढेर पर है, शेष सीएलआर और ऑपरेटिंग सिस्टम निष्पादन योग्य हैं। –

+0

रिकॉर्ड के लिए, हंस द्वारा वर्णित प्रतीकों को सही ढंग से लोड करने के बाद, मैं देख सकता था कि समस्या एनएलओजी के एसिंक्रोनस लॉगिंग कोड (https://github.com/NLog/NLog/issues/162) में एक बग से संबंधित थी। – chillitom

1

आप अपने कोड में हॉटस्पॉट की पहचान करने के लिए दृश्य स्टूडियो में प्रोफाइलिंग टूल का उपयोग करने पर विचार कर सकते हैं जो इस समस्या में योगदान दे सकता है। .NET CLR के लिए प्रतीक समर्थन प्राप्त करने के लिए यह लिंक देखें।

http://blogs.msdn.com/b/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx