2012-03-28 23 views
2

私はOnUserPreferenceChangedイベントでハングするマルチスレッド.NETアプリケーションを持っています。これは、通常、バックグラウンドスレッド(たとえばhttp://www.ikriv.com/en/prog/info/dotnet/MysteriousHang.htmlを参照)で開始されたUIコントロールまたはメッセージループによって発生しますが、ここではそうではないことがわかります。 WindowsFormsSynchronizationContext(ここで示唆したように、http://www.aaronlerch.com/blog/2008/12/15/debugging-ui/)にブレークポイントを設定することでこれを確認しました。これはメインのUIスレッドで一度しか構築されません。windbgのclrstack出力からオブジェクトの詳細を取得

ここでwindbgの中clrstackからの出力です:!の

0013eea8 7c90e514 [HelperMethodFrame_1OBJ:0013eea8] System.Threading.WaitHandle.WaitOneNative(Microsoft.Win32.SafeHandles.SafeWaitHandle、 UInt32型、ブール、ブール) 0013ef54 792b68af System.Threading.WaitHandle.WaitOne(Int64型、ブール型)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(ブール、System.Objectの、 System.Objectの[])0013f104 7a92e227 Microsoft.Win32.SystemEvents.OnUserPreferenceChanged(のInt32、のIntPtr、 のIntPtr)0013f124 7aaa06ec私は上のparam情報を取得することができますMicrosoft.Win32.SystemEvents.WindowProc(のIntPtr、のInt32、のIntPtr、のIntPtr)

最後の方法は次のとおりです。

0013f084 7a92ed62 Microsoft.Win32.SystemEvents + SystemEventInvokeInfo .Invoke(ブール、 System.Objectの[]) PARAMETERS: この= 0x01404420 checkFinalization = 0x00000001の 引数= 0x0144a298

ここに私の質問です:どのように私はここでより多くの情報を得ることができますか?最終的には、このInvokeの対象となるオブジェクトやスレッドを知りたいと思います。 "!do 0x01404420"や "!do 0x0144a298"のようなものですが、そこからどこに行くのかはわかりません。

答えて

1

!dumpheap -type Exceptionを使用してヒープ内の例外を検索します。

また、クラスの状態を理解するのに便利な、クラス内の変数の値を見ることができます。 !dumpheap -type ClassNameを使用してください。 MT(Method Table)アドレスを取得します。 MTアドレスからオブジェクトアドレスを参照してください。 !doアドレスを使用してクラスをダンプします。

使用!syncblkロックされたスレッド

+0

を参照するには良い情報ですが、この場合には、私は知らデッドロックのシナリオを持っていること:スレッド0が他のスレッドにOnUserPreferenceChangedイベントを呼び出すために待っています。私はちょうどそれが呼び出すスレッドを知る必要があります。 – JMH

関連する問題