簡體   English   中英

.net WinDbg強句泄漏

[英].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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM