2012-02-01 21 views
10

Mam plik crash-dump (moja 32-bitowa aplikacja Windows uległa awarii na komputerze klienta). Kod wyjątku to 0xE06D7363. Tak więc znalazłem ten article z blogów MSDN na temat dekodowania parametrów wyjątków. Ale przepis z tego artykułu nie działa dla mnie:Dekodowanie parametrów wyrzuconego wyjątku C++ (0xE06D7363)

0:000> .exr -1 
ExceptionAddress: 753ad36f (KERNELBASE!RaiseException+0x00000058) 
    ExceptionCode: e06d7363 (C++ EH exception) 
    ExceptionFlags: 00000001 
NumberParameters: 3 
    Parameter[0]: 19930520 
    Parameter[1]: 0052ccd8 
    Parameter[2]: 564099d8 
0:000> dd 564099d8 l4 
564099d8 00000000 00000000 00000000 564099d0 
0:000> dd 564099d0 l2 
564099d0 00000001 564099b4 
0:000> dd 564099b4 l2 
564099b4 00000001 56454aec 
0:000> da 56454aec+8 
56454af4 "????????????????????????????????" 
56454b14 "????????????????????????????????" 
56454b34 "????????????????????????????????" 
56454b54 "????????????????????????????????" 
56454b74 "????????????????????????????????" 
56454b94 "????????????????????????????????" 
56454bb4 "????????????????????????????????" 
56454bd4 "????????????????????????????????" 
56454bf4 "????????????????????????????????" 
56454c14 "????????????????????????????????" 
56454c34 "????????????????????????????????" 
56454c54 "????????????????????????????????" 

Jak mogę uruchomić tę metodę? A może istnieją inne sposoby analizowania crash-dump z tym wyjątkiem?

Poniżej kilka informacji z !analyze -v:

PROCESS_NAME: ArcMap.exe 
MODULE_NAME: arcmap 
FAULTING_MODULE: 76fa0000 ntdll 
DEBUG_FLR_IMAGE_TIMESTAMP: 4e793643 
ERROR_CODE: (NTSTATUS) 0xe06d7363 - <Unable to get error code text> 
EXCEPTION_CODE: (NTSTATUS) 0xe06d7363 - <Unable to get error code text> 
EXCEPTION_PARAMETER1: 19930520 
EXCEPTION_PARAMETER2: 0052ccd8 
EXCEPTION_PARAMETER3: 564099d8 

Odpowiedz

11

Są tam wiele szczegółów technicznych związanych. Mogę ci podać kierunek.

Drugi parametr wyjątku (0052ccd8) jest wskaźnikiem do struktury _s__ThrowInfo, która opisuje typ rzucany. Trzeci parametr (564099d8) jest wskaźnikiem do wyrzucanego obiektu.

Po pierwsze, omówmy typ rzucanego obiektu. _s__ThrowInfo wskazuje na stałą strukturę (generowaną podczas kompilacji), która znajduje się wewnątrz pliku wykonywalnego (EXE lub DLL), który jest mapowany do przestrzeni adresowej procesu.

Jeśli w zrzucie pamięci znajduje się pamięć globalna - można ją tam znaleźć. W przeciwnym razie możesz wydedukować go z pliku wykonywalnego. Odejmij "bazowy" adres z twojego pliku wykonywalnego (zakładając, że został załadowany na preferowany adres), a otrzymasz przesunięcie tej struktury w twoim pliku wykonywalnym.

Dekodowanie rzeczywistego typu z tej struktury jest trudne. Obejmuje informacje o typach, do których może być użyty (polimorfizm C++) plus d tor (destruktor) w przypadku, gdy nie jest trywialny (z niebanalnym dachem) i został zgłoszony jako wartość zaniżona. Tabela typów może być rzutowana, aby zawierać wskaźniki do odpowiednich struktur opisujących te typy. Między innymi istnieją tekstowe "kodowania" tych typów.

Informacja o układ tych struktur można znaleźć here:

Następnie rzucony przedmiot. Jego adres zwykle należy do pamięci stosu (ściśle rzecz biorąc nie jest to obowiązkowe, można rzutować obiekt globalny lub przydzielany dynamicznie (na stos), ale zazwyczaj tak nie jest). Jeśli stos zawiera się w zrzucie awaryjnym - zobaczysz układ obiektu. W połączeniu z typem (miejmy nadzieję) uświadomisz sobie, co to znaczy.

Jeśli w zrzucie awaryjnym nie ma pamięci stosu, nie można odzyskać obiektu.

Ponadto obiekt może zawierać elementy, które są wskaźnikiem do innych rzeczy (takich jak łańcuchy lub inne obiekty), które niekoniecznie muszą być przydzielone na stosie. Najprawdopodobniej nie zdasz sobie sprawy z tych członków, chyba że masz zrzut pamięci.

1

stare pytanie i bardzo późno odpowiedzi (pytanie pojawiło się w aktywnej liście tak odpowiadasz)

sedno Raymond Chen Valdos odpowiedzieć w skrypcie consice

0:000> dt _s_throwinfo pCatchableTypeArray[0]->arrayOfCatchableTypes->pType->name @@c++(((ntdll!_EXCEPTION_RECORD *) @@masm(@esp+4))->ExceptionInformation[2]) 
cppexept!_s_ThrowInfo 
    +0x00c pCatchableTypeArray          : [0] 
     +0x004 arrayOfCatchableTypes          : [0] 
     +0x004 pType              : 
      +0x008 name              : [0] ".PAD"