2013-02-19 2 views
15

.Net 4, Windows 2008 R2에서 실행되는 혼합 모드 어셈블리 응용 프로그램 (MFC + WinForms)은 한 스레드에서 100 % cpu를 사용합니다..Net 4 지속적으로 StrongNameSignatureVerification에서 하나의 CPU 코어 낭비

는 ProcessExplorer를 사용하여 우리는 바쁜 스레드에서 다음과 같은 스택을 참조하십시오. clr.dll을 실행하는 0.01 % CPU를 사용하는 또 다른 10 개의 스레드를 볼 수도 있습니다! 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

@SimonMourier - 네, 나의 이해에서 이것이의 종류는 '우회'하여 모든 어셈블리는 강력한 이름 서명 검증의 대상이 될 원인을 비활성화 내가 겪은 것의 반대편. – chillitom

+0

아, 죄송합니다, 당신 말이 맞아요. 이것에 대해 : http://www.ryangerard.net/post/8768827919/assembly-verification-skipping-on-win7-64bit 및 –

답변

14

clr.dll! 이것은 당신이하지 생각하지 않는다 + 0x164d9

StrongNameSignatureVerification. 식별자의 오른쪽에 번호가 StrongNameSignatureVerification 함수 주소의 알려진 위치 과거 바이트 수를주는 것이 중요하다. 91353 바이트입니다. 그만큼 많습니다. 당신이에서 알 수있는 유일한 방법은 함수가 거의 그렇게 오래되지 않습니다, 그것은 StrongNameSignatureVerification을 실행 하지 것입니다. 스택 추적의 나머지 식별자도 똑같이 신뢰할 수 없습니다.

문제는 디버거에 이러한 DLL에 대한 PDB 파일이 없다는 것입니다. 그것은 내 보낸 함수의 주소 만 발견 할 수 있으며, 그 사이에있는 모든 함수를 충분히 알지 못합니다. 오프셋이 약 0x100 바이트보다 작 으면 표시된 이름 만 신뢰할 수 있습니다. 주고받습니다.

당신은 정말 무슨 일이 일어나고 있는지 알고이 PDB 파일을 얻을해야합니다

. 이를 위해서는 Microsoft Symbol Server를 활성화해야합니다. 디버거를 시작할 때 디버거가 해당 서버에서 필요한 PDB 파일을 다운로드합니다. 훨씬 더 안정적인 심볼을 얻을 수있게되어 코드가 실제로 실행되고 있음을 훨씬 잘 파악할 수 있습니다.

MSDN 페이지 is here을 사용하면 기호 서버를 쉽게 사용할 수 있습니다.

+0

감사합니다 한스 - 좋은 장소! 어셈블리 이름이 정확하다고 가정 할 수 있습니까? – chillitom

+0

네, 맞습니다. mscorlib 만 스택에 있고 나머지는 CLR 및 운영 체제 실행 파일입니다. –

+0

레코드의 경우 Hans에서 설명한대로 기호를 올바르게로드 한 후 문제가 NLog의 비동기 로깅 코드 (https://github.com/NLog/NLog/issues/162)의 버그와 관련되어 있음을 알 수있었습니다. – chillitom