6

Hata ayıklama olaylarına giren bir Visual Studio uzantısı var. Hata ayıklayıcının bir kod satırında durduğunda, IDebugEventCallback2 geri çağırma işlemi çağrılır ve hata ayıklayıcının IDebugThread2::EnumFrameInfo aracılığıyla durdurulduğu dosya adını ve satır numarasını öğrenebilirim.Visual Studio Uzantısında, hata ayıklayıcının durduğu işlevin satır aralığını alın

Geçerli işlevin yaydığı kaynak kodu satır aralığını bilmek istiyorum.

Hata ayıklayıcı arabirimlerden ihtiyacım olan bilgileri elde etmenin mümkün olduğunu umuyorum - hata ayıklayıcı, işlevlerin satır aralığını bilmelidir. Bu mümkün değilse başka yöntemlere açığım. İdeal bir dünyada çözüm, proje sistemi olmadan çalışırdı - kendim dahil birçok kişi, proje sistemini kullanmadan Visual Studio'yu bağımsız bir hata ayıklayıcısı olarak kullanır. (Ayrıca, Roslyn güvenemez - bu Visual Studio varolan sürümlerinde çalışması gerekiyor.)

Düzenleme: sürece dosyası bir projenin parçası olarak, iyi FileCodeModel eser kullanmanın Carlos'un yöntemi. Hala proje sistemini gerektirmeyen bir yöntem olup olmadığını bilmek isterim.

cevap

0

Verilen bir FRAMEINFOIEnumDebugFrameInfo2.Next ile alınan, dosya adı, geçerli karenin kodunun ilk satırı ve kod mevcut hat almak için aşağıdaki kodu kullanabilirsiniz:

IDebugStackFrame2 stackFrame = frmInfo.m_pFrame; 
if (stackFrame != null) 
{ 
    TEXT_POSITION[] begin = new TEXT_POSITION[1]; 
    TEXT_POSITION[] end = new TEXT_POSITION[1]; 
    IDebugDocumentContext2 debugDocumentContext2; 
    stackFrame.GetDocumentContext(out debugDocumentContext2); 
    if (debugDocumentContext2 != null) 
    { 
     string fileName; 
     debugDocumentContext2.GetName((uint)enum_GETNAME_TYPE.GN_FILENAME, out fileName); 
     debugDocumentContext2.GetSourceRange(begin, end); 
    } 
} 

FWIW, IDebugDocumentContext2 arabirim, yığın çerçevesindeki satırları veya kod ifadelerini ilerletmenizi sağlayan Seek yöntemine sahiptir. Yığın çerçevesinin kod satırının sonunu almamaya kadar ilerleyebilirsiniz.

Proje sistemi (ve Roslyn olmadan) kullanarak kod öğeleri ve başlangıç ​​/ bitiş noktaları hakkında bilgi almak için (EnvDTE.ProjectItem.FileCodeModel) otomasyon modelini kullanmanız gerekir. EnvDTE.ProjectItem ve bir kod satırı verildiğinde, örneğin aşağıdakileri kullanabilirsiniz: HOWTO: Get the code element at the cursor from a Visual Studio .NET macro or add-in

+0

Teşekkürler, ancak bu benim için pek işe yaramıyor. 'GetSourceRange()', tüm kareyi değil, geçerli deyimin aralığını döndürür ve 'Seek()', C++ hata ayıklayıcısından 0x80004001 "Uygulanmadı" değerini döndürür. (Benim downvote, BTW.) (Ve ben zaten baktım mükemmel CodeModel makalenin, işaretçisi için teşekkürler. :-)) – RichieHindle