2013-04-16 27 views
9

Visual Studio'da, herhangi bir işlem için hata ayıklayıcısını eklemek isterseniz, kullanmak istediğiniz belirli bir motoru (kod türü) veya bir dizi motor kümesi seçmenize olanak tanır:Hata ayıklayıcı tarafından kullanılan hata ayıklama motorları hakkında bilgi

enter image description here

sonra Ekle düğmesini tıklarsanız, (da motor ve süreçleri seçilmiş sonra), ayıklayıcı işlemi başlatılır ekleyin. Daha sonra hata ayıklama ile ilgili olaylar da tetiklenir. IDebugEventCallback2::Eventgrab tür olaylara kullanılan (ve örneğin ayıklayıcı aslında çalışmasına verdiği süreçlerin adlarını ayıklamak) edilebilir: olmuştur motorları hakkında bazı bilgiler almak için herhangi bir benzer bir yolu var mı

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); 
     //... 
    } 
} 

seçilen?

GÜNCELLEME: biraz daha detaylı kodu:

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) { /*...*/ } 
} 

ve kullanımı:

bir hata ayıklama motoru bir süreç başlattı veya varolan sürecine verdiği
var debugger = GetService(typeof(SVsShellDebugger)) as IVsDebugger; 
var hunter = new DebugEventsHunter(debugger); 
hunter.Start(); 
+0

Sonraki adımı nasıl atladığınızı görmek zor, IDebugProcessCreateEvent2.GetEngine() öğesini çağırın. Ne yanlış gitti? –

+0

@Hans Passant: "IDebugEngineCreateEvent2 :: GetEngine()" demek istiyorsan, onu kullanmayı denedim, ancak hiç bir başarı gösteremedim. Ne yanlış yaptığımı doğrulamak için güncellenmiş soru kontrol edin (btw: VS2013 kullanıyorum, bu herhangi bir fark yaratıyor). – jwaliszko

cevap

2

, bu gönderecek IDebugLoadCompleteEvent2 olayı zamanında. Hata ayıklama için hangi hata ayıklama motorlarının seçildiğini belirlemek için bu olayı kullanabilirsiniz.

Düzenleme: ayıklama motorunun adını belirlemek için, yukarıdaki olayı ile birlikte IDebugProgram2 örneğini kullanın ve IDebugProgram2.GetEngineInfo yöntemini çağırabilirsiniz. Bu yöntem, hata ayıklama motorunun adını ve kimliğini sağlar. Hata ayıklama motorunun adının, hata ayıklayıcı iletişim kutularında görmek için kullandığınız şeyle eşleşmeyebileceğini unutmayın; bu durumda, bu yöntemle döndürülen standart adı, kendi eşleme uygulamanızı kullanarak "arkadaşça" bir adağa dönüştürmeniz gerekir.

+0

Gerçekten de, çeşitli hata ayıklama olaylarının kovulduğu gerçeğinden dolayı, 'Olay' işlevinin içinde 'debugEvent 'parametresini izleyebilir ve' IDebugLoadCompleteEvent2' türünde ne zaman bekleyeceğimi bekleyebilirim. Olur. Ama bu olayı yakalarsam (IDebugProcessCreateEvent2'yi yakaladığım gibi), motorlar hakkında bilgi nasıl alınır? – jwaliszko

+0

Hangi motorların takıldığını mı soruyordunuz? Ekleyen yalnızca hata ayıklama motorları bu olayı gönderir. –

+0

Sorunum küçük VS eklentisi yazıyor ve 2 bilgiye ihtiyacım var: Eklenmek üzere seçtiğimiz süreçlerin isimleri ve seçmiş olduğumuz kod türlerinin isimleri nelerdir. Eğer herhangi bir işlem eklentisine eklediğinizde sadece 'IDebugProcessCreateEvent2' olayını beklerseniz, işlem adını (bir soruda gösterildiği gibi) çıkarır ve bir dosyaya (daha sonra kullanılmak üzere) saklar. Ne yazık ki, hata ayıklama için seçilmiş olan bu kod türlerini nasıl alacağımı bilmiyorum. – jwaliszko