2 Stimmen

WinDbg-Ausgabe verstehen

Ich habe eine Winform-Anwendung (C#), die einige Funktionen aus dll importiert.

Manchmal erhalte ich beim Ausführen der Anwendung die folgende Ausnahme:

System.AccessViolationException: Es wurde versucht, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass anderer Speicher beschädigt ist.

Ich fange es in AppDomain.CurrentDomain.UnhandledException .

Also habe ich versucht, es mit WinDbg zu debuggen. Ich konnte die Ausnahme abfangen und erhielt die folgende Ausgabe:

!analyze -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

Was bedeutet das? Und was soll ich damit machen?

Vielen Dank im Voraus für alle Tipps!!

2voto

Mark Punkte 6117

Es sieht so aus ure.dll wurde entladen, und ein Aufruf von NlsAnsiToUnicode MultiByteToWideChar(), die darauf verweist, schlägt fehl. Sie könnten Folgendes ausführen .symfix avant !analyze -v um dies zu bestätigen.

Ist das die DLL, die Sie importieren? Wenn nicht, haben Sie eine Speicherbeschädigung. Ansonsten liegt der Fehler wahrscheinlich in dieser DLL. Verwenden Sie P/Invoke, um sie zu importieren?


Ja, die entladenen DLL-Informationen sind beschädigt worden. Wie Sie vielleicht erraten, ist es die .NET culture.dll und Windbg liest den 'cult'-Teil davon als Zeitstempel und Prüfsumme. Versuchen Sie, neu zu starten und Folgendes zu tun:

.symfix
sxe ud
g

und wenn der Haltepunkt erreicht ist:

kb

(Damit wird Windbg angewiesen, so lange zu laufen, bis die DLL entladen ist, und dann den Stack zu löschen)

Lassen Sie das Modul eine Weile laufen, um es zu entladen, und führen Sie den folgenden Befehl aus. Lassen Sie dann Windbg laufen, bis Sie die Ausnahme erhalten, und führen Sie diesen Befehl zum Vergleich erneut aus:

db ntdll!RtlpUnloadEventTrace

(Das ist der Anfang der entladenen Modultabelle, die beschädigt wird).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X