2012-02-01 22 views
10

Tôi đã có tệp kết xuất sự cố (ứng dụng cửa sổ 32 bit của tôi đã gặp sự cố trên máy tính của khách hàng). Mã ngoại lệ là 0xE06D7363. Vì vậy, tôi tìm thấy điều này article từ MSDN blog về giải mã params ngoại lệ. Nhưng một công thức từ bài viết không hiệu quả đối với tôi:Giải mã các tham số của ngoại lệ C++ bị ném (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 "????????????????????????????????" 

Tôi làm cách nào để phương pháp này hoạt động? Hoặc có thể có nhiều cách khác để phân tích sự cố đổ rác với ngoại lệ này?

Dưới đây là một số thông tin từ !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 

Trả lời

11

Có rất nhiều chi tiết kỹ thuật liên quan. Tôi có thể cho bạn hướng đi.

Thông số ngoại lệ thứ 2 (0052ccd8) là một con trỏ đến cấu trúc _s__ThrowInfo, mô tả loại được ném. Tham số thứ 3 (564099d8) là một con trỏ đến đối tượng được ném.

Trước tiên, hãy thảo luận về loại đối tượng được ném. Các _s__ThrowInfo điểm đến một cấu trúc không đổi (được tạo ra tại thời gian biên dịch), nằm trong tệp thực thi của bạn (EXE hoặc DLL), được ánh xạ vào không gian địa chỉ tiến trình.

Nếu bộ nhớ chung được đưa vào bãi chứa sự cố - bạn có thể tìm thấy nó ở đó. Nếu không, bạn có thể suy ra nó từ thực thi. Trừ địa chỉ "cơ sở" khỏi tệp thực thi của bạn (giả sử nó được tải tại địa chỉ ưa thích của nó) và bạn sẽ nhận được phần bù đắp của cấu trúc này trong tệp thi hành của bạn.

Giải mã loại thực tế từ cấu trúc này là loại khó khăn. Nó bao gồm các thông tin về các loại nó có thể được đúc thành (C++ đa hình), cộng d'tor (destructor) trong trường hợp nó là một loại không tầm thường (với d'tor không tầm thường) và nó đã được ném theo giá trị. Bảng loại có thể được đúc để chứa các con trỏ tới các cấu trúc thích hợp mô tả các loại đó. Trong số những thứ khác có "mã hóa" văn bản của các loại đó.

Thông tin về bố trí của những cấu trúc có thể được tìm thấy here:

Tiếp theo, đối tượng ném. Địa chỉ của nó thường thuộc về bộ nhớ ngăn xếp (nghiêm túc nói điều này là không bắt buộc, người ta có thể ném đối tượng toàn cầu hoặc được cấp phát động (trên heap). Nhưng điều này thường không phải là trường hợp). Nếu bạn có ngăn xếp được bao gồm trong bãi chứa sự cố - bạn sẽ thấy bố cục đối tượng. Cùng với các loại bạn sẽ (hy vọng) nhận ra những gì nó có nghĩa là.

Nếu bạn không có bộ nhớ ngăn xếp được bao gồm trong bãi chứa sự cố - bạn sẽ không thể khôi phục đối tượng.

Ngoài ra đối tượng của bạn có thể chứa các thành viên trỏ đến những thứ khác (như chuỗi hoặc các đối tượng khác) có thể không nhất thiết phải được cấp phát trên ngăn xếp. Hầu hết có thể bạn sẽ không nhận ra những thành viên đó, trừ khi bạn có toàn bộ bộ nhớ.

1

câu hỏi cũ và một câu trả lời rất muộn (câu hỏi hiện lên trong danh sách hoạt động để trả lời)

các ý chính của raymond chen và valdos trả lời trong một kịch bản 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"