3

PerfMonitor.exe(http://bcl.codeplex.com/wikipage?title=PerfMonitor)を使用して、ネイティブコードであるサードパーティライブラリを使用する.NET4.0アプリの.NETパフォーマンスの問題を追跡しています。 。

Perfmonitor GCTimeレポートを実行すると、個々のGCが一覧表示され、いくつかの方法で分類されます。レポートの1つの列は「理由」と呼ばれます。一部のGCにはReason="Induced"があり、他のGCにはReason="SmallAlloc"があります。

「SmallAlloc」というラベルの付いたGCは定期的な割り当て(New Object())によって引き起こされ、「Induced」というラベルの付いたGCは「System.GC.Collect」の呼び出しによって引き起こされたと思います。私が間違った仮定をしたと思われる場合はお知らせください。

System.GC.Collectを呼び出しているコードを見つけようとしていますが、失敗しました。MSVS 2010 Professionalを使用して、System.GC.Collectにブレークポイントを設定し、System.GC.Collectの呼び出しを含む単純なテスト関数を記述して、このブレークポイントが機能することを確認しました。ただし、チューニングしているアプリはそのブレークポイントで壊れないため、System.GC.Collectを呼び出すコードはないと思われます。

mscorwks.dllのネイティブ関数を直接呼び出してSystem.GC.CollectをバイパスすることでGCを誘導するネイティブコードがあるのではないかと思います。System.GC.CollectがmscorwksにあるJitHelpers.cppで_Collectを呼び出していることがわかります。その関数にブレークポイントを設定する方法はありますか?

4

2 に答える 2

0

PerfMonitor.exe の出力をもう少し詳しく調べました。「誘導」とラベル付けされたすべての GC が実際に System.GC.Collect によって誘導されているかどうかはわかりません。すべての Gen 1 GC には Reason="Induced" というラベルが付けられ、Gen 0 GC にはすべて Reason="SmallAlloc" というラベルが付けられているようです。Gen2 GC には Reason="LowMemory" というラベルが付いています。

.NET Induced GC を追跡するためのパフォーマンス カウンターがあります。私はそのパフォーマンス カウンターを監視しましたが、私のプロセスで誘発された GC は表示されません。したがって、Perfmonitor.exe が私を誤解させたと結論付けます。

于 2011-05-24T12:41:46.843 に答える
0

ここで GC.Collect() は問題ではないと推測したようですが、参考までに、過去に GC.Collect にブレークポイントを設定することに成功しましたハプニング。

ブレークポイントの場所を System.GC.Collect に設定して試してみてください。この戦術を使用して、フレームワーク ブレークポイントの設定に成功することもあれば、成功しないこともあります。メソッド/プロパティの呼び出しが最適化されているためなのか、それとも他の理由なのかはわかりません。しかし、それは常に試してみる価値があります。Tools->Options->Debug セクションで "Just My Code" を無効にするなどの操作が必要になる場合があります。

于 2011-05-26T20:09:30.430 に答える