2010-08-26 16 views
13

मैं एक विंडोज़/सी ++/WTL अनुप्रयोग है कि एक बच्चे की प्रक्रिया spawns बना लिया है में CreateProcess साथ पैदा की। दो प्रक्रियाएं अज्ञात पाइप के माध्यम से संवाद करती हैं।डिबगिंग एक प्रक्रिया दृश्य स्टूडियो

मैं बाल प्रक्रिया को डीबग करने में सक्षम होना चाहता हूं।

के बाद से दोनों माता पिता और बच्चे परियोजनाओं विजुअल स्टूडियो 2008 में एक ही समाधान में हैं, वहाँ VS2008 बताने के लिए किसी भी तरह से है कि मैं डिबगर दोनों प्रक्रियाओं डिबग करने के लिए करना चाहते हैं?

जब मैं माता पिता की प्रक्रिया के साथ डिबगर शुरू, डिबगर बच्चे प्रक्रिया कोड में किसी भी breakpoints पर तोड़ नहीं होंगे।

और चूंकि बाल प्रक्रिया माता-पिता की प्रक्रिया से उत्पन्न होती है, इसलिए जब मैं पैदा होता हूं तो मैं बच्चे की प्रक्रिया को संलग्न करने का एक आसान तरीका नहीं सोच सकता (शायद वीएस -2008 के दूसरे उदाहरण के माध्यम से)।

कोई अंतर्दृष्टि बहुत सराहना की!

+0

अच्छा सवाल, मैं VS2008 में एक अपाचे मॉड्यूल डीबग करने का प्रयास करते समय इस समस्या पर ठोकर खाई। – SirDarius

उत्तर

3

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

ध्यान दें कि आप कुछ भी है कि बच्चे की प्रक्रिया में main से पहले होता है अनदेखा कर देते हैं।

संपादित करें: एक उदाहरण है, कुछ इस तरह, अपरीक्षित के रूप में:

// parent.cpp 
HANDLE hMutex = ::CreateMutex(NULL, TRUE, "Global\\some_guid"); 
::CreateProcess(...); 
::ReleaseMutex(hMutex); // breakpoint here 
::CloseHandle(hMutex); 

// child.cpp 
int main(...) 
{ 
    HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Global\\some_guid"); 
    ::WaitForSingleObject(hMutex, INFINITE); 
    ::CloseHandle(hMutex); 

    ... 
} 

आप शायद #if _DEBUG या वातावरण चर चेकों के साथ रैप करने के लिए चाहते हैं।

+0

उत्कृष्ट विचार, यह आश्चर्य की बात है कि वीएस -2008/वीएस -2010 में इस तरह की चीज की सुविधा नहीं है - मैंने कल्पना की होगी कि इस तरह की चीज एक आम आवश्यकता है। –

4

आप अस्थायी रूप से अपने बच्चे की प्रक्रिया के स्टार्टअप कोड में DebugBreak() कहीं के लिए एक कॉल में डाल सकते हैं। यदि आप उस प्रक्रिया को डीबग करना चाहते हैं तो इससे आपको विंडोज़ संकेत मिलेगा।

+0

मैंने कोशिश की, विंडोज़ (7, x64)। जब डीबगब्रैक() कॉल को बाल प्रक्रिया में मारा गया था, तो ओएस ने मुझे बताया कि बाल प्रक्रिया ने पॉपअप संदेशबॉक्स के माध्यम से काम करना बंद कर दिया था। मैंने एप्लिकेशन को डीबग करना चुना, और मैं केवल वीएस -2008 के नए उदाहरण में डीबग सत्र शुरू कर सकता हूं।जब मैं ऐसा करता हूं, तो मैं कोड के माध्यम से कदम नहीं उठा सकता, क्योंकि "वर्तमान स्थान के लिए कोई स्रोत कोड उपलब्ध नहीं है"। हालांकि अच्छा प्रयास करें! –

12

विकल्पों में से बहुत से:

  • आप डीबग का उपयोग कर + संलग्न द्वारा डिबगर का एक उदाहरण के साथ कई .exes डीबग कर सकते हैं। हालांकि मैं हमेशा विजुअल स्टूडियो के दो उदाहरणों का उपयोग करता हूं, दूसरे में डीबग + अटैच का उपयोग करता हूं।

  • आप बच्चे के कोड में __debugbreak() डाल सकते हैं, जेआईटी डीबगर विंडो आपको डीबगर चुनने के लिए प्रेरित करेगी।

  • आप स्वचालित रूप से बच्चे को .exe शुरू कर दिया होते ही एक डिबगर शुरू करने के लिए "छवि फ़ाइल निष्पादन विकल्प" रजिस्ट्री कुंजी का उपयोग कर सकते हैं। एक प्रमुख नामित HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ छवि फ़ाइल निष्पादन विकल्प \ YourApp.exe जोड़े, अपने 'डीबगर "मान सेट करने के लिए" vsjitdebugger.exe "

  • एक VS add-in आसान अभी तक यह है कि वहाँ है, अभी तक यह कोशिश नहीं की है।
+0

मुझे डिबगर के एक उदाहरण में एकाधिक .exes को डीबग करने के लिए डीबग + अटैच करने का प्रयास करने में दिलचस्पी होगी, लेकिन मैं यह निर्धारित करने में सक्षम नहीं था कि इसे बाल प्रक्रिया के साथ कैसे किया जाए जो कि CreateProcess के साथ माता-पिता द्वारा उत्पन्न किया गया है। मेरी पिछली टिप्पणी के अनुसार, डीबगब्रैक() काम नहीं किया था, क्योंकि स्रोत कोड डीबगर के नए उदाहरण में उपलब्ध नहीं था। अगर मैं बच्चे को अलग समाधान फ़ाइल में तोड़ देता हूं तो क्या मुझे और सफलता मिलेगी ?? –

+0

डीबग + व्यू + मॉड्यूल, .exe पर राइट-क्लिक करें, सिंबल लोड जानकारी आपको बताती है कि यह आवश्यक .pdb फ़ाइल की तलाश में है। –

+0

क्षमा करें, मुझे डीबग + व्यू + मॉड्यूल –

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