我有一个挂在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”之类的东西,但我不知道从那里去哪里。
答案 0 :(得分:1)
使用!dumpheap -type异常搜索堆中的异常。
您还可以在类中看到变量的值,这对于理解类的状态很有用。使用!dumpheap -type ClassName。您将获得MT(方法表)地址。从MT地址看到对象地址。使用!do地址转储类。
使用!syncblk查看锁定的主题
答案 1 :(得分:0)
关于由SystemEvents类(尤其是OnUserPreferenceChanged事件)引起的问题,请尝试使用this answer中的CheckSystemEventsHandlersForFreeze()函数,该函数可以帮助查找根本原因,即哪个控件是在错误的线程上创建的,从而导致冻结。 / p>