Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De meeste reguliere Python-foutopsporingsprogramma's ondersteunen alleen foutopsporing van Python-code, maar het is gebruikelijk dat ontwikkelaars Python gebruiken met C of C++. Sommige scenario's die gebruikmaken van gemengde code zijn toepassingen die hoge prestaties vereisen of de mogelijkheid om platform-API's rechtstreeks aan te roepen, worden vaak gecodeerd in Python en C of C++.
Visual Studio biedt geïntegreerde, gelijktijdige foutopsporing in de gemengde modus voor Python en systeemeigen C/C++-code. De ondersteuning is beschikbaar wanneer u de optie systeemeigen ontwikkelhulpprogramma's voor Python selecteert voor de Python-ontwikkelworkload in het Installatieprogramma van Visual Studio:
In dit artikel leert u hoe u kunt werken met de volgende functies voor foutopsporing in de gemengde modus:
- Gecombineerde aanroepstacks
- Stap tussen Python en systeemeigen code
- Onderbrekingspunten in beide typen code
- Python-weergaven van objecten weergeven in systeemeigen frames en omgekeerd
- Foutopsporing binnen de context van het Python-project of het C++-project
Vereiste voorwaarden
Visual Studio 2017 en hoger. Foutopsporing in gemengde modus is niet beschikbaar met Python Tools voor Visual Studio 1.x in Visual Studio 2015 en eerder.
Visual Studio geïnstalleerd met ondersteuning voor Python-workloads. Zie Python-ondersteuning installeren in Visual Studiovoor meer informatie.
Foutopsporing in gemengde modus inschakelen in een Python-project
In de volgende stappen wordt beschreven hoe u foutopsporing in gemengde modus inschakelt in een Python-project:
Klik in Solution Explorer met de rechtermuisknop op het Python-project en selecteer Eigenschappen.
Selecteer in het deelvenster Eigenschappen het tabblad Foutopsporing en selecteer vervolgens de> optieSysteemeigen codeopsporing inschakelen:
Met deze optie schakelt u gemengde modus in voor alle foutopsporingssessies.
Aanbeveling
Wanneer u systeemeigen codeopsporing inschakelt, wordt het Python-uitvoervenster mogelijk onmiddellijk gesloten nadat het programma is voltooid, zonder te pauzeren en de Druk op een willekeurige toets om door te gaan prompt weer te geven. Als u de pauze en prompt wilt afdwingen nadat u native code debugging hebt ingeschakeld, voegt u het
-iargument toe aan het veld Argumenten voor uitvoeren>interpreter op het tabblad Foutopsporing. Met dit argument zet u de Python-interpreter in de interactieve modus nadat de code is uitgevoerd. Het programma wacht totdat u Ctrl+Z+Enter- selecteert om het venster te sluiten.Selecteer Bestand>opslaan (of Ctrl+S) om de eigenschapswijzigingen op te slaan.
Als u het foutopsporingsprogramma in de gemengde modus wilt koppelen aan een bestaand proces, selecteert u Foutopsporing>bijvoegen bij proces. Er wordt een dialoogvenster geopend.
Selecteer in het dialoogvenster Bijvoegen aan proces het juiste proces in de lijst.
Gebruik voor het veld Bijvoegen de optie Selecteren om het dialoogvenster Codetype selecteren te openen.
Kies in het dialoogvenster Codetype selecteren de optie Fouten opsporen in deze codetypen .
Schakel in de lijst het selectievakje Python (systeemeigen) in en selecteer OK:
Selecteer Bijvoegen om het foutopsporingsprogramma te starten.
De instellingen voor het codetype zijn permanent. Als u foutopsporing in de gemengde modus wilt uitschakelen en later aan een ander proces wilt koppelen, schakelt u het selectievakje Python-codetype (systeemeigen) uit en schakelt u het selectievakje Systeemeigen codetype in.
U kunt naast of in plaats van de optie Systeemeigen ook andere codetypen selecteren. Als een beheerde toepassing bijvoorbeeld als host fungeert voor CPython, die op zijn beurt systeemeigen extensiemodules gebruikt en u fouten wilt opsporen in alle drie codeprojecten, schakelt u de selectievakjes Python, Systeemeigen en Beheerd in. Deze benadering biedt u een uniforme foutopsporingservaring, waaronder gecombineerde aanroepstacks en stappen tussen alle drie de runtimes.
Werken met virtuele omgevingen
Wanneer u deze methode gebruikt voor foutopsporing in gemengde modus voor virtuele omgevingen (venvs), gebruikt Python voor Windows een python.exe stub-bestand voor venvs die Visual Studio als subproces vindt en laadt.
Voor Python 3.8 en hoger biedt mixed-mode geen ondersteuning voor foutopsporing in meerdere processen. Wanneer u de foutopsporingssessie start, wordt de stub-subprocess foutopsporing uitgevoerd in plaats van de toepassing. Voor bijvoegscenario's is de tijdelijke oplossing het koppelen aan het juiste
python.exebestand. Wanneer u de toepassing start met foutopsporing (zoals via de toetscombinatie F5 ), kunt u uw venv maken met behulp van de opdrachtC:\Python310-64\python.exe -m venv venv --symlinks. Voeg in de opdracht de gewenste versie van Python in. Standaard kunnen alleen beheerders symlinks maken in Windows.Voor Python-versies ouder dan 3.8 moet foutopsporing in de gemengde modus werken zoals verwacht met venvs.
Als u in een globale omgeving wordt uitgevoerd, worden deze problemen niet veroorzaakt voor een versie van Python.
Python-symbolen installeren
Wanneer u de foutopsporing voor het eerst start in de gemengde modus, ziet u mogelijk het dialoogvenster Vereiste Python-symbolen . U moet de symbolen slechts eenmaal installeren voor een bepaalde Python-omgeving. Symbolen worden automatisch opgenomen als u Python-ondersteuning installeert via het Visual Studio Installer (Visual Studio 2017 en hoger). Zie Symbolen voor foutopsporing installeren voor Python-interpreters in Visual Studio voor meer informatie.
Toegang tot Python-broncode
U kunt de broncode voor standaard Python zelf beschikbaar maken bij foutopsporing.
Download het Python-broncodearchief dat geschikt is voor uw versie en pak de code uit in een map.
Wanneer Visual Studio vraagt om de locatie van de Python-broncode, wijst u de specifieke bestanden in de extractiemap aan.
Foutopsporing in gemengde modus inschakelen in een C/C++-project
Visual Studio 2017 versie 15.5 en hoger biedt ondersteuning voor foutopsporing in gemengde modus vanuit een C/C++-project. Een voorbeeld van dit gebruik is wanneer u Python wilt insluiten in een andere toepassing, zoals beschreven in python.org.
In de volgende stappen wordt beschreven hoe u foutopsporing in gemengde modus inschakelt voor een C/C++-project:
Klik in Solution Explorer met de rechtermuisknop op het C/C++-project en selecteer Eigenschappen.
Selecteer in het deelvenster Eigenschappenpagina's het tabbladFoutopsporingvan configuratie-eigenschappen>.
Vouw de vervolgkeuzelijst voor het foutopsporingsprogramma uit om de optie te starten en selecteer Python/Systeemeigen foutopsporing.
Opmerking
Als u de optie Python/Systeemeigen foutopsporing niet ziet, moet u eerst de systeemeigen Python-ontwikkelhulpprogramma's installeren met behulp van het Installatieprogramma van Visual Studio. De systeemeigen foutopsporingsoptie is beschikbaar onder de Python-ontwikkelworkload. Zie Python-ondersteuning installeren in Visual Studiovoor meer informatie.
Selecteer OK om de wijzigingen op te slaan.
Fouten opsporen in het startprogramma voor programma's
Wanneer u deze methode gebruikt, kunt u geen fouten opsporen in het py.exe startprogramma voor programma's omdat het een onderliggend python.exe subproces veroorzaakt. Het foutopsporingsprogramma wordt niet gekoppeld aan het subproces. Voor dit scenario is de tijdelijke oplossing om het python.exe programma rechtstreeks met argumenten te starten, als volgt:
Ga in het deelvenster Eigenschappenpagina's voor het C/C++-project naar het tabblad Foutopsporing van configuratie-eigenschappen>.
Geef voor de opdrachtoptie het volledige pad naar het
python.exeprogrammabestand op.Geef de gewenste argumenten op in het veld Opdrachtargumenten .
Het foutopsporingsprogramma voor gemengde modus koppelen
Voor Visual Studio 2017 versie 15.4 en eerder is foutopsporing in de directe gemengde modus alleen ingeschakeld wanneer u een Python-project in Visual Studio start. De ondersteuning is beperkt omdat C/C++-projecten alleen het systeemeigen foutopsporingsprogramma gebruiken.
Voor dit scenario is de tijdelijke oplossing om het foutopsporingsprogramma afzonderlijk toe te voegen:
Start het C++-project zonder foutopsporing door Foutopsporing>starten zonder foutopsporing te selecteren of gebruik de sneltoets Ctrl+F5.
Als u het foutopsporingsprogramma in de gemengde modus wilt koppelen aan een bestaand proces, selecteert u Foutopsporing>bijvoegen bij proces. Er wordt een dialoogvenster geopend.
Selecteer in het dialoogvenster Bijvoegen aan proces het juiste proces in de lijst.
Gebruik voor het veld Bijvoegen de optie Selecteren om het dialoogvenster Codetype selecteren te openen.
Kies in het dialoogvenster Codetype selecteren de optie Fouten opsporen in deze codetypen .
Schakel in de lijst het selectievakje Python in en selecteer OK.
Selecteer Bijvoegen om het foutopsporingsprogramma te starten.
Aanbeveling
U kunt een onderbreking of vertraging toevoegen in de C++-toepassing om ervoor te zorgen dat de Python-code die u wilt opsporen niet aanroept voordat u het foutopsporingsprogramma toevoegt.
Specifieke functies in gemengde modus verkennen
Visual Studio biedt verschillende functies voor foutopsporing in gemengde modus, zodat u eenvoudiger fouten in uw toepassing kunt opsporen:
- Gecombineerde aanroepstack
- Stap tussen Python en systeemeigen code
- PyObject-waardenweergave in systeemeigen code
- Systeemeigen waardenweergave in Python-code
Een gecombineerde aanroepstack gebruiken
In het venster Aanroepstack worden zowel systeemeigen als Python-stackframes weergegeven, waarbij overgangen zijn gemarkeerd tussen de twee:
- Als u overgangen wilt weergeven als [Externe code] zonder de richting van de overgang op te geven, gebruikt u het deelvenster Extra>opties . Vouw de sectie Alle instellingen>voor foutopsporing>algemeen uit en schakel het selectievakje Just Mijn code inschakelen in.
- Als u overgangen wilt weergeven als [externe code] zonder de richting van de overgang op te geven, gebruikt u het dialoogvenster Extra>opties . Vouw de sectie Foutopsporing>algemeen uit, schakel het selectievakje Just Mijn code inschakelen in en selecteer VERVOLGENS OK.
- Als u een oproepframe actief wilt maken, dubbelklikt u op het frame. Met deze actie wordt ook de bijbehorende broncode geopend, indien mogelijk. Als broncode niet beschikbaar is, wordt het frame nog steeds actief gemaakt en kunnen lokale variabelen worden geïnspecteerd.
Stap tussen Python en systeemeigen code
Visual Studio biedt de opdrachten Step Into (F11) of Step Out (Shift+F11) om het foutopsporingsprogramma voor gemengde modus in te schakelen om wijzigingen tussen codetypen correct te verwerken.
Wanneer Python een methode aanroept van een type dat in C is geïmplementeerd, stopt een aanroep naar die methode aan het begin van de systeemeigen functie waarmee de methode wordt geïmplementeerd.
Hetzelfde gedrag treedt op wanneer systeemeigen code een Python API-functie aanroept die resulteert in Python-code die wordt aangeroepen. Stap in een aanroep naar
PyObject_CallObjecteen functiewaarde die oorspronkelijk is gedefinieerd in Python stopt aan het begin van de Python-functie.Stap in van Python naar systeemeigen wordt ook ondersteund voor systeemeigen functies die worden aangeroepen vanuit Python via ctypes.
De weergave PyObject-waarden gebruiken in systeemeigen code
Wanneer een systeemeigen frame (C of C++) actief is, worden de lokale variabelen weergegeven in het venster van het foutopsporingsprogramma Locals . In systeemeigen Python-extensiemodules zijn veel van deze variabelen van het type PyObject (een typedef voor _object) of een paar andere fundamentele Python-typen. In foutopsporing in gemengde modus geven deze waarden een ander onderliggend knooppunt weer met het label [Python-weergave].
Als u de Python-weergave van de variabele wilt weergeven, vouwt u het knooppunt uit. De weergave van de variabelen is identiek aan wat u ziet als een lokale variabele die naar hetzelfde object verwijst, aanwezig is in een Python-frame. De onderliggende elementen van dit knooppunt kunnen worden bewerkt.
Als u deze functie wilt uitschakelen, klikt u met de rechtermuisknop op een willekeurige plaats in het venster Locals en schakelt u de menuoptiePython Show Python> View Nodes in:
C-typen die Python-weergaveknooppunten weergeven
De volgende C-typen tonen [Python view] -knooppunten, indien ingeschakeld:
PyObjectPyVarObjectPyTypeObjectPyByteArrayObjectPyBytesObjectPyTupleObjectPyListObjectPyDictObjectPySetObjectPyIntObjectPyLongObjectPyFloatObjectPyStringObjectPyUnicodeObject
[Python-weergave] wordt niet automatisch weergegeven voor typen die u zelf ontwerpt. Wanneer u extensies voor Python 3.x ontwerpt, is dit gebrek meestal geen probleem. Elk object heeft uiteindelijk een ob_base veld van een van de vermelde C-typen, waardoor [Python-weergave] wordt weergegeven.
Systeemeigen waarden weergeven in Python-code
U kunt een [C++-weergave] inschakelen voor systeemeigen waarden in het venster Locals wanneer een Python-frame actief is. Deze functie is standaard niet geactiveerd.
Als u de functie wilt inschakelen, klikt u met de rechtermuisknop in het venster Locals en stelt u de menuoptie Python>Show C++ View Nodes in.
Het knooppunt [C++ weergave] biedt een weergave van de onderliggende C/C++-structuur voor een waarde, die identiek is aan wat u in een systeemeigen frame ziet. Er wordt een exemplaar van
_longobject(eenPyLongObjecttypedef) weergegeven voor een lang Python-geheel getal en wordt geprobeerd typen af te stellen voor systeemeigen klassen die u zelf maakt. De onderliggende elementen van dit knooppunt kunnen worden bewerkt.
Als een onderliggend veld van een object van het type PyObjectis of een ander ondersteund type, heeft het een weergaveknooppunt [Python-weergave] (als deze weergaven zijn ingeschakeld). Dit gedrag maakt het mogelijk om door objectgrafieken te navigeren waarbij koppelingen niet rechtstreeks zichtbaar zijn voor Python.
In tegenstelling tot [Python-weergave] -knooppunten, die python-objectmetagegevens gebruiken om het type van het object te bepalen, is er geen vergelijkbaar betrouwbaar mechanisme voor [C++-weergave]. Over het algemeen is het, gezien een Python-waarde (dat wil zeggen een PyObject verwijzing), het niet mogelijk om betrouwbaar te bepalen welke C/C++-structuur er een back-up van maakt. Het foutopsporingsprogramma in de gemengde modus probeert het type te raden door te kijken naar verschillende velden van het objecttype (zoals waarnaar wordt verwezen door ob_type het PyTypeObject veld) met functieaanwijzertypen. Als een van deze functie-aanwijzers verwijst naar een functie die kan worden omgezet en die functie een self parameter heeft met een type dat specifieker is dan PyObject*, wordt ervan uitgegaan dat dat type het backingtype is.
Bekijk het volgende voorbeeld, waarbij de ob_type->tp_init waarde voor een bepaald object verwijst naar de volgende functie:
static int FobObject_init(FobObject* self, PyObject* args, PyObject* kwds) {
return 0;
}
In dit geval kan het foutopsporingsprogramma correct afleiden dat het C-type van het object is FobObject. Als het foutopsporingsprogramma geen nauwkeuriger type tp_initkan bepalen, gaat het verder met andere velden. Als het type niet kan worden afgeleid uit een van deze velden, geeft het knooppunt [C++ weergave] het object weer als een PyObject exemplaar.
Als u altijd een nuttige weergave wilt krijgen voor aangepaste typen, kunt u het beste ten minste één speciale functie registreren bij het registreren van het type en een sterk getypte self parameter gebruiken. De meeste typen voldoen natuurlijk aan die vereiste. Voor andere typen is de tp_init inspectie meestal de handigste vermelding voor dit doel. Een dummy-implementatie van een type dat alleen aanwezig is om deductie van tp_init het foutopsporingsprogramma in te schakelen, kan gewoon nul onmiddellijk retourneren, zoals in het voorgaande voorbeeld.
Verschillen met standaard python-foutopsporing controleren
Het foutopsporingsprogramma voor gemengde modus verschilt van het standaarddebugger van Python. Het introduceert enkele extra functies, maar mist enkele Python-gerelateerde mogelijkheden, als volgt:
- Niet-ondersteunde functies zijn onder andere voorwaardelijke onderbrekingspunten, het venster Debug Interactive en platformoverschrijdende externe foutopsporing.
- Het venster Direct is beschikbaar, maar met een beperkte subset van de functionaliteit, inclusief alle beperkingen die in deze sectie worden vermeld.
- Ondersteunde Python-versies bevatten alleen CPython 2.7 en 3.3+.
- Als u Python wilt gebruiken met Visual Studio Shell (bijvoorbeeld als u deze installeert met het geïntegreerde installatieprogramma), kan Visual Studio geen C++-projecten openen. Als gevolg hiervan is de bewerkingservaring voor C++-bestanden alleen die van een eenvoudige teksteditor. C/C++ foutopsporing en foutopsporing in gemengde modus worden echter volledig ondersteund in Shell met broncode, stap in systeemeigen code en C++ expressie-evaluatie in foutopsporingsvensters.
- Wanneer u Python-objecten bekijkt in de vensters locals en watch debugger, toont het foutopsporingsprogramma in de gemengde modus alleen de structuur van de objecten. Er worden geen eigenschappen automatisch geëvalueerd of berekende kenmerken weergegeven. Voor verzamelingen worden alleen elementen weergegeven voor ingebouwde verzamelingstypen (
tuple,list,dict).setAangepaste verzamelingstypen worden niet gevisualiseerd als verzamelingen, tenzij ze worden overgenomen van een ingebouwd verzamelingstype. - Expressie-evaluatie wordt verwerkt zoals beschreven in de volgende sectie.
Expressie-evaluatie gebruiken
Met het standaard python-foutopsporingsprogramma kunnen willekeurige Python-expressies in de Watch - en Immediate-vensters worden geëvalueerd wanneer het foutopsporingsproces op elk moment in de code wordt onderbroken, zolang het niet wordt geblokkeerd in een I/O-bewerking of een andere vergelijkbare systeemaanroep. In foutopsporing in gemengde modus kunnen willekeurige expressies alleen worden geëvalueerd wanneer ze zijn gestopt in Python-code, na een onderbrekingspunt of wanneer u in de code stapt. Expressies kunnen alleen worden geëvalueerd op de thread waarop het onderbrekingspunt of de stapbewerking heeft plaatsgevonden.
Wanneer het foutopsporingsprogramma stopt in systeemeigen code of in Python-code waarbij de beschreven voorwaarden niet van toepassing zijn, zoals na een uitstapbewerking of op een andere thread). Expressie-evaluatie is beperkt tot toegang tot lokale en globale variabelen binnen het bereik van het geselecteerde frame, het openen van hun velden en het indexeren van ingebouwde verzamelingstypen met letterlijke waarden. De volgende expressie kan bijvoorbeeld worden geëvalueerd in elke context (mits alle id's verwijzen naar bestaande variabelen en velden van de juiste typen):
foo.bar[0].baz['key']
Het foutopsporingsprogramma voor gemengde modus lost dergelijke expressies ook anders op. Alle bewerkingen voor lidtoegang zoeken alleen velden op die rechtstreeks deel uitmaken van het object (zoals een vermelding in __dict__ de of __slots__, of een veld van een systeemeigen struct die beschikbaar is voor Python via tp_members), en negeren alle __getattr__, __getattribute__of descriptorlogica. Op dezelfde manier worden alle indexeringsbewerkingen genegeerd __getitem__en worden de interne gegevensstructuren van verzamelingen rechtstreeks geopend.
Omwille van consistentie wordt dit naamomzettingsschema gebruikt voor alle expressies die overeenkomen met de beperkingen voor de evaluatie van beperkte expressies. Dit schema wordt toegepast, ongeacht of willekeurige expressies zijn toegestaan op het huidige stoppunt. Als u de juiste Python-semantiek wilt afdwingen wanneer een volledig aanbevolen evaluator beschikbaar is, plaatst u de expressie tussen haakjes:
(foo.bar[0].baz['key'])