2015-04-12 63 views
4

對象根這裏是我的類試圖找到使用CLR MD

namespace MyNamespace 
{ 
    public class MyClass 
    { 
     private byte[] imageBytes = null; 

     public MyClass() { } 

     public void LoadImage(string filePath) 
     { 
      Image img = Image.FromFile(filePath); 
      using (MemoryStream mStream = new MemoryStream()) 
      { 
       img.Save(mStream, img.RawFormat); 
       imageBytes = mStream.ToArray(); 
      } 
     } 

     public void RemoveImage() 
     { 
      imageBytes = null; 
     } 
    } 
} 

並且這是它如何被使用

static void Main(string[] args) 
    { 
     MyClass mc = new MyClass(); 

     mc.LoadImage(@"C:\Images\myImage.jpg"); 

     Console.WriteLine("take process dump now..."); 
     Console.Read(); 
     mc.RemoveImage(); 
    } 

我運行該程序,並採取一個進程快照。毫不奇怪,這裏是我發現的有關MyClass的參考資料。

0:000> !DumpHeap -type MyClass 
     Address    MT  Size 
0000000002b92e08 000007fe73423a20  24  

Statistics: 
       MT Count TotalSize Class Name 
000007fe73423a20  1   24 MyNamespace.MyClass 
Total 1 objects 
0:000> !GCRoot 0000000002b92e08 
Thread 3b3c: 
    00000000004eef90 000007fe7354011f MyTestApp.Program.Main(System.String[]) [c:\Projects\MyTestApp\Program.cs @ 17] 
     caller.rsp-30: 00000000004eefb0 
      -> 0000000002b92e08 MyNamespace.MyClass 

Found 1 unique roots (run '!GCRoot -all' to see all roots). 

現在我想看看是否可以使用CLR MD在同一個轉儲文件中獲取MyClass實例的相同根。爲此,我使用GCRoot樣本。這個應用程序的輸入之一是ulong obj。我不確定如何爲MyClass實例獲取這個,所以我所做的是在GCRoot示例的Main方法中,我添加了followinng代碼。

foreach (ulong obj2 in heap.EnumerateObjects()) 
{ 
    ClrType type2 = heap.GetObjectType(obj2); 
    if (type2.Name.StartsWith("MyNamespace.MyClass")) 
     obj = obj2; 
} 

這樣,我看到obj是得到一個有效的值,但問題是,下面的代碼行沒有找到任何節點總是返回NULL。

Node path = FindPathToTarget(heap, root); 

因此,我不確定如何從此轉儲文件中獲取根MyClass實例的根。任何建議將不勝感激。

回答

4

ClrMD絕對可用於創建與!GCRoot相同的輸出,GCRoot示例僅僅不如windbg!GCRoot命令詳細闡述。

在你的情況下,對象「MyClass」是一個根(來自主線程的局部變量),並且該示例不返回任何內容。

你可以檢查Heap.EnumerateRoots()返回的ClrRoot,你會發現你的對象類型爲「MyClass」。