从windbg中的clrstack输出获取对象详细信息

时间:2012-03-28 15:36:13

标签: c# .net clr windbg

我有一个挂在OnUserPreferenceChanged事件上的多线程.NET应用程序。这通常是由在后台线程上启动的UI控件或消息循环引起的(参见例如http://www.ikriv.com/en/prog/info/dotnet/MysteriousHang.html),但据我所知,这不是这种情况。我通过在WindowsFormsSynchronizationContext中设置一个断点来验证这一点(如http://www.aaronlerch.com/blog/2008/12/15/debugging-ui/所示),并且它只在主UI线程中构造一次。

这是来自windbg中的!clrstack的输出:

  

0013eea8 7c90e514 [HelperMethodFrame_1OBJ:0013eea8]   System.Threading.WaitHandle.WaitOneNative(Microsoft.Win32.SafeHandles.SafeWaitHandle,   UInt32,布尔值,布尔值)0013ef54 792b68af   System.Threading.WaitHandle.WaitOne(Int64,Boolean)0013ef70 792b6865   System.Threading.WaitHandle.WaitOne(Int32,Boolean)0013ef84 7b6f1a4f   System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle)   0013ef98 7ba2d68b   System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control的,   System.Delegate,System.Object [],Boolean)0013f038 7b6f33ac   System.Windows.Forms.Control.Invoke(System.Delegate,System.Object [])   0013f06c 7b920bd7   System.Windows.Forms.WindowsFormsSynchronizationContext.Send(System.Threading.SendOrPostCallback,   System.Object)0013f084 7a92ed62   Microsoft.Win32.SystemEvents + SystemEventInvokeInfo.Invoke(布尔,   System.Object [])0013f0b8 7a92dc8f   Microsoft.Win32.SystemEvents.RaiseEvent(Boolean,System.Object,   System.Object [])0013f104 7a92e227   Microsoft.Win32.SystemEvents.OnUserPreferenceChanged(Int32,IntPtr,   IntPtr)0013f124 7aaa06ec   Microsoft.Win32.SystemEvents.WindowProc(IntPtr,Int32,IntPtr,IntPtr)

我可以获得参数信息的最后一个方法是:

  

0013f084 7a92ed62   Microsoft.Win32.SystemEvents + SystemEventInvokeInfo.Invoke(布尔,   System.Object的[])       参数:           这= 0x01404420           checkFinalization = 0x00000001           args = 0x0144a298

以下是我的问题:如何在此处获取更多信息?最后,我想知道这个Invoke用于哪些对象和/或线程。像“!do 0x01404420”或“!do 0x0144a298”之类的东西,但我不知道从那里去哪里。

2 个答案:

答案 0 :(得分:1)

使用!dumpheap -type异常搜索堆中的异常。

您还可以在类中看到变量的值,这对于理解类的状态很有用。使用!dumpheap -type ClassName。您将获得MT(方法表)地址。从MT地址看到对象地址。使用!do地址转储类。

使用!syncblk查看锁定的主题

答案 1 :(得分:0)

关于由SystemEvents类(尤其是OnUserPreferenceChanged事件)引起的问题,请尝试使用this answer中的CheckSystemEventsHandlersForFreeze()函数,该函数可以帮助查找根本原因,即哪个控件是在错误的线程上创建的,从而导致冻结。 / p>