2009-04-17 4 views
2

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

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

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

я поймать его в 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 

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

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

ответ

2

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

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


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

.symfix 
sxe ud 
g 

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

kb 

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

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

db ntdll!RtlpUnloadEventTrace 

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

+0

Im не используя этот DLL. У меня также нет этого на моем компьютере. Я никогда не слышал об этом раньше. Не знаю, почему он пытается загрузить его. Тем не менее, он выгружается: выгружен модули: 00000001 4333ab5a ure.dll Отметка: Вт 31 марта 1970 1:56:51 (00750063) Контрольная сумма: 0074006C Кроме того, когда я выполнить анализ -v, прежде чем давать мне результаты он отображает: *** ВНИМАНИЕ: Не удалось проверить временную метку для ure.dll *** ОШИБКА: загрузка модуля завершена, но символы не могут быть загружены для ure.dll Помощь! – Anya

+0

о да не понял это! В какой момент мне нужно запустить эти команды? сразу после исключения? перед анализом? после? прежде чем идти? Спасибо многим! :) – Anya

+0

до того, как исключение поймано. – Mark

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