Отладка сбоя winform - C # [ADPlus + Windbg] - PullRequest
2 голосов
/ 15 февраля 2011

 System.AccessViolationException was unhandled
  Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
  Source=System.Windows.Forms
  StackTrace:
       at System.Windows.Forms.UnsafeNativeMethods.PeekMessage(MSG& msg, HandleRef hwnd, Int32 msgMin, Int32 msgMax, Int32 remove)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at ABC.Program.Main() in C:\Documents and Settings\...\Program.cs:line 17
  InnerException: 

Это трудно воспроизвести, исключение, очень непредсказуемо. Я подключил визуальный студийный отладчик и выполнил тест 7-10 раз и смог успешно записать эту трассировку стека. Обратите внимание, что это не мой код, поэтому на уровне Windows происходит что-то жуткое. Кстати, мы используем PInvoke для открытия / закрытия окон, таких как iexplore, блокнот и т. Д.

После некоторого - поиска - и основываясь на совете, который дал тот парень из Microsoft, я попробовал ADPlus получить дамп памяти и Windbg для анализа, но информация, которую я получаю от windbg, еще более загадочна чем само исключение.


This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(904.1cf4): Access violation - code c0000005 (first/second chance not available)
eax=003c4d10 ebx=00000000 ecx=00000000 edx=00000000 esi=003c4d2a edi=0012f1a0
eip=003c4b64 esp=0012f11c ebp=0012f138 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
003c4b64 8b410c          mov     eax,dword ptr [ecx+0Ch] ds:0023:0000000c=????????
0:000> .ecxr
eax=003c4d10 ebx=00000000 ecx=00000000 edx=00000000 esi=003c4d2a edi=0012f1a0
eip=003c4b64 esp=0012f11c ebp=0012f138 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
003c4b64 8b410c          mov     eax,dword ptr [ecx+0Ch] ds:0023:0000000c=????????

Могут быть эксперты, которые могут понять эту информацию, я не могу.

Итак, что вы, ребята, делаете, чтобы проанализировать подобные проблемы? Что-нибудь вроде «анализатора дампа кучи для JVM» для .Net?

Среда: Windows XP SP3 [полный доступ, администратор]

1 Ответ

2 голосов
/ 15 февраля 2011

В Visual Studio перейдите в свойства проекта и включите «неуправляемую отладку кода», затем запустите отладчик.

[не уверен, требуется ли следующий шаг, но я только что это сделал] выполнить .load SOS.dll в непосредственном окне визуальной студии

Я смог найти основную причинупроблема : Был выполнен обратный вызов для делегата со сборщиком мусора типа 'ABC.Form1 + SendMessageDelegate :: Invoke'.Это может вызвать сбои приложения, повреждение и потерю данных.При передаче делегатов в неуправляемый код управляемое приложение должно поддерживать их работу до тех пор, пока не будет гарантировано, что они никогда не будут вызываться.

Спасибо всем, кто оставил ответ или комментарии.

...