Megosztás a következőn keresztül:


Python és C++ együttes hibakeresése a Visual Studióban

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:

Képernyőkép a Visual Studio Installerben kiválasztott Python natív fejlesztési eszközök lehetőségről.

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

Képernyőkép a Python és C++ kód vegyes módú hibakereséséről a Visual Studió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:

  1. A Megoldáskezelőben kattintson a jobb gombbal a Python-projektre, és válassza a Tulajdonságok lehetőséget.

  2. 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:

    Képernyőkép a Visual Studióban a natív kód hibakeresésének engedélyezése tulajdonság beállításáról.

    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 -i argumentumot 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.

  3. A tulajdonság módosításainak mentéséhez válassza a Fájl>mentése (vagy Ctrl+S) lehetőséget.

  4. 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.

    1. A Folyamat csatolása párbeszédpanelen válassza ki a megfelelő folyamatot a listából.

    2. 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.

    3. A Kódtípus kiválasztása párbeszédpanelen válassza a Kódtípusok hibakeresése lehetőséget.

    4. A listában jelölje be a Python (natív) jelölőnégyzetet, majd kattintson az OK gombra:

      Képernyőkép arról, hogyan választhatja ki a Python (natív) kódtípust a Visual Studióban történő hibakereséshez.

    5. 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.exe fá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.

  1. Ugrás ide: https://www.python.org/downloads/source/.

  2. Töltse le a Verziónak megfelelő Python-forráskód-archívumot, és bontsa ki a kódot egy mappába.

  3. 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:

  1. A Megoldáskezelőben kattintson a jobb gombbal a C/C++ projektre, és válassza a Tulajdonságok lehetőséget.

  2. A Tulajdonságlapok panelen válassza a Konfiguráció tulajdonságai>hibakeresés lapját.

  3. 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.

    Képernyőkép arról, hogyan választhatja ki a Python natív hibakeresési lehetőségét egy C/C++ projekthez a Visual Studióban.

    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.

  4. 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:

  1. A C/C++ projekt Tulajdonságlapok paneljén lépjen a Konfiguráció tulajdonságai>hibakeresés lapjára.

  2. A Parancs beállításnál adja meg a programfájl teljes elérési útját python.exe .

  3. 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:

  1. 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.

  2. 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.

    1. A Folyamat csatolása párbeszédpanelen válassza ki a megfelelő folyamatot a listából.

    2. 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.

    3. A Kódtípus kiválasztása párbeszédpanelen válassza a Kódtípusok hibakeresése lehetőséget.

    4. A listában jelölje be a Python jelölőnégyzetet, majd kattintson az OK gombra.

    5. 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 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.

Képernyőkép a Kombinált hívásverem ablakról vegyes módú hibakereséssel a Visual Studióban.

  • 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_CallObject való 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.

    Képernyőkép a Python nézetről a Visual Studio Helyiek ablakában.

  • 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:

    Képernyőkép a Helyiek ablak Python-nézetcsomópontok megjelenítése lehetőségének engedélyezéséről.

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:

  • PyObject
  • PyVarObject
  • PyTypeObject
  • PyByteArrayObject
  • PyBytesObject
  • PyTupleObject
  • PyListObject
  • PyDictObject
  • PySetObject
  • PyIntObject
  • PyLongObject
  • PyFloatObject
  • PyStringObject
  • PyUnicodeObject

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.

    Képernyőkép a Helyiek ablak C++ csomópontok megjelenítése beállításainak engedélyezéséről.

  • 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 _longobject egy példányát (amelynek PyLongObject típusdefje), és megpróbál olyan natív osztályokat kikövetkeztetni, amelyeket ön maga készített. A csomópont gyermekei szerkeszthetők.

    Képernyőkép a C++ nézetről a Visual Studio Helyiek ablakában.

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'])