Visual Studio Natív hibakeresési vizualizáció (natvis) a C++/WinRT-hez

A C++/WinRT Visual Studio bővítmény (VSIX) Visual Studio C++/WinRT előrejelzett típusok natív hibakeresési vizualizációját (natvis) biztosítja. Ez a C#-hibakereséshez hasonló élményt nyújt.

Note

A C++/WinRT Visual Studio bővítményről (VSIX) további információt Visual Studio C++/WinRT és a VSIX támogatásáról talál.

Natvis engedélyezése

A Natvis automatikusan be van kapcsolva egy hibakeresési build esetében, mert a WINRT_NATVIS a _DEBUG szimbólum definiálásakor van definiálva.

Az alábbiakban bemutatjuk, hogyan választhatja ki a kiadási buildet.

  • Állítsa össze a kódot a megadott szimbólummal WINRT_NATVIS . Ezzel exportál egy WINRT_abi_val függvényt, amely megadja a hibakereső vizualizáció belépési pontját a célfolyamat tulajdonságértékeinek kiértékeléséhez.
  • Generáljon egy teljes PDB-t. Ennek az az oka, hogy a hibakeresési vizualizáció a Visual Studio C++ kifejezésértékelőt használja, ami szimbolikus definíciókat igényel a megjelenített tulajdonságtípusokhoz.
  • A vizualizált típusnak jelentenie kell egy futtatókörnyezeti osztályt vagy egy felderíthető metaadatokban definiált felületet. Ezt az IInspectable::GetRuntimeClassName implementálásán keresztül teszi.

A fentiek alapján a hibakeresési vizualizáció Windows rendszertípusokkal működik a legjobban, amelyek metaadatai megtalálhatók a C:\Windows\System32\WinMetadata mappában. Emellett azonban támogathatja a felhasználó által definiált típusokat és a távoli hibakeresést is, feltéve, hogy megfelelően találja meg .winmd a fájlokat.

Egyéni metaadatok használata

A hibakeresési vizualizáció a folyamat .winmdmellett felhasználó által definiált metaadatokat (.exefájlokat) keres. A RoGetMetaDataFile függvényéhez hasonló algoritmust használ, amely a teljes mértékben minősített típusnév egymást követő részkarakterláncait vizsgálja. Ha például a vizualizált típus Contoso.Controls.Widget, akkor a vizualizáló sorrendben a következőket keresi:

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

Távoli hibakeresés egyéni metaadatokkal

Távoli hibakeresés esetén a folyamat .exe nem helyi, ezért az egyéni metaadatok (az előző szakaszban említett) keresése meghiúsul. Ebben az esetben a vizualizáció egy megfelelő %TEMP% fájl helyi gyorsítótármappájába (.winmd) kerül vissza. Ha talál egyet, akkor rögzíti a fájl méretét és dátumát, majd megkeresi a távoli hibakeresési célhelyet a bináris fájl mellett..winmd Ha szükséges, a távoli fájl letöltődik, és frissíti a helyi gyorsítótárat. Ez a stratégia biztosítja, hogy a helyben gyorsítótárazott .winmd mindig naprakész legyen, valamint lehetőséget biztosít egy . kézi gyorsítótárazására. winmd ha távolról nem található meg (például ha az F5-telepítés nem helyezte oda).

A gyorsítótárazási viselkedésre példaként tekintse meg az alábbi hibaelhárítási szakaszt .

Troubleshooting

A hibakeresési vizualizáció a Visual Studio C++ kifejezésértékelő használatával hívja meg az exportált WINRT_abi_val függvényt a tulajdonságértékek lekéréséhez. A vizualizáció általában észleli a kezeletlen kivételeket, és kecsesen romlik, és az "<Objektum nem inicializálódott vagy az információ nem érhető el>" felirat jelenik meg a Visual Studio Watch ablakaiban.

Ez akkor hasznos, ha a vizualizáció megpróbál kiértékelni egy helyi változót az élettartamán kívül (például az építés előtt). Bizonyos környezetekben, például az egységtesztekben egy kezeletlen kivételszűrő van telepítve. Ez azt okozhatja, hogy a folyamat leáll, amikor a C++ kifejezés kiértékelője meghibásodik. A hiba elkerülése érdekében a vizualizáció számos VirtualQuery-hívást indít WINRT_abi_val.

Diagnosztika

Ha egy tulajdonság nem jelenik meg megfelelően, kapcsolja be a részletes natvis-diagnosztikát a Visual Studióban (Eszközök>Beállítások>Hibakeresés>Kimeneti ablak>Natvis diagnosztikai üzenetek), majd figyelje a Kimenet ablakot a natvis-hibákért.

Az alábbi részlet több próbálkozást mutat be egy .winmd fájl felkutatására, majd annak letöltését a távoli célról a helyi gyorsítótármappába, végül pedig a .winmd fájl betöltését.

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

Ha a vizualizáció nem talál egy .winmd fájlt, a következő hibaüzenet jelenik meg:

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

Számos más hibaforgatókönyv is létezik, amelyek mindegyike diagnosztikát hoz létre.

Ha a metaadatok elérhetők, akkor a kimeneti diagnosztikában sok ilyen hívás jelenik meg:

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

Az első egy IStringable.ToString hívás, amely egy összetett típus karakterlánc-reprezentációjának (a nem kibontott megjelenítési értéknek) a lekérésére szolgál.

A második az IInspectable::GetRuntimeClassName hívása, hogy tükrözze a típus tulajdonságait.

A következő WINRT_abi_val hívások a típuson felderített összes felület tulajdonság-kiértékelései.

WINRT_abi_val meghívása

A Visual Studio Azonnali/parancsablakokkal közvetlenül meghívhat WINRT_abi_val hibaelhárítás céljából.

Például egy kivetített stringable változó esetén az IStringable.ToString metódust az alábbiak szerint értékelheti ki:

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