Получить информацию об объекте из вывода clrstack в windbg - PullRequest
2 голосов
/ 28 марта 2012

У меня есть многопоточное приложение .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:

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 args = 0x0144a298

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

Ответы [ 2 ]

1 голос
/ 29 марта 2012

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

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

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

0 голосов
/ 11 октября 2018

Что касается проблем, вызванных классом SystemEvents и, в частности, событием OnUserPreferenceChanged, попробуйте использовать функцию CheckSystemEventsHandlersForFreeze () в этом ответе , который может помочь найти основную причину, т. Е. Какие элементы управления были созданы в неправильном потоке и, следовательно, вызывают замораживать.

...