Nativní vizualizace při ladění v Visual Studio (natvis) pro C++/WinRT

Rozšíření sady Visual Studio pro C++/WinRT (VSIX) umožňuje nativní ladicí vizualizaci (natvis) ve Visual Studiu pro promítnuté typy C++/WinRT. To vám poskytuje podobný dojem jako při ladění v jazyce C#.

Note

Další informace o rozšíření C++/WinRT Visual Studio (VSIX) najdete v tématu Visual Studio podpora jazyka C++/WinRT a VSIX.

Povolení natvis

Natvis je pro ladicí sestavení automaticky zapnutý, protože WINRT_NATVIS je definován, když je definován symbol _DEBUG.

Tady je postup, jak se přihlásit k sestavení vydané verze.

  • Zkompilujte kód pomocí symbolu WINRT_NATVIS definovaného. Tím se exportuje WINRT_abi_val funkce, která poskytuje vstupní bod pro vizualizér ladění k vyhodnocení hodnot vlastností v cílovém procesu.
  • Vygenerujte úplný soubor PDB. Je to proto, že vizualizér ladění používá vyhodnocovač výrazů jazyka C++ ve Visual Studiu, který zase vyžaduje symbolické definice zobrazovaných typů vlastností.
  • Vizualizovaný typ musí uvádět běhovou třídu nebo rozhraní definované v metadatech, která lze zjistit. Provede to prostřednictvím své implementace IInspectable::GetRuntimeClassName.

Vzhledem k výše uvedenému funguje vizualizér ladění nejlépe se systémovými typy systému Windows, jejichž metadata lze najít ve složce C:\Windows\System32\WinMetadata. Může však také podporovat uživatelem definované typy a vzdálené ladění za předpokladu, že správně vyhledáte .winmd soubory.

Použití vlastních metadat

Vizualizátor ladění vyhledává uživatelsky definovaná metadata (.winmd soubory) vedle procesu .exe. Používá algoritmus podobný algoritmu funkce RoGetMetaDataFile, který zkouší po sobě jdoucí podřetězce plně kvalifikovaného názvu typu. Například pokud je vizualizovaným typem Contoso.Controls.Widget, vizualizér postupně hledá:

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

Vzdálené ladění s využitím vlastních metadat

Při vzdáleném ladění proces .exe není místní, takže hledání vlastních metadat (uvedené v předchozí části) selže. V takovém případě se vizualizér vrátí do místní složky mezipaměti (%TEMP%) pro vhodný .winmd soubor. Pokud nějaký najde, zaznamená velikost a datum souboru a poté na cíli vzdáleného ladění vyhledá stejný .winmd vedle binárního souboru. V případě potřeby se vzdálený soubor stáhne a aktualizuje místní mezipaměť. Tato strategie zajišťuje, že .winmd uložená v místní mezipaměti je vždy aktuální, a zároveň umožňuje ruční ukládání do mezipaměti . winmd pokud ho nejde najít vzdáleně (například pokud nasazení F5 ho tam neuložilo).

Příklad chování při ukládání do mezipaměti najdete v části Řešení potíží níže.

Troubleshooting

Vizualizér ladění používá vyhodnocovač výrazů jazyka C++ sady Visual Studio k volání exportované funkce WINRT_abi_val za účelem získání hodnot vlastností. Za normálních okolností může vizualizér zachytit neošetřené výjimky a přejít do omezeného režimu, přičemž v oknech Watch aplikace Visual Studio zobrazí text „<Objekt není inicializován nebo informace nejsou k dispozici>“.

To je užitečné, když se vizualizér pokusí vyhodnotit místní proměnnou mimo jeho rozsah životnosti (například před konstrukcí). V některých kontextech, například při jednotkových testech, je nainstalován filtr nezachycených výjimek. To může způsobit ukončení procesu při selhání vyhodnocovače výrazů jazyka C++. Aby se zabránilo chybám, vizualizér provádí v WINRT_abi_val několik volání VirtualQuery.

Diagnostika

Pokud se vlastnost nezobrazuje správně, zapněte podrobnou diagnostiku nástroje Natvis ve Visual Studiu (Nástroje>Možnosti>Ladění>Okno výstupu>Diagnostické zprávy Natvis) a potom v okně Výstup sledujte chyby nástroje Natvis.

Následující výňatek zobrazuje několik pokusů o vyhledání souboru .winmd, po nichž následuje stažení ze vzdáleného cílového systému do místní složky mezipaměti a poté načtení souboru .winmd.

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

Pokud vizualizér .winmd nenajde soubor, vygeneruje se tato chyba:

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

Existuje řada dalších chybových scénářů, které všechny vytvářejí diagnostiku.

Pokud jsou k dispozici metadata, zobrazí se v diagnostice výstupu mnoho volání, jako je tato:

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

Prvním je volání IStringable.ToString k získání řetězcové reprezentace komplexního typu (nerozbalená zobrazovaná hodnota).

Druhá je volání IInspectable::GetRuntimeClassName, aby odráželo vlastnosti typu.

Při následných voláních WINRT_abi_val dochází k vyhodnocování vlastností pro každé rozhraní zjištěné u daného typu.

Vyvolání WINRT_abi_val

V oknech sady Visual Studio Okamžitý/příkaz můžete při řešení potíží přímo spustit WINRT_abi_val.

Například u proměnné s projekcí stringable můžete její IStringable.ToString vyhodnotit takto:

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