Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
De flesta vanliga Python-felsökningsprogram stöder endast felsökning av Python-kod, men det är vanligt att utvecklare använder Python med C eller C++. Vissa scenarier som använder blandad kod är program som kräver höga prestanda eller möjligheten att direkt anropa plattforms-API:er kodas ofta i Python och C eller C++.
Visual Studio tillhandahåller integrerad, samtidig felsökning i blandat läge för Python och inbyggd C/C++-kod. Stödet är tillgängligt när du väljer alternativet python-inbyggda utvecklingsverktyg för Python Development-arbetsbelastningen i Installationsprogrammet för Visual Studio:
I den här artikeln utforskar du hur du arbetar med följande felsökningsfunktioner i blandat läge:
- Kombinerade anropsstackar
- Steg mellan Python och intern kod
- Brytpunkter i båda typerna av kod
- Visa Python-representationer av objekt i inbyggda ramar och vice versa
- Felsökning i kontexten för Python-projektet eller C++-projektet
Förutsättningar
Visual Studio 2017 och senare. Felsökning i blandat läge är inte tillgänglig med Python Tools för Visual Studio 1.x i Visual Studio 2015 och tidigare versioner.
Visual Studio installerat med stöd för Python-arbetsbelastningar. Mer information finns i Installera Python-stöd i Visual Studio.
Aktivera felsökning i blandat läge i ett Python-projekt
Följande steg beskriver hur du aktiverar felsökning i blandat läge i ett Python-projekt:
Högerklicka på Python-projektet i Solution Explorer och välj Egenskaper.
I fönstret Egenskaper väljer du fliken Felsök och väljer sedan alternativet Felsök>Aktivera intern kodfelsökning :
Det här alternativet aktiverar blandat läge för alla felsökningssessioner.
Tips/Råd
När du aktiverar inbyggd felsökning av kod kan Python-utdatafönstret stängas omedelbart efter att programmet har avslutats utan att pausa eller visa tryck på valfri tangent för att fortsätta frågan. Om du vill framtvinga pausen och uppmaningen när du har aktiverat intern kodfelsökning lägger du till
-iargumentet i fältet Kör>tolkargument på fliken Felsök . Det här argumentet placerar Python-tolken i interaktivt läge när koden har körts. Programmet väntar på att du ska välja Ctrl+Z+Retur för att stänga fönstret.Välj Spara fil> (eller Ctrl+) för att spara egenskapsändringarna.
Om du vill koppla felsökningsprogrammet för blandat läge till en befintlig process väljer du Felsöka>Bifoga till process. En dialogruta öppnas.
I dialogrutan Bifoga till process väljer du lämplig process i listan.
I fältet Koppla till använder du alternativet Välj för att öppna dialogrutan Välj kodtyp .
I dialogrutan Välj kodtyp väljer du alternativet Felsöka dessa kodtyper .
I listan markerar du kryssrutan Python (intern) och väljer OK:
Välj Anslut för att starta felsökningsprogrammet.
Inställningarna för kodtyp är beständiga. Om du vill inaktivera felsökning i blandat läge och ansluta till en annan process senare avmarkerar du kryssrutan Python-kodtyp (intern) och markerar kryssrutan Inbyggd kodtyp.
Du kan välja andra kodtyper utöver eller i stället för det interna alternativet. Om till exempel ett hanterat program är värd för CPython, som i sin tur använder inbyggda tilläggsmoduler och du vill felsöka alla tre kodprojekten, markerar du kryssrutorna Python, Native och Managed . Den här metoden ger dig en enhetlig felsökningsupplevelse, inklusive kombinerade anropsstackar och steg mellan alla tre körningarna.
Arbeta med virtuella miljöer
När du använder den här metoden för felsökning i blandat läge för virtuella miljöer (venvs) använder Python för Windows en python.exe stub-fil för venvs som Visual Studio hittar och läser in som en underprocess.
För Python 3.8 och senare stöder inte blandat läge felsökning i flera processer. När du startar felsökningssessionen debuggas stub-underprocessen i stället för programmet. För bifoga scenarier är lösningen att ansluta till rätt
python.exefil. När du startar programmet med felsökning (till exempel via kortkommandot F5 ) kan du skapa din venv med hjälp av kommandotC:\Python310-64\python.exe -m venv venv --symlinks. I kommandot infogar du önskad version av Python. Som standard kan endast administratörer skapa symlänkar i Windows.För Python-versioner tidigare än 3.8 bör felsökning i blandat läge fungera som förväntat med venvs.
Att köra i en global miljö orsakar inte dessa problem för någon version av Python.
Installera Python-symboler
När du börjar felsöka i blandat läge för första gången kan du se en dialogruta med Python-symboler som krävs . Du behöver bara installera symbolerna en gång för en viss Python-miljö. Symboler inkluderas automatiskt om du installerar Python-stöd via Visual Studio Installer (Visual Studio 2017 och senare). Mer information finns i Installera felsökningssymboler för Python-tolkar i Visual Studio.
Komma åt Python-källkod
Du kan göra källkoden för själva Standard Python tillgänglig vid felsökning.
Ladda ned Python-källkodsarkivet som är lämpligt för din version och extrahera koden till en mapp.
När Visual Studio frågar efter platsen för Python-källkoden pekar du på de specifika filerna i extraheringsmappen.
Aktivera felsökning i blandat läge i ett C/C++-projekt
Visual Studio 2017 version 15.5 och senare stöder felsökning i blandat läge från ett C/C++-projekt. Ett exempel på den här användningen är när du vill bädda in Python i ett annat program enligt beskrivningen i python.org.
Följande steg beskriver hur du aktiverar felsökning i blandat läge för ett C/C++-projekt:
Högerklicka på C/C++-projektet i Solution Explorer och välj Egenskaper.
I fönstret Egenskapssidor väljerdu fliken>.
Expandera den nedrullningsbara menyn för felsökningsprogrammet för att starta alternativet och välj Python/Intern felsökning.
Anmärkning
Om du inte ser alternativet Python/intern felsökning måste du först installera python-inbyggda utvecklingsverktyg med hjälp av Visual Studio Installer. Det interna felsökningsalternativet är tillgängligt under Python-utvecklingsarbetsbelastningen. Mer information finns i Installera Python-stöd i Visual Studio.
Spara ändringarna genom att välja OK .
Felsöka programstartsprogrammet
När du använder den här metoden kan du inte felsöka programstartaren py.exe eftersom den skapar en underordnad python.exe underprocess. Felsökningsprogrammet ansluter inte till underprocessen. I det här scenariot är lösningen att starta python.exe programmet direkt med argument, enligt följande:
I fönstret Egenskapssidor för C/C++-projektet går dutill fliken>.
För alternativet Kommando anger du den fullständiga sökvägen till
python.exeprogramfilen.Ange önskade argument i fältet Kommandoargument .
Bifoga felsökningsprogrammet för blandat läge
För Visual Studio 2017 version 15.4 och tidigare aktiveras direkt felsökning i blandat läge endast när du startar ett Python-projekt i Visual Studio. Stödet är begränsat eftersom C/C++-projekt endast använder det interna felsökningsprogrammet.
I det här scenariot är lösningen att koppla felsökningsprogrammet separat:
Starta C++-projektet utan att felsöka genom att välja Felsöka>Starta utan att felsöka eller använda kortkommandot Ctrl+F5.
Om du vill koppla felsökningsprogrammet för blandat läge till en befintlig process väljer du Felsöka>Bifoga till process. En dialogruta öppnas.
I dialogrutan Bifoga till process väljer du lämplig process i listan.
I fältet Koppla till använder du alternativet Välj för att öppna dialogrutan Välj kodtyp .
I dialogrutan Välj kodtyp väljer du alternativet Felsöka dessa kodtyper .
I listan markerar du kryssrutan Python och väljer OK.
Välj Anslut för att starta felsökningsprogrammet.
Tips/Råd
Du kan lägga till en paus eller fördröjning i C++-programmet för att säkerställa att det inte anropar Den Python-kod som du vill felsöka innan du bifogar felsökningsprogrammet.
Utforska specifika funktioner i blandat läge
Visual Studio innehåller flera felsökningsfunktioner i blandat läge för att göra det enklare att felsöka ditt program:
- Kombinerad anropsstack
- Steg mellan Python och intern kod
- Vy över PyObject-värden i nativ kod
- Vy över inbyggda värden i Python-kod
Använda en kombinerad anropsstack
Fönstret Samtalsstack visar både ursprungliga och Python-stackramar omväxlande, med övergångar markerade mellan de två:
- Om du vill att övergångar ska visas som [extern kod] utan att ange övergångsriktningen använder du fönstret Verktygsalternativ>. Expandera avsnittet Alla inställningar>felsökning>allmänt och markera kryssrutan Aktivera just my code .
- Om du vill att övergångar ska visas som [extern kod] utan att ange övergångsriktningen använder du dialogrutan Verktygsalternativ>. Expandera avsnittet Felsöka>allmänt , markera kryssrutan Aktivera bara min kod och välj sedan OK.
- Om du vill aktivera en anropsram dubbelklickar du på ramen. Den här åtgärden öppnar även motsvarande källkod, om möjligt. Om källkoden inte är tillgänglig görs ramen fortfarande aktiv och lokala variabler kan inspekteras.
Steg mellan Python och intern kod
Visual Studio innehåller kommandona Step Into (F11) eller Step Out (Skift+F11) för att aktivera felsökningsprogrammet i blandat läge för att hantera ändringar mellan kodtyper korrekt.
När Python anropar en metod av en typ som implementerats i C stoppas insteg i ett anrop till den metoden i början av den inbyggda funktion som implementerar metoden.
Samma beteende inträffar när intern kod anropar en Python API-funktion som resulterar i att Python-kod anropas. Steg in i ett anrop till
PyObject_CallObjectpå ett funktionsvärde som ursprungligen definierades i Python stoppas i början av Python-funktionen.Att kliva in från Python till inbyggt stöds också för inbyggda funktioner som anropas från Python via ctypes.
Använd PyObject-värdesvyn i inbyggd kod
När en intern (C- eller C++)-ram är aktiv visas dess lokala variabler i fönstret Lokal felsökning. I inbyggda Python-tilläggsmoduler är många av dessa variabler av typen PyObject (vilket är en typedef för _object), eller några andra grundläggande Python-typer. I felsökning i blandat läge visar dessa värden en annan underordnad nod märkt [Python-vy].
Om du vill visa variabelns Python-representation expanderar du noden. Vyn för variablerna är identisk med vad du ser om en lokal variabel som refererar till samma objekt finns i en Python-ram. Barnen till denna nod är redigerbara.
Om du vill inaktivera den här funktionen högerklickar du var som helst i fönstret Lokalt och växlar menyalternativet Visa>:
C-typer som visar Python-vynoder
Följande C-typer visar noder för [Python-vy] om de är aktiverade:
PyObjectPyVarObjectPyTypeObjectPyByteArrayObjectPyBytesObjectPyTupleObjectPyListObjectPyDictObjectPySetObjectPyIntObjectPyLongObjectPyFloatObjectPyStringObjectPyUnicodeObject
[Python-vyn] visas inte automatiskt för typer som du skapar själv. När du skapar tillägg för Python 3.x är den här bristen vanligtvis inte ett problem. Alla objekt har slutligen ett ob_base fält med någon av de C-typer som visas, vilket gör att [Python-vyn] visas.
Visa interna värden i Python-kod
Du kan aktivera en [C++-vy] för inbyggda värden i fönstret Locals när en Python-ram är aktiv. Den här funktionen är inte aktiverad som standard.
Om du vill aktivera funktionen högerklickar du i Lokalt-fönstret och anger menyalternativet Visa C++-visningsnoder i >.
Noden [C++ view] ger en representation av den underliggande C/C++-strukturen för ett värde som är identiskt med det du ser i en intern ram. Den visar en instans av
_longobject(somPyLongObjectär en typedef) för ett långt heltal i Python och försöker härleda typer för egna klasser som du själv skriver. Barnen till denna nod kan redigeras.
Om ett underordnat fält i ett objekt är av typen PyObject, eller en annan typ som stöds, har det en [Python-vy] representationsnod (om dessa representationer är aktiverade). Det här beteendet gör det möjligt att navigera i objektdiagram där länkar inte exponeras direkt för Python.
Till skillnad från [Python-vy] noder, som använder Python-objektmetadata för att fastställa typen av objekt, finns det ingen liknande tillförlitlig mekanism för [C++-vy]. Med tanke på ett Python-värde (det vill säga en PyObject referens) är det i allmänhet inte möjligt att på ett tillförlitligt sätt avgöra vilken C/C++-struktur som stöder det. Felsökningsprogrammet i blandat läge försöker gissa typen genom att titta på olika fält av objektets typ (till exempel det PyTypeObject som refereras av dess ob_type fält) som har funktionspekartyper. Om en av dessa funktionspekare refererar till en funktion som kan lösas, och den funktionen har en self-parameter med en typ som är mer specifik än PyObject*, antas den typen vara den grundläggande typen.
Tänk på följande exempel, där ob_type->tp_init värdet för för ett visst objekt pekar på följande funktion:
static int FobObject_init(FobObject* self, PyObject* args, PyObject* kwds) {
return 0;
}
I det här fallet kan felsökaren på rätt sätt dra slutsatsen att objektets C-typ är FobObject. Om felsökaren inte kan fastställa en mer exakt typ från tp_initgår den vidare till andra fält. Om det inte går att härleda typen från något av dessa fält, visar noden [C++ view] objektet som en PyObject instans.
För att alltid få en användbar representation för anpassade redigeringstyper är det bäst att registrera minst en särskild funktion när du registrerar typen och använda en starkt typad self parameter. De flesta typer uppfyller det kravet naturligt. För andra typer är tp_init inspektionen vanligtvis den mest praktiska ingången att använda för detta ändamål. En dummyimplementering av tp_init för en typ som endast finns för att aktivera slutsatsdragning av felsökningstyp kan bara returnera noll omedelbart, som i föregående exempel.
Granska skillnader från standard-Python-felsökningen
Felsökningsprogrammet för blandat läge skiljer sig från python-standardfelsökaren. Den introducerar några extra funktioner men saknar vissa Python-relaterade funktioner, enligt följande:
- Funktioner som inte stöds inkluderar villkorliga brytpunkter, det interaktiva felsökningsfönstret och fjärrfelsökning mellan plattformar.
- Fönstret Omedelbart är tillgängligt men med en begränsad delmängd av dess funktioner, inklusive alla begränsningar som anges i det här avsnittet.
- Python-versioner som stöds omfattar endast CPython 2.7 och 3.3+.
- Om du vill använda Python med Visual Studio Shell (till exempel om du installerar det med det integrerade installationsprogrammet) kan Visual Studio inte öppna C++-projekt. Därför är redigeringsupplevelsen för C++-filer endast en grundläggande textredigerare. Felsökning av C/C++ och felsökning i blandat läge stöds dock fullt ut i Shell med källkod, steg in i inbyggd kod och utvärdering av C++-uttryck i felsökningsfönster.
- När du visar Python-objekt i verktygsfönstren Locals och Watch visar felsökningsprogrammet i blandat läge endast objektens struktur. Den utvärderar inte egenskaper automatiskt eller visar beräknade attribut. För samlingar visas endast element för inbyggda samlingstyper (
tuple, ,listdict,set). Anpassade samlingstyper visualiseras inte som samlingar, såvida de inte ärvs från någon inbyggd samlingstyp. - Uttrycksutvärderingen hanteras enligt beskrivningen i följande avsnitt.
Använda uttrycksutvärdering
Python-standardfelsökaren tillåter utvärdering av godtyckliga Python-uttryck i bevaknings - och omedelbara fönster när den felsökda processen pausas när som helst i koden, så länge den inte blockeras i en I/O-åtgärd eller något annat liknande systemanrop. Vid felsökning i blandat läge kan godtyckliga uttryck endast utvärderas när de stoppas i Python-kod, efter en brytpunkt eller när du kliver in i koden. Uttryck kan endast utvärderas på den tråd där brytpunkten eller stegåtgärden inträffade.
När felsökningsprogrammet stoppas i inbyggd kod eller i Python-kod där de beskrivna villkoren inte gäller, till exempel efter en steg-ut-åtgärd eller på en annan tråd). Uttrycksutvärdering är begränsad till åtkomst till lokala och globala variabler i omfånget för den markerade ramen, åtkomst till deras fält och indexering av inbyggda samlingstyper med literaler. Följande uttryck kan till exempel utvärderas i valfri kontext (förutsatt att alla identifierare refererar till befintliga variabler och fält av lämpliga typer):
foo.bar[0].baz['key']
Felsökningsprogrammet för blandat läge löser också sådana uttryck på olika sätt. Alla medlemsåtkomståtgärder letar bara upp fält som är direkt en del av objektet (till exempel en post i dess __dict__ eller __slots__, eller ett fält i en intern struct som exponeras för Python via tp_members) och ignorerar all __getattr__, __getattribute__eller deskriptorlogik. På samma sätt ignorerar alla indexeringsåtgärder __getitem__ och kommer åt de inre datastrukturerna i samlingar direkt.
För konsekvensens skull används det här namnmatchningsschemat för alla uttryck som matchar begränsningarna för utvärdering av begränsade uttryck. Det här schemat tillämpas oavsett om godtyckliga uttryck tillåts vid den aktuella stopppunkten. Om du vill framtvinga rätt Python-semantik när en fullständig utvärderare är tillgänglig, omsluter du uttrycket i parenteser:
(foo.bar[0].baz['key'])