15

1 つのスレッドで常に 100% の CPU を使用する .Net 4、Windows 2008 R2 で実行されている混合モードのアセンブリ アプリケーション (MFC + WinForms) があります。

ProcessExplorer を使用すると、ビジー スレッドに次のスタックが表示されます。clr.dll!StrongNameSignatureVerification を実行しているわずか 0.01% の CPU を使用する別の 10 のスレッドも確認できます。

回転するスレッドは、アプリケーションの残りの部分の実行を妨げませんが、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

私が見つけることができた唯一の同様のアカウントは、この質問あります。

アセンブリに署名せず、それらを信頼しても構わないと思っています。厳密な名前の検証を完全に無効にする方法はありますか?

4

2 に答える 2

15

clr.dll!StrongNameSignatureVerification+0x164d9

これは、あなたが思っていることをしません。識別子の右側の数字は重要であり、StrongNameSignatureVerification 関数アドレスの既知の場所を過ぎたバイト数を示します。それは 91353 バイトです。このことからわかる唯一のことは、StrongNameSignatureVerification を実行していないということです。関数はそれほど長くはありません。スタック トレースの残りの識別子も同様に信頼できません。

問題は、デバッガーにこれらの DLL の PDB ファイルがないことです。エクスポートされた関数のアドレスしか検出できず、間にあるすべての関数について十分に認識していません。オフセットが約 0x100 バイト未満の場合にのみ、表示された名前を信頼できます。ギブオアテイク。

実際に何が起こっているのかを知るには、これらの PDB ファイルを取得する必要があります。これには、Microsoft Symbol Server を有効にする必要があります。デバッグを開始すると、デバッガーはそのサーバーから必要な PDB ファイルをダウンロードします。より信頼性の高いシンボルを取得できるようになり、実際にどのコードが実行されているかについてのより良い洞察が得られます。

シンボル サーバーを有効にするのは簡単です。MSDN ページは こちらです。

于 2013-03-01T06:08:09.787 に答える
1

Visual Studio のプロファイリング ツールを使用して、この問題の原因となっている可能性のあるコード内のホットスポットを特定することを検討してください。.net CLR のシンボル サポートを取得するには、このリンクを参照してください。

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

于 2013-03-02T16:18:57.233 に答える