2009-04-17 8 views
2

J'ai une application Winform (C#) qui importe certaines fonctions de dll.comprendre la sortie WinDbg

Parfois, lors de l'exécution de l'application i obtenir l'exception suivante:

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

je l'attrape dans AppDomain.CurrentDomain.UnhandledException. J'ai donc essayé de déboguer avec WinDbg. J'ai pu intercepter l'exception et obtenir la sortie suivante:

analyser -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 

Qu'est-ce que cela signifie? et que dois-je faire avec?

Merci d'avance pour tous les conseils !!

Répondre

2

Il ressemble ure.dll a été déchargé, et un appel à NlsAnsiToUnicode MultiByteToWideChar() se référant à elle échoue. Vous pouvez exécuter .symfix avant !analyze -v pour le confirmer.

Est-ce la DLL que vous importez? Sinon, vous avez une corruption de mémoire. Sinon, le bug est probablement dans cette DLL. Utilisez-vous P/Invoke pour l'importer?


Oui, les informations DLL déchargées ont été endommagées. Comme vous pouvez le deviner, c'est culture.dll de .NET, et Windbg lit la partie «culte» de cela comme l'horodatage et la somme de contrôle. Essayez de redémarrer et de faire ce qui suit:

.symfix 
sxe ud 
g 

et quand les coups de points d'arrêt:

kb 

(Cela dit Windbg à courir jusqu'à ce que la DLL est déchargée, puis vider la pile)

Run pour laisser un peu le module se décharger, et exécutez la commande suivante. Ensuite, laissez Windbg courir jusqu'à ce que vous obtenez l'exception, et faire à nouveau cette commande pour comparer:

db ntdll!RtlpUnloadEventTrace 

(C'est le début de la table du module déchargé, ce qui est d'obtenir endommagé.)

+0

Je ne suis pas en utilisant cette dll. Je ne l'ai pas non plus sur mon ordinateur. Je n'en ai jamais entendu parler auparavant. Aucune idée pourquoi essaie-t-il de le charger. Cependant, il est déchargé: modules à vide: 00000001 4333ab5a ure.dll Timestamp: Mar Mar 31 01:56:51 1970 (00750063) Checksum: 0074006C Aussi quand j'exercerai analyser -v, avant de me donner les résultats il affiche: *** AVERTISSEMENT: Impossible de vérifier l'horodatage de ure.dll *** ERREUR: Le chargement du module est terminé mais les symboles n'ont pas pu être chargés pour ure.dll Aide! – Anya

+0

oh oui je ne m'en suis pas rendu compte! À quel moment dois-je exécuter ces commandes? juste après l'exception est censuré? avant d'analyser? après? avant d'aller? Merci beaucoup! :) – Anya

+0

avant que l'exception soit interceptée. – Mark