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



我有一个挂起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线程中构造一次。

这是的输出!clrstack in windbg:

0013eea8 7c90e514[帮助方法框架_1OBJ:0013 eea8]System.Threading.WaitHandle.WaitOneNative(Microsoft.Win32.SafeHandles.SafeWaitHandle,UInt32,布尔,布尔)0013ef54 792b68afSystem.Threading.WaitHandle.WaitOne(Int64,布尔值)0013ef70 792b6865System.Threading.WaitHandle.WaitOne(Int32,布尔值)0013ef84 7b6f1a4fSystem.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle)0013ef98 7ba2d68bSystem.Windows.Forms.Control.MarshedInvoke(System.Windows.Fforms.Control,System.Delegate,System.Object[],布尔值)0013f038 7b6f33cSystem.Windows.Forms.Control.IInvoke(System.Delegate,System.Object[])0013f06c 7b920bd7System.Windows.Forms.WindowsFormsSynchronizationContext.Send(System.Threading.SendOrPostCallback,System.Object)0013f084 7a92ed62Microsoft.Win32.SystemEvents+SystemEventInvokeInfo.Invoke(布尔值,System.Object[])0013f0b8 7a92dc8fMicrosoft.Win32.SystemEvents.RaiseEvent(布尔值、System.Object、,System.Object[])0013f104 7a92e227Microsoft.Win32.SystemEvents.OnUserPreferenceChanged(Int32、IntPtr、,IntPtr)0013f124 7aaa06ecMicrosoft.Win32.SystemEvents.WindowProc(IntPtr、Int32、IntPtr和IntPtr)

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

0013f084 7a92第62页Microsoft.Win32.SystemEvents+SystemEventInvokeInfo.Invoke(布尔值,System.Object[])参数:这个=0x01404420checkFinalization=0x00000001args=0x0144a298

我的问题是:如何在这里获得更多信息?最后,我想知道Invoke是为哪些对象和/或线程而调用的。类似于"!do 0x01404420"或"!do x0144a298",但我不知道该从哪里开始。

使用在堆中搜索异常!dumpeap-类型异常。

您还可以看到类中变量的值,这将有助于了解类的状态。使用dumpeap-类型ClassName。您将得到一个MT(方法表)地址。从MT地址看对象地址。使用do address来转储类。

使用!syncblk查看锁定的线程

关于SystemEvents类,特别是OnUserPreferenceChanged事件引起的问题,请尝试在这个答案中使用CheckSystemEventsHandlersForFreeze()函数,它可以帮助找到根本原因,即哪些控件是在错误的线程上创建的,从而导致冻结。

最新更新