2013-04-16 10 views
9

द्वारा उपयोग किए गए डिबगिंग इंजनों के बारे में जानकारी विजुअल स्टूडियो में, यदि आप किसी भी प्रक्रिया में डीबगर संलग्न करना चाहते हैं, तो आपके पास कुछ विशिष्ट इंजन (कोड प्रकार) या इंजनों का सेट चुनने की संभावना है जो आप उपयोग करना चाहते हैं:डीबगर

enter image description here

इसके बाद, (यदि आप किसी भी इंजन और प्रक्रियाओं चयनित करने के बाद) यदि आप संलग्न बटन क्लिक करें, डिबगर देते आपरेशन शुरू कर दिया है। फिर डीबग से संबंधित घटनाओं को निकाल दिया जाता है। IDebugEventCallback2::Eventgrab इस तरह की घटनाओं के लिए इस्तेमाल किया जा सकता है (और जैसे निकालने प्रक्रियाओं डिबगर वास्तव में करने के लिए संलग्न है के नाम):

public int Event(IDebugEngine2 engine, IDebugProcess2 process, IDebugProgram2 program, 
       IDebugThread2 thread, IDebugEvent2 debugEvent, ref Guid riidEvent, 
       uint attributes) 
{ 
    if (debugEvent is IDebugProcessCreateEvent2) 
    { 
     string processname; 
     if(process != null) 
      process.GetName((uint) enum_GETNAME_TYPE.GN_FILENAME, out processname); 
     //... 
    } 
} 

वहाँ किसी भी समान तरीके इंजन जो किया गया है के बारे में कुछ जानकारी प्राप्त करना है चुना?

अद्यतन: में थोड़ा और अधिक विस्तृत कोड:

public class DebugEventsHunter : IVsDebuggerEvents, IDebugEventCallback2 
{ 
    private readonly IVsDebugger _debugger; 
    private uint _cookie; 

    public DebugEventsHunter(IVsDebugger debugger) { _debugger = debugger; } 

    public void Start() 
    { 
     _debugger.AdviseDebuggerEvents(this, out _cookie); 
     _debugger.AdviseDebugEventCallback(this); 
    } 

    public int Event(IDebugEngine2 engine, IDebugProcess2 process, IDebugProgram2 program, 
        IDebugThread2 thread, IDebugEvent2 debugEvent, ref Guid riidEvent, uint attributes) 
    { 
     if (debugEvent is IDebugProcessCreateEvent2) 
     { 
      // get process name (shown before) 
     }    
     if (debugEvent is IDebugEngineCreateEvent2) 
     { 
      // why execution flow never enters this scope? 
      IDebugEngine2 e; 
      ((IDebugEngineCreateEvent2)debugEvent).GetEngine(out e); 
     } 
     // engine parameter is also always null within this scope 
     return VSConstants.S_OK; 
    } 

    public int OnModeChange(DBGMODE mode) { /*...*/ } 
} 

और उपयोग:

var debugger = GetService(typeof(SVsShellDebugger)) as IVsDebugger; 
var hunter = new DebugEventsHunter(debugger); 
hunter.Start(); 
+0

यह देखने के लिए मुश्किल है कि आप अगले चरण को कैसे याद करते हैं, IDebugProcessCreateEvent2.GetEngine() पर कॉल करें। क्या गलत हुआ? –

+0

@ हंस पासेंट: यदि आपका मतलब है 'IDebugEngineCreateEvent2 :: GetEngine()' मैंने इसका उपयोग करने की कोशिश की है, लेकिन बिना किसी सफलता के। कृपया गलत तरीके से किए गए सत्यापन को सत्यापित करने के लिए अपडेट किए गए प्रश्न की जांच करें (बीटीडब्ल्यू: मैं वीएस2013 का उपयोग कर रहा हूं इससे कोई फर्क पड़ता है)। – jwaliszko

उत्तर

2

एक डिबग इंजन एक प्रक्रिया की शुरूआत या एक मौजूदा प्रक्रिया से जोड़ा जाता है, तो वह भेज देंगे समय पर तरीके से IDebugLoadCompleteEvent2 घटना। आप इस घटना का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि डिबगिंग के लिए कौन से डीबग इंजन चुने गए थे।

संपादित करें: डिबग इंजन का नाम निर्धारित करने के लिए, आप IDebugProgram2 उदाहरण है कि इसके बाद के संस्करण घटना के साथ शामिल है का उपयोग कर सकते हैं, और IDebugProgram2.GetEngineInfo विधि कॉल। यह विधि डीबग इंजन का नाम और आईडी प्रदान करती है। ध्यान दें कि डीबग इंजन का नाम आपके द्वारा डीबगर संवाद में देखने के लिए उपयोग किए जाने वाले मेल से मेल नहीं खा सकता है, इस मामले में आपको इस विधि द्वारा आपके कैपोनिकल नाम को अपने मैपिंग कार्यान्वयन का उपयोग करके "दोस्ताना" नाम में परिवर्तित करने की आवश्यकता होगी।

+0

वास्तव में, इस तथ्य के कारण कि 'इवेंट' फ़ंक्शन के अंदर विभिन्न डीबग ईवेंटों का एक समूह निकाल दिया गया है, मैं 'debugEvent' पैरामीटर देख सकता हूं, और जब यह' IDebugLoadCompleteEvent2' प्रकार का होगा, तब प्रतीक्षा करें। हो जाता है। लेकिन अगर मैं इस घटना को पकड़ता हूं (जैसे कि मैंने 'आईडीबगप्रोसेस क्रिएटइवेंट 2' को पकड़ लिया), फिर इंजन के बारे में जानकारी कैसे प्राप्त करें? – jwaliszko

+0

मैंने सोचा था कि आप पूछ रहे थे कि कौन से इंजन संलग्न हैं? केवल डीबग इंजन जो संलग्न करते हैं उस घटना को भेजते हैं। –

+0

मेरी समस्या यह है कि मैं छोटी वीएस प्लगइन लिख रहा हूं और मुझे 2 जानकारी चाहिए: हमने जिन प्रक्रियाओं को चुना है, उनके नाम क्या हैं, और हमारे द्वारा चुने गए कोड प्रकारों के नाम क्या हैं। यदि आप किसी भी प्रक्रिया प्लगइन से संलग्न हैं तो बस 'IDebugProcessCreateEvent2' ईवेंट की प्रतीक्षा करता है, प्रक्रिया का नाम निकालता है (जैसा कि एक प्रश्न में दिखाया गया है) और इसे एक फ़ाइल में संग्रहीत करता है (बाद में उपयोग किया जा सकता है)। दुर्भाग्यवश मुझे नहीं पता कि इस कोड प्रकार कैसे प्राप्त करें, जिसे डीबग करने के लिए चुना गया था। – jwaliszko