[英].net WinDbg strong handle leak
我發現我的程序在某個時候泄漏了,並創建了全內存轉儲(.mdmp)以便使用WinDbg進行分析。
內存泄漏的主要原因是強大的處理能力。
0:000> !gcroot 02dc02d4
HandleTable:
000b7000 (strong handle)
-> 114e3174 MyApp.Controls.Forms.TransparentOverlappingForm
-> 114e32b8 System.Windows.Forms.PropertyStore
-> 114e39dc System.Windows.Forms.PropertyStore+ObjectEntry[]
-> 02dc03a4 MyApp.Editor.Main.EditorForm
-> 02dc05cc System.ComponentModel.EventHandlerList
-> 114e3884 System.ComponentModel.EventHandlerList+ListEntry
-> 114bef3c System.ComponentModel.EventHandlerList+ListEntry
-> 114bef28 System.ComponentModel.EventHandlerList+ListEntry
-> 02dc0740 System.ComponentModel.EventHandlerList+ListEntry
-> 02dc0630 System.ComponentModel.EventHandlerList+ListEntry
-> 02dc05fc System.ComponentModel.EventHandlerList+ListEntry
-> 02dc05dc System.EventHandler
-> 02dc02d4 MyApp.Editor.Main.EditorLoad
TransparentOverlappingForm是放置在另一個控件上的窗體,用作控件來完全支持透明性(這是另一回事)。 就這樣使用
TransparentOverlappingForm.Show((Control)OverlapsOn);
TransparentOverlappingForm,EditorForm,TransparentOverlappingForm重疊的控件-全部都被關閉(如果是表單)並被處置。
僅由於未收集TransparentOverlappingForm並在內部保存指向EditorForm的鏈接,所以存在泄漏。
那么,如何查看有關“ 000b7000(強力手柄)”的信息,以找出如何對它進行GC處理?
我知道GC強句柄可以是一個靜態變量,但是我怎么知道它是一個靜態變量,它在哪里。
嗯,一如既往,當我向某人提問時,我會在此之后解決。
我以hacky的方式解決了問題,仍然存在很小的泄漏,這是由TransparentOverlappingForm引起的。
所以問題是開放的。
var propStoreControlField = typeof(Control).GetField("propertyStore", BindingFlags.Instance | BindingFlags.NonPublic);
var propStoreType = propStoreControlField.FieldType;
var propStoreSetObjectMethod = propStoreType.GetMethod("SetObject", new Type[] {typeof(int), typeof(object)});
var intPropStoreFormField = typeof(Form).GetField("PropDialogOwner", BindingFlags.Static | BindingFlags.NonPublic);
propStoreSetObjectMethod.Invoke(propStoreControlField.GetValue(Form), new object[] {intPropStoreFormField.GetValue(null), null});
Form = null;
OverlapsOn = null;
WinDbg:
0:000> !gcroot 031dcad0
HandleTable:
001f6820 (strong handle)
-> 031dcad0 MyApp.Controls.Forms.TransparentOverlappingForm
Found 1 unique roots (run '!GCRoot -all' to see all roots).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.