ClrMDは、ライブ実行可能ファイルまたはメモリ ダンプを検査するための優れたツールです。すべてのマネージド ヒープ オブジェクトをサマリーとしてダンプするには、使用できます
https://blogs.msdn.microsoft.com/dotnet/2013/05/01/net-crash-dump-and-live-process-inspection/
var stats = from o in heap.EnumerateObjects()
let t = heap.GetObjectType(o)
group o by t into g
let size = g.Sum(o => (uint)g.Key.GetSize(o))
orderby size
select new
{
Name = g.Key.Name,
Size = size,
Count = g.Count()
};
foreach (var item in stats)
Console.WriteLine("{0,12:n0} {1,12:n0} {2}", item.Size, item.Count, item.Name);
これはうまく機能し、SOS 拡張機能を使用した Windbg の! DumpHeap -statと同等です。回帰テストでは、テスト後にオブジェクトがリークされたかどうかを確認することが望ましい場合がよくあります。これは上記のコードに完全に適合しているように見えますが、残念ながら、ルート化されていないオブジェクトが存在する可能性があるため、誤検知が発生しますが、それらはまだ概要に報告されています。それは報告されたリークにつながる可能性がありますが、何もありません.
SOSは、 -liveスイッチを!DumpHeapに追加することで、この問題を軽減しました。ライブオブジェクトのみを取得するための同等のClrMDコードは何でしょうか?回帰テストは本当の理由でのみ失敗しますか?
ClrType.EnumerateRefsOfObjectCarefullyを使用して、ルート オブジェクト ( ClrHeap.EnumerateRoots ) が見つかるまでスタックを再帰的に移動する必要があると思いますが、そのアプローチでは、再帰的なオブジェクト グラフを追跡するために多くの一時的なハッシュセットが必要です。これがそれを行う唯一の方法ですか、それとも MS 内のどこかに既に適切でパフォーマンスの良いサンプルが利用可能です ( PerfViewソース?)。