2012-05-06 8 views
5

मैं कुछ समय के लिए डंप फ़ाइलों को डीबग करने के लिए WinDbg का उपयोग कर रहा हूं।
एक अच्छा "चाल" है जो x86 मूल प्रोग्राम के साथ काम करता है, आप CONTEXT_ALL झंडे (0x1003f) के लिए स्टैक स्कैन कर सकते हैं।मैं x64 स्टैक में देशी अपवाद कैसे प्राप्त कर सकता हूं?

64 में CONTEXT_ALL झंडे जाहिरा तौर पर शामिल नहीं है 0x1003f ...

अब समस्या यह है कि कभी कभी जब आप प्रबंधित कोड, अपवाद (.exc या की तरह पाने की नियमित तरीकों के साथ देशी मिश्रण है। अंतिम कार्यक्रम)।

x64 में 0x1003f के बराबर क्या है? क्या ऐसा स्थिर है?

संपादित करें:

BTW, अगर आप सोच रहे थे, सिद्धांत रूप में यह 10003f क्योंकि परिभाषा के किया जाना चाहिए था:

#define CONTEXT_I386 0x00010000 
#define CONTEXT_AMD64 0x00100000 

#define CONTEXT_CONTROL    0x00000001L // SS:SP, CS:IP, FLAGS, BP 
#define CONTEXT_INTEGER    0x00000002L // AX, BX, CX, DX, SI, DI 
#define CONTEXT_SEGMENTS   0x00000004L // DS, ES, FS, GS 
#define CONTEXT_FLOATING_POINT  0x00000008L // 387 state 
#define CONTEXT_DEBUG_REGISTERS  0x00000010L // DB 0-3,6,7 
#define CONTEXT_EXTENDED_REGISTERS 0x00000020L // cpu specific extensions 
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS) 
#define CONTEXT_ALL (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS) 

#define CONTEXT_I386_FULL CONTEXT_I386 | CONTEXT_FULL 
#define CONTEXT_I386_ALL CONTEXT_I386 | CONTEXT_ALL 
#define CONTEXT_AMD64_FULL CONTEXT_AMD64 | CONTEXT_FULL 
#define CONTEXT_AMD64_ALL CONTEXT_AMD64 | CONTEXT_ALL 

लेकिन यह नहीं है ...

उत्तर

2

मैं आमतौर पर संदर्भ रिकॉर्ड खोजने के लिए अपनी कुंजी के लिए सेगमेंट रजिस्टर मानों का उपयोग करता हूं (ईएस और डीएस का वही मान होता है और CONTEXT स्टैक्चर में एक दूसरे के बगल में होते हैं)। झंडे की चाल हालांकि साफ है।

0:000> dt ntdll!_context 000df1d0 
... 
    +0x030 ContextFlags  : 0x10001f 
... 
    +0x03a SegDs   : 0x2b 
    +0x03c SegEs   : 0x2b 
... 

भी ध्यान रखें कि ContextFlags मूल्य पर नहीं है:

जांच एप्लिकेशन में एक अपवाद जबरदस्ती तो ढेर बंद संदर्भ रिकॉर्ड संरचना खुदाई, मेरे मामले में जादू मूल्य 0x10001f किया जाएगा की तरह दिखता है संरचना की शुरुआत, इसलिए यदि आप उस मान को पाते हैं तो आपको संदर्भ संरचना का आधार प्राप्त करने के लिए @@ C++ (# FIELD_OFFSET (ntdll! _CONTEXT, ContextFlags)) को घटा देना होगा।

इसके अलावा, अगर यह स्पष्ट नहीं था, तो यह मान बिल्कुल नमूना आकार से आता है। यह आपके पर्यावरण में सही नहीं हो सकता है और यह निश्चित रूप से परिवर्तन के अधीन है (जैसा कि इस तरह के कुछ कार्यान्वयन विशिष्ट है)।

+0

जो काम करता प्रतीत होता है, लेकिन संरचना की शुरुआत में ऑफसेट क्या है? मैं अभी तक इस से मेरा ढेर नहीं मिल सका। –

+0

जो मूल्य आप शिकार कर रहे हैं वह संभवतः _CONTEXT संरचना के ContextFlags फ़ील्ड का प्रतिनिधित्व करता है। जब आपको स्टैक पर जादू मान मिलता है, तो स्टैक पॉइंटर पता संरचना के ContextFlags फ़ील्ड के पते पर इंगित करता है। इस प्रकार, संरचना के आधार को प्राप्त करने के लिए आपको ContextFlags फ़ील्ड के ऑफसेट को घटाना होगा। – snoone

संबंधित मुद्दे

 संबंधित मुद्दे