द्वारा उपयोग किए गए डिबगिंग इंजनों के बारे में जानकारी विजुअल स्टूडियो में, यदि आप किसी भी प्रक्रिया में डीबगर संलग्न करना चाहते हैं, तो आपके पास कुछ विशिष्ट इंजन (कोड प्रकार) या इंजनों का सेट चुनने की संभावना है जो आप उपयोग करना चाहते हैं:डीबगर
इसके बाद, (यदि आप किसी भी इंजन और प्रक्रियाओं चयनित करने के बाद) यदि आप संलग्न बटन क्लिक करें, डिबगर देते आपरेशन शुरू कर दिया है। फिर डीबग से संबंधित घटनाओं को निकाल दिया जाता है। IDebugEventCallback2::Event
grab इस तरह की घटनाओं के लिए इस्तेमाल किया जा सकता है (और जैसे निकालने प्रक्रियाओं डिबगर वास्तव में करने के लिए संलग्न है के नाम):
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();
यह देखने के लिए मुश्किल है कि आप अगले चरण को कैसे याद करते हैं, IDebugProcessCreateEvent2.GetEngine() पर कॉल करें। क्या गलत हुआ? –
@ हंस पासेंट: यदि आपका मतलब है 'IDebugEngineCreateEvent2 :: GetEngine()' मैंने इसका उपयोग करने की कोशिश की है, लेकिन बिना किसी सफलता के। कृपया गलत तरीके से किए गए सत्यापन को सत्यापित करने के लिए अपडेट किए गए प्रश्न की जांच करें (बीटीडब्ल्यू: मैं वीएस2013 का उपयोग कर रहा हूं इससे कोई फर्क पड़ता है)। – jwaliszko