C++/WinRT için Visual Studio yerel hata ayıklama görselleştirmesi (natvis)

C++/WinRT Visual Studio Uzantısı (VSIX), C++/WinRT yansıtılan türleri için Visual Studio’nun yerel hata ayıklama görselleştirmesini (natvis) sağlar. Bu size C# hata ayıklamasına benzer bir deneyim sağlar.

Note

C++/WinRT Visual Studio Uzantısı (VSIX) hakkında daha fazla bilgi için bkz. C++/WinRT desteği Visual Studio ve VSIX.

Natvis'i etkinleştirme

_DEBUG simgesi tanımlandığında WINRT_NATVIS tanımlandığından Natvis hata ayıklama derlemesi için otomatik olarak açık.

Bir yayın derlemesinde bunu etkinleştirmeyi nasıl seçeceğiniz aşağıda açıklanmıştır.

  • Kodunuzu tanımlanmış WINRT_NATVIS simgesiyle derleyin. Bunu yaptığınızda, hata ayıklama görselleştiricisinin hedef işlemdeki özellik değerlerini değerlendirmesi için giriş noktası sağlayan bir WINRT_abi_val işlevi dışarı aktarılır.
  • Tam pdb oluşturun. Bunun nedeni, hata ayıklama görselleştiricisinin Visual Studio C++ İfade Değerlendiricisi'ni kullanmasıdır ve bu da görüntülenen özellik türleri için sembolik tanımlar gerektirir.
  • Görselleştirilmiş bir tür, bulunabilir meta verilerde tanımlanan bir çalışma zamanı sınıfını veya arabirimi raporlamalıdır. Bunu IInspectable::GetRuntimeClassName uygulaması aracılığıyla yapar.

Yukarıdakiler göz önünde bulundurulduğunda hata ayıklama görselleştiricisi, meta verilerin klasörde bulunabileceği C:\Windows\System32\WinMetadata Windows sistem türleriyle en iyi şekilde çalışır. Bununla birlikte, .winmd dosyalarını doğru şekilde konumlandırmanız koşuluyla, kullanıcı tanımlı türleri ve uzaktan hata ayıklamayı da destekleyebilir.

Özel meta verileri kullanma

Hata ayıklama görselleştiricisi, işlemiyle .winmdbirlikte kullanıcı tanımlı meta verileri (.exedosyalar) arar. RoGetMetaDataFile'dakine benzer bir algoritma kullanır; tam nitelikli tür adının art arda gelen alt dizelerini yoklar. Örneğin, görselleştirilmekte olan tür Contoso.Controls.Widget ise görselleştirici aşağıdakiler için sırayla görünür:

  • Contoso.Controls.Widget.winmd
  • Contoso.Controls.winmd
  • Contoso.winmd

Özel meta verilerle uzaktan hata ayıklama

Uzaktan hata ayıklama sırasında işlem .exe yerel değildir, bu nedenle özel meta verileri arama (önceki bölümde bahsedilen) başarısız olur. Bu durumda görselleştirici, uygun %TEMP% bir dosya için yerel önbellek klasörüne (.winmd) geri döner. Bir tane bulursa, dosyanın boyutunu ve tarihini kaydeder; ardından ikili dosyanın yanında aynı .winmd öğesini bulmak için uzak hata ayıklama hedefinde arama yapar. Gerekirse, uzak dosya indirilir ve yerel önbellek güncelleştirmesi yapılır. Bu strateji, yerel olarak önbelleğe alınan .winmd verilerin her zaman güncel olmasını sağlar ve bir öğesini el ile önbelleğe almak için bir araç sağlar. winmd uzaktan bulunamıyorsa (örneğin, F5 dağıtımı oraya koymadıysa).

Önbelleğe alma davranışı örneği için aşağıdaki Sorun Giderme bölümüne bakın.

Troubleshooting

Hata ayıklama görselleştiricisi, özellik değerlerini almak üzere dışarı aktarılan WINRT_abi_val işlevini çağırmak için Visual Studio C++ İfade Değerlendiricisini kullanır. Normalde görselleştirici işlenmeyen özel durumları yakalayabilir ve düzgün bir şekilde düşebilir ve < pencerelerinde ">Nesne başlatılmamış veya bilgi kullanılamıyor" ifadesini görüntüleyebilir.

Görselleştirici bir yerel değişkeni yaşam süresi kapsamı dışında değerlendirmeye çalıştığında (örneğin, oluşturmadan önce) bu yararlı olur. Birim testleri gibi bazı bağlamlarda işlenmeyen özel durum filtresi yüklenir. Bu, C++ ifade değerlendiricisi hataladığında işlemin sonlandırmasına neden olabilir. Hata oluşmasını önlemek için görselleştirici, WINRT_abi_val'da birkaç VirtualQuery çağrısı yapar.

Tanılama

Bir özellik doğru görüntülenmiyorsa, Visual Studio'da ayrıntılı Natvis tanılamasını açın (Araçlar>Seçenekler>Hata Ayıklama>Çıkış Penceresi>Natvis tanılama iletileri) ve ardından Natvis hataları için Çıkış penceresini inceleyin.

Aşağıdaki alıntı, bir .winmd dosyasını yoklamak için yapılan birkaç girişimi, ardından uzak hedeften yerel önbellek klasörüne indirilmesini ve sonra da bu .winmd dosyasının yüklenmesini göstermektedir.

Natvis C++/WinRT: Looking for C:\Users\...\AppData\Local\DevelopmentFiles\ffcddd4f-cfc0-44cb-b736-0b2d026def77VS.Debug_x64....\Consoso.Controls.Widget.winmd
Natvis C++/WinRT: Looking for C:\Users\...\AppData\Local\DevelopmentFiles\ffcddd4f-cfc0-44cb-b736-0b2d026def77VS.Debug_x64....\Consoso.Controls.winmd
Natvis C++/WinRT: Downloading C:\Users\...\AppData\Local\DevelopmentFiles\ffcddd4f-cfc0-44cb-b736-0b2d026def77VS.Debug_x64....\Consoso.Controls.winmd
Natvis C++/WinRT: Loaded C:\Users\...\AppData\Local\Temp\Consoso.Controls.winmd

Görselleştirici bir .winmd dosyayı bulamazsa bu hata oluşturulur:

Natvis C++/WinRT: Could not find metadata for Consoso.Controls.Widget

Hepsi tanılama üreten başka hata senaryoları da vardır.

Meta veriler varsa, çıkış tanılamalarında aşağıdaki gibi birçok çağrı gösterilir:

Natvis C++/WinRT: WINRT_abi_val(*(::IUnknown**)0x32dd4ffc18, L"{96369F54-8EB6-48F0-ABCE-C1B211E627C3}", 0).s,sh
Natvis C++/WinRT: WINRT_abi_val(*(::IUnknown**)0x32dd4ffc18, L"{AF86E2E0-B12D-4C6A-9C5A-D7AA65101E90}", -2).s,sh

İlki, karmaşık bir türün dize gösterimini (genişletilmemiş görüntü değeri) elde etmek için IStringable.ToString çağrısıdır.

İkincisi, türün özelliklerini incelemek için IInspectable::GetRuntimeClassName çağrısıdır.

Sonraki WINRT_abi_val çağrıları, tür üzerinde bulunan her arabirim için özellik değerlendirmeleridir.

WINRT_abi_val öğesinin çağrılması

Sorun giderme için doğrudan WINRT_abi_val çağırmak için Visual Studio/Komut pencerelerini kullanabilirsiniz.

Örneğin, yansıtılmış bir stringable değişkeni verildiğinde, IStringable.ToString değerini şu şekilde değerlendirebilirsiniz:

>? WINRT_abi_val((::IUnknown*)&stringable, L"{96369F54-8EB6-48F0-ABCE-C1B211E627C3}", 0).s,sh
L"string"