2010-10-03 22 views
0

我最近在我的應用程序中追蹤了內存泄漏,我想添加一個測試用例來檢查它是否保持這種狀態。我想要做的是:從測試代碼中使用Sos(dumpheap等)?

int numberOfInstancesBeforeFunction = GetNumberOfInstancesInMemory(typeof(MyClass)); 

PerformFunction(); 

GC.Collect(); 

int numberOfInstancesAfterFunction = GetNumberOfInstancesInMemory(typeof(MyClass)); 

Assert.AreEqual(numberOfInstancesBeforeFunction, numberOfInstancesAfterFunction, "mem leak"); 

這可能嗎?

感謝,

尤安

+0

你有沒有找到一種方法從代碼實際控制sos?我希望能夠做的不僅僅是參考計數... – PeterJCLaw 2010-11-18 19:41:34

回答

0

有關於如何實現這一目標使用WeakReference從@Adam羅賓遜here接受的答案建議。

GetNumberOfInstancesInMemory會檢查MyClass對象的靜態容器WeakReference s至看到有多少回報thisReference.IsAlive = true;(並刪除任何有isAlive = false

任何建築的MyClass將參考將自身添加到靜態容器。

我想有一個優雅的LINQ的方式來封裝所需的邏輯。

我不知道是否有任何辦法做到這一點不結合額外的代碼到喲ur MyClass

+0

啊,這個效果很好。非常感謝。 – Euan 2010-10-03 14:59:22

+0

@Euan - 太棒了,但請注意@Hans Passant的重要提示,告訴你一路上新的泄漏。經典的Heisenbug機會。 – 2010-10-03 15:00:11