Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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"
Kapcsolódó témakörök
Windows developer