Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De C++/WinRT Visual Studio Extension (VSIX) biedt u Visual Studio systeemeigen foutopsporingsvisualisatie (natvis) van C++/WinRT-projecttypen. Dit biedt een ervaring die vergelijkbaar is met C#-foutopsporing.
Note
Zie voor meer informatie over C++/WinRT Visual Studio Extension (VSIX) Visual Studio ondersteuning voor C++/WinRT en VSIX.
Natvis inschakelen
Natvis staat automatisch aan voor een debug-build omdat WINRT_NATVIS wordt gedefinieerd wanneer het symbool _DEBUG is gedefinieerd.
Zo schakelt u dit in voor een releasebuild.
- Compileer uw code waarbij het symbool WINRT_NATVIS is gedefinieerd. Daarmee exporteert u een functie WINRT_abi_val, waarmee de debugvisualizer eigenschapswaarden in het doelproces kan evalueren.
- Genereer een volledige PDB. Dit komt doordat de foutopsporingsvisualr gebruikmaakt van de Visual Studio C++-expressie-evaluator, die op zijn beurt symbolische definities vereist voor weergegeven eigenschapstypen.
- Een gevisualiseerd type moet een runtimeklasse of een interface rapporteren die is gedefinieerd in detecteerbare metagegevens. Dit gebeurt via de implementatie van IInspectable::GetRuntimeClassName.
Gezien het bovenstaande werkt de foutopsporings visualiseren het beste met Windows systeemtypen waarvoor metagegevens in de C:\Windows\System32\WinMetadata map kunnen worden gevonden. Het kan echter ook door de gebruiker gedefinieerde typen en externe foutopsporing ondersteunen, mits u bestanden correct kunt vinden .winmd .
Aangepaste metagegevens gebruiken
De foutopsporingsvisualr zoekt naast het proces .winmdnaar door de gebruiker gedefinieerde metagegevens (.exebestanden). Het maakt gebruik van een algoritme dat vergelijkbaar is met die van RoGetMetaDataFile, waarbij wordt gezocht naar opeenvolgende subtekenreeksen van de volledig gekwalificeerde typenaam. Als bijvoorbeeld het type dat wordt gevisualiseerd Contoso.Controls.Widget is, zoekt de visualizer achtereenvolgens naar:
- Contoso.Controls.Widget.winmd
- Contoso.Controls.winmd
- Contoso.winmd
Externe foutopsporing met aangepaste metagegevens
Wanneer externe foutopsporing wordt uitgevoerd, is het proces .exe niet lokaal, waardoor het zoeken naar aangepaste metagegevens (vermeld in de vorige sectie) mislukt. In dat geval valt de visualizer terug op een lokale cachemap (%TEMP%) voor een geschikt .winmd-bestand. Als er een wordt gevonden, wordt de grootte en datum van het bestand vastgelegd en wordt vervolgens gezocht naar het externe foutopsporingsdoel voor hetzelfde .winmd naast het binaire bestand. Indien nodig wordt het externe bestand gedownload en wordt de lokale cache bijgewerkt. Deze strategie zorgt ervoor dat de lokaal in de cache opgeslagen .winmd altijd up-to-date is en een manier biedt voor het handmatig opslaan van een .
winmd als deze niet op afstand kan worden gevonden (bijvoorbeeld als de F5-implementatie deze daar niet heeft geplaatst).
Zie de sectie Probleemoplossing hieronder voor een voorbeeld van het cachegedrag.
Problemen oplossen
De foutopsporingsvisualizer gebruikt de Visual Studio C++-expressie-evaluator voor het aanroepen van de geëxporteerde functie WINRT_abi_val om eigenschapswaarden te verkrijgen. Normaal gesproken kan de visualizer niet-verwerkte uitzonderingen ondervangen en probleemloos verslechteren, waarbij '<Niet-geïnitialiseerd object of informatie niet beschikbaar' wordt> weergegeven in Visual Studio Watch-vensters.
Dit is handig wanneer de visualizer probeert een lokale variabele buiten het levensduurbereik te evalueren (bijvoorbeeld vóór de bouw). In sommige contexten, zoals eenheidstests, wordt een niet-verwerkte uitzonderingsfilter geïnstalleerd. Dit kan ertoe leiden dat het proces wordt beëindigd wanneer de C++ expressie-evaluator fouten veroorzaakt. Om fouten te vermijden, doet de visualizer meerdere VirtualQuery-aanroepen in WINRT_abi_val.
Diagnostische gegevens
Als een eigenschap niet correct wordt weergegeven, schakelt u uitgebreide Natvis-diagnostiek in Visual Studio in (Extra>Opties>Foutopsporing>Uitvoervenster>Diagnostische berichten van Natvis) en controleert u vervolgens het venster Uitvoer op Natvis-fouten.
In het volgende fragment ziet u verschillende pogingen om te controleren op een .winmd-bestand, gevolgd door een download van het externe doelsysteem naar de lokale cachemap en vervolgens het laden van dat .winmd-bestand.
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
Als het visualiseren een .winmd bestand niet kan vinden, wordt deze fout gegenereerd:
Natvis C++/WinRT: Could not find metadata for Consoso.Controls.Widget
Er zijn een aantal andere foutscenario's die allemaal diagnostische gegevens produceren.
Als er metagegevens beschikbaar zijn, worden in de uitvoerdiagnose veel aanroepen als volgt weergegeven:
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
De eerste is een aanroep van IStringable.ToString om de tekenreeksweergave van een complex type te verkrijgen (de niet-uitgevouwen weergavewaarde).
De tweede is een aanroep naar IInspectable::GetRuntimeClassName, om de eigenschappen van het type weer te geven.
Daaropvolgende WINRT_abi_val-aanroepen zijn evaluaties van eigenschappen voor elke interface die op het type is aangetroffen.
WINRT_abi_val aanroepen
U kunt de Visual Studio Directe/opdrachtvensters gebruiken om rechtstreeks WINRT_abi_val aan te roepen voor probleemoplossing.
Als u bijvoorbeeld een geprojecteerde variabele stringable hebt, kunt u de waarde van IStringable.ToString als volgt evalueren:
>? WINRT_abi_val((::IUnknown*)&stringable, L"{96369F54-8EB6-48F0-ABCE-C1B211E627C3}", 0).s,sh
L"string"
Verwante onderwerpen
Windows developer