2012-03-28 3 views
2

У меня есть многопоточное приложение .NET, зависающее в событии OnUserPreferenceChanged. Обычно это вызвано управлением или интерфейсом пользовательского интерфейса, запущенным в фоновом потоке (см., Например, http://www.ikriv.com/en/prog/info/dotnet/MysteriousHang.html), но насколько я могу судить, это не так. Я проверил это, установив точку останова в WindowsFormsSynchronizationContext (как предложено здесь http://www.aaronlerch.com/blog/2008/12/15/debugging-ui/), и он создается только один раз в основном потоке пользовательского интерфейса.Получить детали объекта из выхода clrstack в windbg

Вот выход из clrstack в 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)

Последний метод, который я могу получить информацию о парах является:

0013f084 7a92ed62 Microsoft.Win32.SystemEvents + SystemEventInvokeInfo .Invoke (Boolean, System.Object []) ПАРАМЕТРЫ: это = 0x01404420 checkFinalization = 0x00000001 арг = 0x0144a298

Вот мой вопрос: как я могу получить дополнительную информацию здесь? В конечном счете, я хотел бы знать, какие объекты и/или потоки для этого Invoke. Что-то вроде «! Do 0x01404420» или «! Do 0x0144a298», но я не знаю, куда идти оттуда.

ответ

1

Поиск исключений в куче с использованием! Dumpheap-type Exception.

Также вы можете увидеть значение переменных в классе, которое будет полезно для понимания состояния класса. Использовать! Dumpheap-type ClassName. Вы получите адрес MT (таблица методов). От адреса MT см. Адрес объекта. Используйте адрес do, чтобы сбросить класс.

Используйте !syncblk, чтобы увидеть заблокированные темы

+0

Это хорошая информация, но в этом случае у меня есть известный сценарий тупиковый: Thread 0 ждет, чтобы вызвать OnUserPreferenceChanged событие в какой-то другой поток. Мне просто нужно знать, к какому потоку он обращается. – JMH

Смежные вопросы