Ich habe eine Multi-threaded .NET-Anwendung, die bei einem OnUserPreferenceChanged-Ereignis hängt. Dies wird typischerweise durch ein UI-Steuerelement oder eine Nachrichtenschleife verursacht, die auf einem Hintergrund-Thread gestartet wurde (siehe z. B. http://www.ikriv.com/en/prog/info/dotnet/MysteriousHang.html), aber soweit ich das beurteilen kann, ist dies hier nicht der Fall. Ich habe dies verifiziert, indem ich im WindowsFormsSynchronizationContext einen Haltepunkt gesetzt habe (wie hier vorgeschlagen http://www.aaronlerch.com/blog/2008/12/15/debugging-ui/) und er wird nur einmal im Haupt-UI-Thread erstellt.Erhalten Sie Objektdetails von clrstack Ausgabe in Windbg
Hier ist die Ausgabe von clrstack in windbg:
0013eea8 7c90e514 [HelperMethodFrame_1OBJ: 0013eea8] System.Threading.WaitHandle.WaitOneNative (Microsoft.Win32.SafeHandles.SafeWaitHandle, UInt32, Boolean, Boolean) 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 (Boolean, 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)
Die letzte Methode, die ich param Informationen bekommen kann auf ist:
0013f084 7a92ed62 Microsoft.Win32.SystemEvents + SystemEventInvokeInfo .Invoke (Boolean, System.Object []) PARAMETER: dieses = 0x01404420 checkFinalization = 0x00000001 args = 0x0144a298
Hier ist meine Frage: Wie kann ich hier mehr Informationen bekommen? Letztendlich würde ich gerne wissen, für welche Objekte und/oder Threads diese Invoke ist. Etwas wie "! Do 0x01404420" oder "! Do 0x0144a298", aber ich weiß nicht, wohin ich von dort gehen soll.
zu sehen, dass gute Informationen ist aber in diesem Fall habe ich ein bekanntes Deadlock-Szenario: Thread 0 wartet OnUserPreferenceChanged Ereignis zu einem anderen Thread berufen. Ich muss nur wissen, zu welchem Thread es aufgerufen wird. – JMH