2012-02-01 20 views
10

के पैरामीटर को डीकोड करना मुझे एक क्रैश-डंप फ़ाइल मिली है (मेरा 32-बिट विंडोज एप्लिकेशन ग्राहक कंप्यूटर पर क्रैश हो गया है)। अपवाद कोड 0xE06D7363 है। इसलिए, मुझे अपवाद पैराम को डीकोड करने के बारे में एमएसडीएन ब्लॉग से यह article मिला। लेकिन लेख से एक नुस्खा मेरे लिए काम नहीं करता है:फेंकने वाले सी ++ अपवाद (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 "????????????????????????????????" 

मैं इस विधि को कैसे काम कर सकता हूं? या शायद इस अपवाद के साथ क्रैश-डंप का विश्लेषण करने के अन्य तरीके हैं?

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 

उत्तर

11

कई तकनीकी शामिल विवरण वहाँ कर रहे हैं:

नीचे !analyze -v से कुछ जानकारी है। मैं आपको दिशा दे सकता हूं।

दूसरा अपवाद पैरामीटर (0052ccd8) _s__ThrowInfo संरचना के लिए एक सूचक है, जो फेंकने वाले प्रकार का वर्णन करता है। तीसरा पैरामीटर (564099d8) फेंक दिया ऑब्जेक्ट के लिए एक सूचक है।

सबसे पहले फेंक दिया ऑब्जेक्ट प्रकार पर चर्चा करें। _s__ThrowInfo एक स्थिर संरचना (संकलन-समय पर उत्पन्न) को इंगित करता है, जो आपके निष्पादन योग्य (EXE या DLL) के भीतर रहता है, जिसे प्रक्रिया पता स्थान में मैप किया जाता है।

यदि वैश्विक मेमोरी आपके क्रैश डंप में शामिल है - तो आप इसे वहां पा सकते हैं। अन्यथा आप इसे निष्पादन योग्य से घटा सकते हैं। अपने निष्पादन योग्य से "आधार" पता घटाएं (मान लीजिए कि इसे अपने पसंदीदा पते पर लोड किया गया था), और आपको अपने निष्पादन योग्य के भीतर इस संरचना का ऑफसेट मिल जाएगा।

इस संरचना से वास्तविक प्रकार को डीकोड करना बहुत मुश्किल है। इसमें उन प्रकारों के बारे में जानकारी शामिल है जिन्हें इसे (सी ++ पॉलिमॉर्फिज्म), साथ ही डी टोर (विनाशक) के रूप में देखा जा सकता है, यदि यह एक गैर-तुच्छ प्रकार (गैर-तुच्छ डीओआर के साथ) है और इसे मूल्य-मूल्य से फेंक दिया गया है। उन प्रकारों की तालिका को उन प्रकारों का वर्णन करने वाले उपयुक्त संरचनाओं में पॉइंटर्स रखने के लिए डाला जा सकता है। अन्य चीजों के अलावा उन प्रकार के पाठ "एन्कोडिंग" हैं।

उन संरचनाओं के लेआउट के बारे में जानकारी here पाया जा सकता है:

इसके बाद, फेंक दिया वस्तु। इसका पता आमतौर पर स्टैक मेमोरी से संबंधित होता है (सख्ती से यह अनिवार्य नहीं है, कोई भी वैश्विक या गतिशील रूप से आवंटित (ऑन-हीप) ऑब्जेक्ट फेंक सकता है। लेकिन आमतौर पर यह मामला नहीं है)। यदि आपके क्रैश डंप में स्टैक शामिल है - तो आप ऑब्जेक्ट लेआउट देखेंगे। उस प्रकार के साथ मिलकर आप उम्मीद करेंगे (उम्मीद है) इसका क्या अर्थ है।

यदि आपके पास आपके क्रैश डंप में स्टैक मेमोरी शामिल नहीं है - तो आप ऑब्जेक्ट को पुनर्प्राप्त करने में सक्षम नहीं होंगे।

इसके अतिरिक्त आपके ऑब्जेक्ट में ऐसे सदस्य हो सकते हैं जो अन्य चीजों (जैसे स्ट्रिंग्स या अन्य ऑब्जेक्ट्स) के सूचक हैं, जो स्टैक पर आवंटित नहीं हो सकते हैं। संभवतः आप उन सदस्यों को महसूस करने में असफल हो जाएंगे, जब तक कि आपके पास पूर्ण-स्मृति डंप न हो।

1

वर्ष प्रश्न और एक बहुत देर से जवाब

रेमंड चेन और valdos का सार एक 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"