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 legtöbb szokásos Python-hibakereső csak a Python-kód hibakeresését támogatja, de a fejlesztők gyakran használják a Pythont C vagy C++ használatával. A vegyes kódot használó egyes forgatókönyvek olyan alkalmazások, amelyek nagy teljesítményt igényelnek, vagy a platform API-k közvetlen meghívásának lehetősége gyakran Pythonban és C vagy C++-ban kódoltak.
A Visual Studio integrált, egyidejű vegyes módú hibakeresést biztosít a Pythonhoz és natív C/C++ kódhoz. A támogatás akkor érhető el, ha a Python-fejlesztési számítási feladathoz a Python natív fejlesztési eszközeit választja a Visual Studio telepítőjében:
Ebben a cikkben a következő vegyes módú hibakeresési funkciók használatát ismerheti meg:
- Kombinált hívásveremek
- Lépés a Python és a natív kód között
- Töréspontok mindkét kódtípusban
- Objektumok Python-ábrázolásának megtekintése natív keretekben és fordítva
- Hibakeresés a Python-projekt vagy a C++ projekt kontextusában
Előfeltételek
Visual Studio 2017 és újabb verziók. A vegyes módú hibakeresés nem érhető el a Visual Studio 1.x Python Tools for Visual Studio 2015-ben és korábbi verzióiban.
A Python-számítási feladatok támogatásával telepített Visual Studio. További információ: Python-támogatás telepítése a Visual Studióban.
Vegyes módú hibakeresés engedélyezése Python-projektben
Az alábbi lépések bemutatják, hogyan engedélyezheti a vegyes módú hibakeresést Egy Python-projektben:
A Megoldáskezelőben kattintson a jobb gombbal a Python-projektre, és válassza a Tulajdonságok lehetőséget.
A Tulajdonságok panelen válassza a Hibakeresés lapot, majd válassza a Hibakeresés>engedélyezése natív kód hibakeresésének engedélyezése lehetőséget:
Ez a beállítás lehetővé teszi a vegyes módot az összes hibakeresési munkamenethez.
Jótanács
Ha engedélyezi a natív kódszintű hibakeresést, a Python kimeneti ablak azonnal bezárulhat, miután a program befejeződött, és nem jelenik meg a Nyomjon meg egy gombot a folytatáshoz üzenet. Ha a natív kód hibakeresésének engedélyezése után szeretné kényszeríteni a szüneteltetést és a kérést, adja hozzá az
-iargumentumot a Hibakeresés lap>futtatása mezőjéhez. Ez az argumentum interaktív módba helyezi a Python-értelmezőt a kód futtatása után. A program megvárja, amíg kiválasztja Ctrl+Z+Enter billentyűkombinációt az ablak bezárásához.A tulajdonság módosításainak mentéséhez válassza a Fájl>mentése (vagy Ctrl+S) lehetőséget.
Ha egy meglévő folyamathoz szeretné csatolni a vegyes módú hibakeresőt, válassza a Hibakeresés>Folyamat csatolása lehetőséget. Megnyílik egy párbeszédpanel.
A Folyamat csatolása párbeszédpanelen válassza ki a megfelelő folyamatot a listából.
A Csatolás mezőhöz a Kiválasztás beállítással nyissa meg a Kódtípus kiválasztása párbeszédpanelt.
A Kódtípus kiválasztása párbeszédpanelen válassza a Kódtípusok hibakeresése lehetőséget.
A listában jelölje be a Python (natív) jelölőnégyzetet, majd kattintson az OK gombra:
Válassza a Csatolás lehetőséget a hibakereső elindításához.
A kódtípus beállításai állandók. Ha később le szeretné tiltani a vegyes módú hibakeresést, és egy másik folyamathoz akar csatlakozni, törölje a Python (natív) kódtípus jelölését a jelölőnégyzetből, és jelölje be a Natív kódtípus jelölőnégyzetét.
A natív beállítás mellett vagy helyett más kódtípusokat is választhat. Ha például egy felügyelt alkalmazás a CPythont üzemelteti, amely viszont natív bővítménymodulokat használ, és mindhárom kódprojektet szeretné hibakeresésre használni, jelölje be a Python, a natív és a felügyelt jelölőnégyzetet. Ez a megközelítés egységes hibakeresési élményt nyújt, beleértve a kombinált hívásvermeket és a három futtatókörnyezet közötti váltást.
Virtuális környezetek együttműködése
Ha ezt a vegyes módú hibakeresési módszert használja a virtuális környezetekhez (venvekhez), a Windows Python egy csonkfájlt python.exe használ a Visual Studio által alfolyamatként talált és betöltött venvekhez.
A Python 3.8 és újabb verziói esetében a vegyes mód nem támogatja a többfolyamatos hibakeresést. A hibakeresési munkamenet indításakor a csonk alfolyamatot nem az alkalmazást fogják hibakeresni. Csatolási forgatókönyvekhez a megoldás a megfelelő
python.exefájl csatolása. Ha hibakereséssel indítja el az alkalmazást (például az F5 billentyűparancson keresztül), egy parancs használatával létrehozhatja a virtuális környezetet (venv)C:\Python310-64\python.exe -m venv venv --symlinks. A parancsba szúrja be a Python előnyben részesített verzióját. Alapértelmezés szerint csak a rendszergazdák hozhatnak létre szimlinkeket Windows rendszeren.A 3.8-nál korábbi Python-verziók esetében a vegyes módú hibakeresésnek a várt módon kell működnie a venv-ekkel.
A globális környezetben való futtatás nem okozza ezeket a problémákat a Python egyik verziójában sem.
Python-szimbólumok telepítése
Amikor először kezdi el a vegyes módban végzett hibakeresést, előfordulhat, hogy megjelenik egy Python szimbólumok kötelező párbeszédpanelje. A szimbólumokat csak egyszer kell telepítenie egy adott Python-környezethez. A szimbólumok automatikusan bekerülnek, ha a Python-támogatást a Visual Studio Installeren (Visual Studio 2017 és újabb verziók) keresztül telepíti. További információ: Hibakeresési szimbólumok telepítése Python-értelmezők számára a Visual Studióban.
Python-forráskód elérése
Hibakereséskor elérhetővé teheti a standard Python forráskódját.
Ugrás ide:
https://www.python.org/downloads/source/.Töltse le a Verziónak megfelelő Python-forráskód-archívumot, és bontsa ki a kódot egy mappába.
Amikor a Visual Studio kéri a Python-forráskód helyét, mutasson a kinyerési mappában lévő adott fájlokra.
Vegyes módú hibakeresés engedélyezése C/C++ projektben
A Visual Studio 2017 15.5-ös és újabb verziója támogatja a vegyes módú hibakeresést egy C/C++ projektből. Erre a használatra példa az, ha a Pythont egy másik alkalmazásba szeretné beágyazni a python.org leírtak szerint.
Az alábbi lépések bemutatják, hogyan engedélyezheti a vegyes módú hibakeresést egy C/C++ projekt esetében:
A Megoldáskezelőben kattintson a jobb gombbal a C/C++ projektre, és válassza a Tulajdonságok lehetőséget.
A Tulajdonságlapok panelen válassza a Konfiguráció tulajdonságai>hibakeresés lapját.
Bontsa ki a Hibakereső legördülő menüjét a beállítás elindításához , és válassza a Python/Natív hibakeresés lehetőséget.
Megjegyzés:
Ha nem látja a Python/natív hibakeresési lehetőséget, először telepítenie kell a Python natív fejlesztési eszközeit a Visual Studio Installer használatával. A natív hibakeresési lehetőség a Python fejlesztési számítási feladatai alatt érhető el. További információ: Python-támogatás telepítése a Visual Studióban.
A módosítások mentéséhez kattintson az OK gombra .
A programindító hibakeresése
Ha ezt a módszert használja, nem tudja hibakeresésre használni a py.exe programindítót, mert az egy gyermek-alfolyamatot python.exe hoz létre. A hibakereső nem csatlakozik az alfolyamathoz. Ebben a forgatókönyvben az átmeneti megoldás az, hogy közvetlenül az argumentumokkal indítja el a python.exe programot, az alábbiak szerint:
A C/C++ projekt Tulajdonságlapok paneljén lépjen a Konfiguráció tulajdonságai>hibakeresés lapjára.
A Parancs beállításnál adja meg a programfájl teljes elérési útját
python.exe.Adja meg a kívánt argumentumokat a Parancsargumentumok mezőben.
A vegyes módú hibakereső csatolása
A Visual Studio 2017 15.4-es és korábbi verziói esetében a közvetlen vegyes módú hibakeresés csak akkor engedélyezett, ha Python-projektet indít el a Visual Studióban. A támogatás korlátozott, mert a C/C++ projektek csak a natív hibakeresőt használják.
Ebben a forgatókönyvben a kerülő megoldás a debugger külön csatolása:
Indítsa el a C++ projektet hibakeresés nélkül: válassza a Hibakeresés>hibakeresés nélkül lehetőséget , vagy használja a Ctrl+F5 billentyűparancsot.
Ha egy meglévő folyamathoz szeretné csatolni a vegyes módú hibakeresőt, válassza a Hibakeresés>Csatlakozás folyamathoz lehetőséget. Megnyílik egy párbeszédpanel.
A Folyamat csatolása párbeszédpanelen válassza ki a megfelelő folyamatot a listából.
A Csatolás mezőhöz a Kiválasztás beállítással nyissa meg a Kódtípus kiválasztása párbeszédpanelt.
A Kódtípus kiválasztása párbeszédpanelen válassza a Kódtípusok hibakeresése lehetőséget.
A listában jelölje be a Python jelölőnégyzetet, majd kattintson az OK gombra.
Válassza a Csatolás lehetőséget a hibakereső elindításához.
Jótanács
A C++ alkalmazásban szüneteltetheti vagy késleltetheti a hibakeresést, hogy a hibakereső csatolása előtt ne hívja meg a hibakereséshez használni kívánt Python-kódot.
Vegyes módú specifikus funkciók felfedezése
A Visual Studio számos vegyes módú hibakeresési funkciót kínál az alkalmazás hibakeresésének megkönnyítése érdekében:
- Kombinált hívásverem
- Lépés a Python és a natív kód között
- PyObject értékek nézete natív kódban
- Natív értékek nézete Python-kódban
Kombinált hívásverem használata
A Hívásverem ablakban a natív és a Python-veremkeretek egymásba vannak illesztve, a kettő között az átmenetek meg vannak jelölve.
- Ha az áttűnéseket [Külső kód] néven szeretné megjeleníteni az áttűnés irányának megadása nélkül, használja az Eszközök>beállításai panelt. Bontsa ki az Összes beállítás>hibakeresése>általános szakaszt, és jelölje be az Csak a kód engedélyezése jelölőnégyzetet.
- Ha az áttűnéseket [Külső kód] néven szeretné megjeleníteni az áttűnés irányának megadása nélkül, használja az Eszközök>beállításai párbeszédpanelt. Bontsa ki azÁltalános> szakaszt, jelölje be az Enable Just My Code jelölőnégyzetet, majd kattintson az OK gombra.
- Ha aktívvá szeretné tenni a híváskeretet, kattintson duplán a keretre. Ez a művelet megnyitja a megfelelő forráskódot is, ha lehetséges. Ha a forráskód nem érhető el, a keret továbbra is aktív lesz, és a helyi változók vizsgálhatók.
Lépés a Python és a natív kód között
A Visual Studio biztosítja a Step Into (F11) vagy a Step Out (Shift+F11) parancsokat, amelyek lehetővé teszik, hogy a vegyes módú hibakereső megfelelően kezelje a kódtípusok közötti változásokat.
Amikor a Python egy C-ben implementált metódust hív meg, a metódust megvalósító natív függvény elején leáll az adott metódus hívására való bejelentkezés.
Ugyanez a viselkedés akkor fordul elő, ha a natív kód meghív egy Python API-függvényt, amely a Python-kód meghívását eredményezi. Az eredetileg Pythonban definiált függvényérték hívásába
PyObject_CallObjectvaló bejelentkezés a Python-függvény elején leáll.A Pythonról natívra való bejelentkezést a Pythonból ctype-okkal meghívott natív függvények is támogatják.
PyObject-értékek nézet használata natív kódban
Ha egy natív (C vagy C++) keret aktív, a helyi változók megjelennek a hibakereső Helyiek ablakában. A natív Python-bővítménymodulokban a változók közül soknak a típusa PyObject (ami a _object típusdefiníciója), vagy néhány egyéb alapvető Python-típus. Vegyes módú hibakeresés esetén ezek az értékek egy másik gyermekcsomópontot mutatnak [Python-nézet] címkével.
A változó Python-ábrázolásának megtekintéséhez bontsa ki a csomópontot. A változók nézete megegyezik azzal, amit lát, ha egy helyi változó hivatkozik ugyanarra az objektumra egy Python-keretben. A csomópont gyermekei szerkeszthetők.
A funkció letiltásához kattintson a jobb gombbal a Helyiek ablak tetszőleges pontjára, és váltson a Python>Megjelenítési csomópontok menüpontra:
Python-nézetcsomópontokat megjelenítő C-típusok
Ha engedélyezve van, a következő C-típusok a [Python nézet] csomópontokat jelenítik meg:
PyObjectPyVarObjectPyTypeObjectPyByteArrayObjectPyBytesObjectPyTupleObjectPyListObjectPyDictObjectPySetObjectPyIntObjectPyLongObjectPyFloatObjectPyStringObjectPyUnicodeObject
A [Python-nézet] nem jelenik meg automatikusan a saját maga által készített típusok esetében. Amikor bővítményeket hoz létre a Python 3.x-hez, ez a hiány általában nem jelent problémát. Minden objektumnak van egy ob_base olyan mezője, amely a felsorolt C-típusok egyikét tartalmazza, ezért a [Python-nézet] megjelenik.
Natív értékek megtekintése Python-kódban
Ha egy Python-keret aktív, a Helyiek ablakban engedélyezheti a [C++ nézet] natív értékeit. Ez a funkció alapértelmezés szerint nincs engedélyezve.
A funkció engedélyezéséhez kattintson a jobb gombbal a Helyiek ablakban, és állítsa be a Python>Show C++ View Nodes (Csomópontok megtekintése) menüt.
A [C++ nézet] csomópont a mögöttes C/C++ struktúrát jeleníti meg egy értékhez, amely megegyezik a natív keretben láthatóval. Megjeleníti a Python hosszú egész számának
_longobjectegy példányát (amelynekPyLongObjecttípusdefje), és megpróbál olyan natív osztályokat kikövetkeztetni, amelyeket ön maga készített. A csomópont gyermekei szerkeszthetők.
Ha egy objektum gyermekmezője típus PyObjectvagy más támogatott típus, akkor [Python nézet] ábrázoló csomóponttal rendelkezik (ha ezek a reprezentációk engedélyezve vannak). Ez a viselkedés lehetővé teszi olyan objektumgráfok navigálását, amelyekben a hivatkozások nem érhetők el közvetlenül a Python számára.
Ellentétben a [Python nézet] csomópontokkal, amelyek Python-objektum metaadatait használják az objektum típusának meghatározásához, a [C++ nézet] esetében nincs hasonló megbízható mechanizmus. Általánosságban elmondható, hogy a Python-érték (azaz hivatkozás PyObject ) alapján nem lehet megbízhatóan meghatározni, hogy melyik C/C++ struktúra van a háttérrendszerben. A vegyes módú hibakereső úgy próbálja kitalálni a típust, hogy az objektum típusának különböző mezőit (például a PyTypeObject mezője által ob_type hivatkozott mezőket) keresi meg, amelyek függvénymutató-típussal rendelkeznek. Ha a függvénymutatók egyike egy feloldható függvényre hivatkozik, és a függvénynek van egy self olyan paramétere, amelynek típusa pontosabb, mint PyObject*a háttértípus, akkor a rendszer azt feltételezi, hogy ez a típus a háttértípus.
Vegyük az alábbi példát, ahol egy ob_type->tp_init adott objektum értéke az alábbi függvényben található:
static int FobObject_init(FobObject* self, PyObject* args, PyObject* kwds) {
return 0;
}
Ebben az esetben a hibakereső helyesen következtethet arra, hogy az objektum C típusa FobObject. Ha a hibakereső nem tud pontosabb típust meghatározni tp_init, akkor más mezőkre lép. Ha egyik mezőből sem tudja levezetni a típust, a [C++ nézet] csomópont példányként PyObject jeleníti meg az objektumot.
Ha mindig hasznos megjelenítést szeretne kapni az egyéni szerzői típusok számára, a legjobb, ha legalább egy speciális függvényt regisztrál a típus regisztrálásakor, és egy erősen beírt paramétert self használ. A legtöbb típus természetesen teljesíti ezt a követelményt. Más típusok esetében az tp_init ellenőrzés általában a legkényelmesebb módszer erre a célra. A hibakereső típus következtetésének tp_init engedélyezésére szolgáló típus hamis implementációja azonnal nullát ad vissza, ahogy az előző példában is látható.
A standard Python-hibakeresési különbségek áttekintése
A vegyes módú hibakereső különbözik a standard Python-hibakeresőtől. Néhány további funkciót vezet be, de nem rendelkezik pythonnal kapcsolatos képességekkel, az alábbiak szerint:
- A nem támogatott funkciók közé tartoznak a feltételes töréspontok, a hibakeresési interaktív ablak és a platformfüggetlen távoli hibakeresés.
- Az Azonnali ablak elérhető, de a funkció egy korlátozott részhalmazával, beleértve az ebben a szakaszban felsorolt összes korlátozást.
- A támogatott Python-verziók csak a CPython 2.7-es és 3.3-os verzióit tartalmazzák.
- Ha a Pythont a Visual Studio Shellrel szeretné használni (például ha az integrált telepítővel telepíti), a Visual Studio nem tudja megnyitni a C++ projekteket. Ennek eredményeképpen a C++ fájlok szerkesztési élménye csak egy egyszerű szövegszerkesztőhöz tartozik. A C/C++ hibakeresés és a vegyes módú hibakeresés azonban teljes mértékben támogatott a Shellben a forráskóddal, a natív kódba lépve és a C++ kifejezés kiértékelésével a hibakereső ablakokban.
- Ha a Python-objektumokat a Helyiek és a Watch hibakereső eszközablakaiban tekinti meg, a vegyes módú hibakereső csak az objektumok szerkezetét jeleníti meg. Nem értékeli ki automatikusan a tulajdonságokat, és nem jeleníti meg a számított attribútumokat. Gyűjtemények esetén csak a beépített gyűjteménytípusok (
tuple, ,list,dict)setelemeit jeleníti meg. Az egyéni gyűjteménytípusok nem tekinthetők gyűjteményeknek, hacsak nem öröklődnek valamilyen beépített gyűjteménytípustól. - A kifejezés kiértékelése a következő szakaszban leírtak szerint történik.
Kifejezésértékelés használata
A standard Python-hibakereső lehetővé teszi tetszőleges Python-kifejezések kiértékelését a Watch és az Azonnali ablakban, ha a hibakeresési folyamat a kód bármely pontján szüneteltetve van, feltéve, hogy az I/O-művelet vagy más hasonló rendszerhívás nem tiltja le. Vegyes módban történő hibakeresés esetén az tetszőleges kifejezések csak akkor értékelhetők ki, ha a Python-kód leállt, töréspont után vagy a kódba lépve. A kifejezések csak azon a szálon értékelhetők ki, amelyen a töréspont vagy a léptetőművelet történt.
Ha a hibakereső leáll a natív kódban vagy a Python-kódban, ahol a leírt feltételek nem érvényesek, például egy "step-out" művelet után vagy egy másik szálon. A kifejezésértékelés a helyi és a globális változók elérésére korlátozódik az aktuálisan kijelölt keret hatókörében, a mezők elérésére és a beépített gyűjteménytípusok literálokkal való indexelésére. A következő kifejezés például bármely környezetben kiértékelhető (feltéve, hogy az összes azonosító a meglévő változókra és a megfelelő típusú mezőkre hivatkozik):
foo.bar[0].baz['key']
A vegyes módú hibakereső az ilyen kifejezéseket is másképp oldja meg. Minden taghozzáférési művelet csak az objektum közvetlen részét képező mezőket keres (például egy bejegyzést __dict__ vagy __slots__egy natív struktúra mezőjét, amely a Pythonon keresztül tp_membersérhető el), és figyelmen kívül hagy minden __getattr__, __getattribute__vagy leíró logikát. Hasonlóképpen, az összes indexelési művelet figyelmen kívül hagyja __getitem__, és közvetlenül hozzáfér a gyűjtemények belső adatstruktúráihoz.
A konzisztencia érdekében ez a névfeloldási séma minden olyan kifejezéshez használható, amely megfelel a korlátozott kifejezésértékelés korlátainak. Ezt a sémát a rendszer attól függetlenül alkalmazza, hogy tetszőleges kifejezések engedélyezettek-e az aktuális leállítási ponton. A megfelelő Python-szemantika kényszerítéséhez, ha rendelkezésre áll egy teljes értékű kiértékelő, zárójelbe kell tenni a kifejezést:
(foo.bar[0].baz['key'])