2012-03-28 14 views
2

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.

Antwort

1

Suche nach Ausnahmen im Heap mithilfe von! Dumpheap -Typ Exception.

Sie können auch den Wert von Variablen in einer Klasse sehen, was nützlich sein wird, um den Zustand der Klasse zu verstehen. Verwenden Sie! Dumpheap - type Klassenname. Sie erhalten eine MT (Method Table) -Adresse. Von der MT-Adresse aus sehen Sie die Objektadresse. Verwenden Sie die Adresse, um die Klasse auszugeben.

Verwenden !syncblk die gesperrten Themen

+0

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