.Net 4 постоянно растрачивает одно ядро процессора на StrongNameSignatureVerification
У нас есть приложение для сборки смешанного режима (MFC + WinForms), работающее на .Net 4, Windows 2008 R2, которое постоянно использует 100% -ный процессор в одном потоке.
Используя ProcessExplorer, мы видим следующий стек в занятом потоке. Мы также можем видеть еще 10 потоков, используя только 0,01% процессор, на котором выполняется clr.dll! StrongNameSignatureVerification.
Вращающаяся нить не препятствует запуску остальной части приложения, но тратит время процессора.
Трассировка стека занятого потока выглядит следующим образом:
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 Потребление процессора, хотя поток, кажется, простудился.
Мы не подписываем наши сборки и не хотим доверять им, есть ли способ полностью отключить проверку сильного имени?
Ответы
Ответ 1
clr.dll! StrongNameSignatureVerification + 0x164d9
Это не делает то, что вы думаете. Номер справа от идентификатора важен, что дает количество байтов, прошедших известное местоположение адреса функции StrongNameSignatureVerification. Это 91353 байта, это много. Единственное, что вы можете сказать из этого, - это не выполнение StrongNameSignatureVerification, функция не так уж длинна. Остальные идентификаторы в трассировке стека одинаково ненадежны.
Проблема заключается в том, что отладчик не имеет файла PDB для этих DLL. Он может только обнаружить адрес экспортируемых функций, он не знает достаточно обо всех функциях между ними. Вы можете доверять только отображаемому имени, если смещение меньше, чем около 0x100 байт. Дайте или возьмите.
Вам нужно будет, чтобы эти файлы PDB знали, что действительно происходит. Для этого требуется сервер Microsoft Symbol Server. Отладчик загрузит необходимые файлы PDB с этого сервера при запуске отладки. Теперь вы получите гораздо более надежные символы, дающие вам гораздо лучшее представление о том, какой код действительно выполняется.
Включение сервера символов легко, страница MSDN здесь.
Ответ 2
Вы можете использовать инструменты профилирования в visual studio для определения горячих точек в коде, которые могут способствовать этой проблеме. Чтобы получить поддержку символов для .net CLR, см. Эту ссылку.
http://blogs.msdn.com/b/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx