2010-11-04 14 views
5

मैं MiniDumpWriteDump() एपीआई का उपयोग करने के लिए एक प्रक्रिया ए से एक दुर्घटनाग्रस्त प्रक्रिया बी डंप करने के लिए क्योंकि MSDN इतना कहा कि मैं यह कर रहा हूं कोशिश कर रहा हूँ:क्या किसी अन्य प्रक्रिया में थ्रेड आईडी को जानने का कोई तरीका है जो अपवाद फेंकता है?

MiniDumpWriteDump बुलाया जाना चाहिए एक अलग प्रक्रिया से सभी पर अगर संभव है, लक्ष्य प्रक्रिया को छोड़कर।

MiniDumpWriteDump() इस रूप में परिभाषित किया गया है:

typedef struct _MINIDUMP_EXCEPTION_INFORMATION { 
    DWORD    ThreadId; 
    PEXCEPTION_POINTERS ExceptionPointers; 
    BOOL    ClientPointers; 
} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION; 

अब मैं सोच रहा हूँ:

BOOL WINAPI MiniDumpWriteDump(
    __in HANDLE hProcess, 
    __in DWORD ProcessId, 
    __in HANDLE hFile, 
    __in MINIDUMP_TYPE DumpType, 
    __in PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, 
    __in PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, 
    __in PMINIDUMP_CALLBACK_INFORMATION CallbackParam 
); 

विशेष रूप से, ExceptionParam PMINIDUMP_EXCEPTION_INFORMATION है, जो नीचे के रूप में परिभाषित किया गया है प्रकार का है निम्नलिखित 2 पैरामीटर कैसे तैयार करें:

थ्रेडआईड अपवाद फेंकने वाले धागे की पहचानकर्ता।

ExceptionPointers एक EXCEPTION_POINTERS संरचना अपवाद के एक कंप्यूटर-स्वतंत्र विवरण और अपवाद के समय प्रोसेसर संदर्भ निर्दिष्ट करने के लिए एक सूचक।

प्रक्रिया ए में चलते समय प्रक्रिया बी में दोषपूर्ण थ्रेड आईडी और अपवाद पॉइंटर्स कैसे प्राप्त कर सकते हैं?

धन्यवाद।

+0

मुझे एक समान समस्या का सामना करना पड़ रहा है। मैं अन्य प्रक्रियाओं में PEXCEPTION_POINTERS अपवादपॉइंटर्स को पास करने में सक्षम नहीं हूं। (अगर मैं फाइलमैपिंग अवधारणा का उपयोग करता हूं तो मैं शून्य सूचक प्राप्त कर रहा हूं)। कृपया इस पर विस्तृत करें कि आप इस पर कैसे बस गए हैं। –

उत्तर

0

एक विशिष्ट प्रक्रिया नाम पर दिए गए अपवाद पर स्वचालित डंप बनाने के लिए, मेरी सलाह डीबगडिआग या एडप्लस का उपयोग करना होगा। वे बाहरी (और मुफ्त!) सॉफ़्टवेयर हैं जिन्हें आप ऐसा करने के लिए कॉन्फ़िगर कर सकते हैं।

यदि आप वास्तव में अपने आप से डंप लिखना चाहते हैं, तो आप इसे प्रक्रिया में कर सकते हैं बी: एमएसडीएन आपको चेतावनी देता है कि यह एक अच्छा विचार नहीं है, क्योंकि स्मृति, स्टैक ओवरफ्लो या स्टैक भ्रष्टाचार से बाहर की ग़लत त्रुटियां (सूची है पूर्ण नहीं) निश्चित रूप से स्मृति और ढेर का उपयोग करेगा, और इसलिए आप बिना किसी डंप के समाप्त हो सकते हैं (और एक बहुत ही खराब प्रक्रिया दुर्घटना)। मेरे अनुभव से, यह बहुत दुर्लभ है (मैं बहुत तनावग्रस्त वितरित सी ++ सॉफ़्टवेयर पर काम करता था)। दूसरों के अपवाद के लिए, यह ठीक होना चाहिए। उस स्थिति में, आप EXCEPTION_RECORD संरचना प्राप्त करने के लिए अपवाद अनुवादक (_set_se_translator देखें) या एक vectored अपवाद हैंडलर (AddVectoredContinueHandler देखें) या फ़ंक्शन GetExceptionInformation() देखें (अन्य तरीकों से हो सकता है जिनके बारे में मुझे पता नहीं है)।

प्रक्रिया बी से अपवाद बनाने के बाद प्रक्रिया बी में अपवाद के बाद इसका मतलब है कि आपको अपवाद के बारे में सभी सूचनाओं की प्रतिलिपि बनाना है, और प्रक्रिया ए को चेतावनी देना है कि इसे इस अपवाद के साथ कुछ डंप करना है। यह स्मृति और ढेर का उपभोग करेगा, और इसलिए आपके पास पहले समझाए गए समान सीमा होगी।

आशा

2

एक संकेतक में मदद मिलेगी कि एक MINIDUMP_EXCEPTION_INFORMATION संरचना ग्राहक अपवाद है कि वजह से मिनीडम्प उत्पन्न करने का वर्णन करने के लिए। यदि इस पैरामीटर का मान शून्य है, तो मिनीडम्प फ़ाइल में कोई अपवाद जानकारी शामिल नहीं है।

तथ्य यह है कि पैरामीटर __in चिह्नित है और न __in_opt आप वास्तव में शून्य यहां पारित कर सकते हैं के बावजूद

। उस प्रक्रिया को लक्ष्य प्रक्रिया से पहले स्थान पर प्राप्त करने के लिए आपकी प्रक्रिया को वैसे भी डीबग करना होगा।

प्रक्रिया ए कैसे और कब प्रक्रिया प्रक्रिया के minidump लेने के लिए जाना जाता है बी? यदि ए वास्तव में बी डिबगिंग कर रहा है, जब WaitForDebugEvent EXCEPTION_DEBUG_EVENT के साथ लौटाता है, तो जानकारी जानकारी संरचना में उपलब्ध है।

यदि ए बी डिबगिंग नहीं कर रहा है, तो शायद बी कुछ आईपीसी तंत्र के माध्यम से ए को बता रहा है "अरे मैं क्रैश हो रहा हूं, एक मिनीडम्प लें"। इस मामले में या तो बी डंप खुद ही ले सकता है या एक ही आईपीसी मेचांसिम के माध्यम से अपवाद जानकारी पास कर सकता है। फिर भी, यह समस्या निवारण प्रक्रिया में मिनीडंपव्राइट डंप को बुलाए जाने के कारणों के लिए समस्याग्रस्त है, अगर चीजें उड़ रही हैं, तो चीज जो उड़ा हो सकता है वह हो सकता है जो आपको इसके बारे में बताने की ज़रूरत है।

अन्य तंत्र जो बी को ए के लिए डंप ले सकता है, ए को जेआईटी डीबगर के रूप में स्थापित किया गया है, इस मामले में, ए डिबगिंग बी होगा और आप अपवाद जानकारी प्राप्त करने के लिए डीबगिंग एपीआई का उपयोग कर सकते हैं।

यदि ए समय-समय पर बी के मिनीडंप ले रहा है, तो वहां कोई अपवाद नहीं होगा, इसलिए आप इस मामले में केवल न्यूल पास कर सकते हैं।

ध्यान दें कि आप की तरह

WaitForSingleObject(handleToProcessB, INFINITE); 
MiniDumpWriteDump(handleToProcessB, ...) 

कुछ कर रही पर इच्छुक रहे हैं कि इस काम नहीं करेगा। ओएस बहुत कम चीजें रखता है, मुख्य रूप से प्रक्रिया के लिए निकास कोड, वर्चुअल एड्रेस स्पेस और स्टैक्स जिन्हें आपको मिनीडम्प लेने की आवश्यकता होती है।

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