понимание вывода WinDbg - PullRequest
       33

понимание вывода WinDbg

2 голосов
/ 17 апреля 2009

У меня есть приложение Winform (C #), которое импортирует некоторые функции из dll.

Иногда при запуске приложения я получаю следующее исключение:

System.AccessViolationException: попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Я ловлю это в AppDomain.CurrentDomain.UnhandledException.

Поэтому я попытался отладить его с помощью WinDbg. Мне удалось поймать исключение и получить следующий вывод:

! Анализировать -v

FAULTING_IP: 
KERNEL32!SetErrorMode+14b
77e6c427 8a08            mov     cl,byte ptr [eax]

EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 77e6c427 (KERNEL32!SetErrorMode+0x0000014b)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 087deadc
Attempt to read from address 087deadc

FAULTING_THREAD:  00000b1c

PROCESS_NAME:  App.exe

ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at "0x%08lx" referenced memory at "0x%08lx". The memory could not be "%s".

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at "0x%08lx" referenced memory at "0x%08lx". The memory could not be "%s".

EXCEPTION_PARAMETER1:  00000000

EXCEPTION_PARAMETER2:  087deadc

READ_ADDRESS:  087deadc 

FOLLOWUP_IP: 
KERNEL32!SetErrorMode+14b
77e6c427 8a08            mov     cl,byte ptr [eax]

NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

MANAGED_STACK: !dumpstack -EE
OS Thread Id: 0xb1c (34)
Current frame: 
ChildEBP RetAddr  Caller,Callee

ADDITIONAL_DEBUG_TEXT:  Followup set based on attribute [UnloadedModule_Arch_AX] from Frame:[0] on thread:[b1c] ; Enable Pageheap/AutoVerifer

DEFAULT_BUCKET_ID:  HEAP_CORRUPTION

PRIMARY_PROBLEM_CLASS:  HEAP_CORRUPTION

BUGCHECK_STR:  APPLICATION_FAULT_HEAP_CORRUPTION_INVALID_POINTER_READ

LAST_CONTROL_TRANSFER:  from 7a0aa797 to 77e6c427

STACK_TEXT:  
WARNING: Stack unwind information not available. Following frames may be wrong.
08bddc6c 7a0aa797 00000000 00000001 087deadc KERNEL32!SetErrorMode+0x14b
08bddd68 7c82a124 056306e8 08bddf9c 7c82a0b8 mscorwks!CorLaunchApplication+0x281f8
08bddd74 7c82a0b8 7c82a0fc 00000001 00000004 ntdll!RtlpAllocateFromHeapLookaside+0x13
08bddf9c 00000000 00000000 00000000 00000000 ntdll!RtlAllocateHeap+0x1dd


STACK_COMMAND:  .ecxr ; ~~[b1c] ; .frame 0 ; ~34s ; kb

SYMBOL_NAME:  ure.dll!Unloaded

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: ure.dll

IMAGE_NAME:  ure.dll

DEBUG_FLR_IMAGE_TIMESTAMP:  750063

FAILURE_BUCKET_ID:  HEAP_CORRUPTION_c0000005_ure.dll!Unloaded

BUCKET_ID:  APPLICATION_FAULT_HEAP_CORRUPTION_INVALID_POINTER_READ_ure.dll!Unloaded

WATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/App_exe/1_2009_403_12/49e707a9/KERNEL32_dll/5_2_3790_4062/46264680/c0000005/0002c427.htm?Retriage=1

Followup: MachineOwner

Что это значит? и что мне с этим делать?

Заранее спасибо за любые советы!

1 Ответ

2 голосов
/ 17 апреля 2009

Похоже, ure.dll был выгружен, и вызов NlsAnsiToUnicode MultiByteToWideChar (), ссылающийся на него, не удался. Вы можете запустить .symfix до !analyze -v, чтобы подтвердить это.

Это DLL, которую вы импортируете? Если нет, у вас есть повреждение памяти. В противном случае ошибка, вероятно, в этой DLL. Вы используете P / Invoke для его импорта?


Да, выгруженная информация DLL была повреждена. Как вы можете догадаться, это .NET culture.dll, и Windbg считывает «культовую» часть этого как метку времени и контрольную сумму. Попробуйте перезапустить и сделать следующее:

.symfix
sxe ud
g

и когда точка останова достигает:

kb

(Это говорит о том, что Windbg должен работать до тех пор, пока DLL не будет выгружена, а затем выгрузить стек)

Запустите немного, чтобы модуль мог выгрузиться, и выполните следующую команду. Затем дайте Windbg работать, пока не получите исключение, и снова выполните эту команду для сравнения:

db ntdll!RtlpUnloadEventTrace

(Это начало таблицы выгруженных модулей, которая повреждена.)

...