Een probleem melden met de Microsoft C++-toolset of -documentatie
Als u problemen vindt in de Microsoft C++-compiler (MSVC), de linker of andere hulpprogramma's en bibliotheken, willen we er meer over weten. Als het probleem zich in onze documentatie bevindt, willen we daar ook over weten.
Probleem met een C++-toolset rapporteren
De beste manier om ons te laten weten over een probleem is ons een rapport te sturen dat een beschrijving bevat van het probleem dat u hebt ontdekt. Het moet alle details hebben over hoe u uw programma bouwt. En het moet een reprobevatten, een volledige testcase die we kunnen gebruiken om het probleem op onze eigen machines te reproduceren. Met deze informatie kunnen we snel controleren of het probleem in onze code bestaat en niet lokaal is in uw omgeving. Het helpt ons te bepalen of het van invloed is op andere versies van de compiler en om de oorzaak ervan te diagnosticeren.
Lees in de volgende secties wat een goed rapport is. We beschrijven hoe u een repro genereert voor het soort probleem dat u hebt gevonden en hoe u uw rapport naar het productteam verzendt. Uw rapporten zijn belangrijk voor ons en voor andere ontwikkelaars zoals u. Bedankt voor het verbeteren van Microsoft C++.
Uw rapport voorbereiden
Het is belangrijk om een rapport van hoge kwaliteit te maken, omdat het moeilijk is om het probleem te reproduceren dat u hebt gevonden zonder volledige informatie. Hoe beter uw rapport is, hoe effectiever we het probleem opnieuw kunnen maken en diagnosticeren.
Het rapport moet minimaal het volgende bevatten:
De volledige versie-informatie van de toolset die u gebruikt.
De volledige cl.exe opdrachtregel die wordt gebruikt om uw code te bouwen.
Een gedetailleerde beschrijving van het probleem dat u hebt gevonden.
Een repro: een volledig, vereenvoudigd, zelfstandig broncodevoorbeeld dat het probleem laat zien.
Lees verder voor meer informatie over de specifieke informatie die we nodig hebben en waar u deze kunt vinden en hoe u een goede repro kunt maken.
De versie van de toolset
We hebben de volledige versie-informatie en de doelarchitectuur van de toolset nodig die het probleem veroorzaakt. Dat is zodat we uw repro kunnen testen op dezelfde toolset op onze machines. Als we het probleem kunnen reproduceren, geeft deze informatie ons ook een beginpunt om te onderzoeken welke andere versies van de toolset hetzelfde probleem hebben.
De volledige versie van uw compiler rapporteren
Open de opdrachtprompt voor ontwikkelaars die overeenkomt met de Visual Studio-versie en configuratiearchitectuur die wordt gebruikt om uw project te bouwen. Als u bijvoorbeeld werkt met behulp van Visual Studio 2017 op x64 voor x64-doelplatform, kiest u x64 Native Tools-opdrachtprompt voor VS 2017-. Zie voor meer informatie Snelkoppelingen voor opdrachtprompt voor ontwikkelaars.
Voer in het consolevenster van de opdrachtprompt voor ontwikkelaars de opdracht cl /Bvin.
De uitvoer moet er ongeveer als volgt uitzien:
C:\Users\username\Source>cl /Bv
Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26428.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
Compiler Passes:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\cl.exe: Version 19.14.26428.1
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\c1.dll: Version 19.14.26428.1
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\c1xx.dll: Version 19.14.26428.1
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\c2.dll: Version 19.14.26428.1
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\link.exe: Version 14.14.26428.1
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\mspdb140.dll: Version 14.14.26428.1
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\1033\clui.dll: Version 19.14.26428.1
cl : Command line error D8003 : missing source filename
Kopieer en plak de volledige uitvoer in uw rapport.
De opdrachtregel
We hebben de exacte opdrachtregel, cl.exe en alle bijbehorende argumenten, nodig om uw code te bouwen. Dat is zodat we het op precies dezelfde manier kunnen bouwen op onze machines. Het is belangrijk dat het probleem dat u hebt gevonden, alleen bestaat bij het bouwen met een bepaald argument of een combinatie van argumenten.
De beste plek om deze informatie te vinden is in het buildlogboek direct nadat u het probleem ondervindt. Het zorgt ervoor dat de opdrachtregel exact dezelfde argumenten bevat die kunnen bijdragen aan het probleem.
De inhoud van de opdrachtregel rapporteren
Zoek het bestand CL.command.1.tlog en open het. Dit bestand bevindt zich standaard in de map Documenten in \Visual Studio versie\Projects\SolutionName\ProjectName\Configuration\ProjectName.tlog\CL.command.1.tlog, of in de map Gebruiker onder \Source\Repos\SolutionName\ProjectName\Configuration\ProjectName.tlog\CL.command.1.tlog. Het kan zich op een andere locatie bevinden als u een ander buildsysteem gebruikt of als u de standaardlocatie voor uw project hebt gewijzigd.
Zoek in dit bestand de namen van uw broncodebestanden, gevolgd door de opdrachtregelargumenten die worden gebruikt om ze te compileren, elk op afzonderlijke regels.
Zoek de regel met de naam van het broncodebestand waarin het probleem zich voordoet. De regel eronder bevat de bijbehorende cl.exe opdrachtargumenten.
Kopieer en plak de volledige opdrachtregel in uw rapport.
Een beschrijving van het probleem
We hebben een gedetailleerde beschrijving nodig van het probleem dat u hebt gevonden. Dat is zodat we kunnen controleren of we hetzelfde effect op onze machines zien. Het is ook soms handig voor ons om te weten wat u probeerde te bereiken en wat u verwachtte te gebeuren.
Een goede beschrijving bevat de exacte foutberichten gegeven door de toolset, of het exacte runtime-gedrag dat je ziet. We hebben deze informatie nodig om te controleren of het probleem correct is gereproduceerd. Neem alle van de compileruitvoer op, niet alleen het laatste foutbericht. We moeten alles zien wat heeft geleid tot het probleem dat u rapporteert. Als u het probleem kunt dupliceren met behulp van de opdrachtregelcompiler, heeft die compiler-uitvoer de voorkeur. De IDE en andere buildsystemen kunnen de foutberichten die u ziet filteren of alleen de eerste regel van een foutbericht vastleggen.
Als het probleem is dat de compiler ongeldige code accepteert en geen diagnostische gegevens genereert, neemt u deze op in uw rapport.
Als u een probleem met runtimegedrag wilt melden, neemt u een exacte kopie op van wat het programma afdrukt en wat u verwacht te zien. Sluit het idealiter zelf in de uitvoerzin in, bijvoorbeeld printf("This should be 5: %d\n", actual_result);
. Als uw programma crasht of vastloopt, vermeldt u dat ook.
Voeg eventuele andere gegevens toe die ons kunnen helpen bij het vaststellen van het probleem dat u hebt gevonden, zoals eventuele problemen die u hebt ontdekt. Probeer de gegevens die ergens anders in uw rapport zijn gevonden, niet te herhalen.
De repro
Een repro- is een volledig, zelfstandig voorbeeld van broncode. Het demonstreert op reproduceerbare wijze het probleem dat u hebt gevonden, daarom de naam. We hebben een repro nodig, zodat we de fout op onze machines kunnen reproduceren. De code moet op zichzelf voldoende zijn om een eenvoudig uitvoerbaar bestand te maken dat wordt gecompileerd en uitgevoerd. Of dat zou compileren en uitvoeren, ware het niet voor het probleem dat u hebt gevonden. Een repro is geen codefragment. Het moet volledige functies en klassen hebben en alle benodigde #include instructies bevatten, zelfs voor de standaardheaders.
Wat een goede repro maakt
Een goede repro is:
Minimaal. Repros moet zo klein mogelijk zijn, maar nog steeds precies het probleem laten zien dat u hebt gevonden. Repros hoeft niet complex of realistisch te zijn. Ze hoeven alleen code weer te geven die voldoet aan de standaard of aan de gedocumenteerde compiler-implementatie. Voor een ontbrekende diagnose moet uw repro de code weergeven die niet voldoet. Eenvoudige, to-the-point repros die slechts voldoende code bevatten om het probleem te laten zien, is het beste. Als u de code kunt elimineren of vereenvoudigen en conform kunt blijven en het probleem ook ongewijzigd kunt laten, doet u dit. U hoeft geen prestatievoorbeelden op te nemen van code die werkt.
Zelfstandig. Repros moet onnodige afhankelijkheden voorkomen. Als u het probleem zonder bibliotheken van derden kunt reproduceren, doet u dit. Als u het probleem kunt reproduceren zonder bibliotheekcode naast eenvoudige uitvoerinstructies (bijvoorbeeld
puts("this shouldn't compile");
,std::cout << value;
enprintf("%d\n", value);
), doet u dit. Het is ideaal als het voorbeeld kan worden beperkt tot één broncodebestand, zonder te verwijzen naar eventuele gebruikersheaders. Het verminderen van de hoeveelheid code die we moeten overwegen als mogelijke bijdrager aan het probleem, is enorm nuttig voor ons.Tegen de nieuwste compilerversie. Repros moet waar mogelijk de meest recente update naar de nieuwste versie van de toolset gebruiken. Of gebruik de meest recente voorlopige versie van de volgende update of de volgende primaire release. Problemen die u in oudere versies van de toolset kunt vinden, zijn vaak opgelost in nieuwere versies. Fixes worden alleen in uitzonderlijke omstandigheden teruggezet naar oudere versies.
Vergeleken met andere compilers als relevant. Repros die betrekking hebben op draagbare C++-code, moet indien mogelijk gedrag verifiëren voor andere compilers. De C++-standaard bepaalt uiteindelijk de juistheid van het programma en geen compiler is perfect. Als Clang en GCC uw code echter accepteren zonder diagnostische gegevens en MSVC niet, hebt u waarschijnlijk een bug in onze compiler gevonden. (Andere mogelijkheden zijn verschillen in Unix- en Windows-gedrag, of verschillende niveaus van C++-standaardenimplementatie, enzovoort.) Wanneer alle compilers uw code afwijzen, is de code waarschijnlijk onjuist. Als u verschillende foutberichten ziet, kunt u het probleem zelf vaststellen.
U vindt lijsten met online compilers waarop u uw code kunt testen in Online C++-compilers op de ISO C++-website of op deze samengestelde Lijst met online C++-compilers op GitHub. Enkele specifieke voorbeelden zijn Wandbox en Compiler Explorer.
Notitie
De online compilerwebsites zijn niet gekoppeld aan Microsoft. Veel online compilerwebsites worden uitgevoerd als persoonlijke projecten. Sommige van deze sites zijn mogelijk niet beschikbaar wanneer u dit leest, maar een zoekopdracht moet anderen vinden die u kunt gebruiken.
Problemen in de compiler, linker en in de bibliotheken worden meestal op bepaalde manieren weergegeven. Het soort probleem dat u vindt, bepaalt welke soort weergave u in uw rapport moet opnemen. Zonder een passende repro hebben we niets te onderzoeken. Hier volgen enkele van de soorten problemen die u mogelijk ziet. We bevatten instructies voor het genereren van het soort repro dat u moet gebruiken om elk soort probleem te rapporteren.
Frontend (parser) crash
Frontend crashes treden op tijdens de parseringsfase van de compiler. Normaal gesproken verzendt de compiler Fatal Error C1001en verwijst naar het broncodebestand en het regelnummer waarop de fout is opgetreden. Het vermeldt vaak een bestand met de naam msc1.cpp, maar u kunt dit detail negeren.
Geef voor dit soort crash een vooraf verwerkte repro-op.
Hier volgt een voorbeeld van compileruitvoer voor dit soort crash:
SandBoxHost.cpp
d:\o\dev\search\foundation\common\tools\sandbox\managed\managed.h(929):
fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'msc1.cpp', line 1369)
To work around this problem, try simplifying or changing the program near the
locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
d:\o\dev\search\foundation\common\tools\sandbox\managed\managed.h(929):
note: This diagnostic occurred in the compiler generated function
'void Microsoft::Ceres::Common::Tools::Sandbox::SandBoxedProcess::Dispose(bool)'
Internal Compiler Error in d:\o\dev\otools\bin\x64\cl.exe. You will be prompted
to send an error report to Microsoft later.
INTERNAL COMPILER ERROR in 'd:\o\dev\otools\bin\x64\cl.exe'
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Back-end crash (code-generatie)
Back-end crashes treden op tijdens de codegeneratiefase van de compiler. Normaal gesproken veroorzaakt de compiler Fatal Error C1001, en mogelijk wordt er niet verwezen naar het broncodebestand en het regelnummer dat bij het probleem hoort. Het vermeldt vaak de bestandscompilator\utc\src\p2\main.c, maar u kunt dit detail negeren.
Geef voor dit soort crash een Link repro als u de LTCG (Link-Time Code Generation) gebruikt, ingeschakeld door het opdrachtregelargument /GL naar cl.exe. Zo niet, geef in plaats daarvan een vooraf verwerkte repro .
Hier volgt een voorbeeld van compileruitvoer voor een back-endcrash waarbij LTCG niet wordt gebruikt. Als de uitvoer van de compiler er als volgt uitziet, moet u een vooraf verwerkte herpro-opgeven.
repro.cpp
\\officefile\public\tadg\vc14\comperror\repro.cpp(13) : fatal error C1001:
An internal error has occurred in the compiler.
(compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 230)
To work around this problem, try simplifying or changing the program near the
locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
INTERNAL COMPILER ERROR in
'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.exe'
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Als de regel die begint met INTERNE COMPILERFOUT vermeldt link.exe, in plaats van cl.exe, is LTCG ingeschakeld. Geef in dit geval een koppelingspropro op. Als het niet duidelijk is of LTCG is ingeschakeld vanuit het foutbericht van de compiler, controleert u de opdrachtregelargumenten. U hebt ze in een vorige stap uit het build-logboek gekopieerd voor het /GL opdrachtregel-argument.
Linker fout
Linker crasht tijdens de koppelingsfase, nadat de compiler heeft gedraaid. Normaal gesproken genereert de linker Linker Tools Error LNK1000.
Notitie
Als in de uitvoer C1001 wordt vermeld of koppelingstijdcode wordt gegenereerd, raadpleegt u back-end (codegeneratie) crash.
Geef voor dit soort crash een Koppelingspro-op.
Hier volgt een voorbeeld van compileruitvoer voor dit soort crash:
z:\foo.obj : error LNK1000: Internal error during IMAGE::Pass2
Version 14.00.22816.0
ExceptionCode = C0000005
ExceptionFlags = 00000000
ExceptionAddress = 00007FF73C9ED0E6 (00007FF73C9E0000)
"z:\tools\bin\x64\link.exe"
NumberParameters = 00000002
ExceptionInformation[ 0] = 0000000000000000
ExceptionInformation[ 1] = FFFFFFFFFFFFFFFF
CONTEXT:
Rax = 0000000000000400 R8 = 0000000000000000
Rbx = 000000655DF82580 R9 = 00007FF840D2E490
Rcx = 005C006B006F006F R10 = 000000655F97E690
Rdx = 000000655F97E270 R11 = 0000000000000400
Rsp = 000000655F97E248 R12 = 0000000000000000
Rbp = 000000655F97EFB0 E13 = 0000000000000000
Rsi = 000000655DF82580 R14 = 000000655F97F390
Rdi = 0000000000000000 R15 = 0000000000000000
Rip = 00007FF73C9ED0E6 EFlags = 0000000000010206
SegCs = 0000000000000033 SegDs = 000000000000002B
SegSs = 000000000000002B SegEs = 000000000000002B
SegFs = 0000000000000053 SegGs = 000000000000002B
Dr0 = 0000000000000000 Dr3 = 0000000000000000
Dr1 = 0000000000000000 Dr6 = 0000000000000000
Dr2 = 0000000000000000 Dr7 = 0000000000000000
Als incrementele koppeling is ingeschakeld en het vastlopen pas na een geslaagde eerste koppeling is opgetreden, dat wil gezegd, alleen na de eerste volledige koppeling waarop een latere incrementele koppeling is gebaseerd, geeft u ook een kopie van het object (.obj) en bibliotheekbestanden (.lib) op die overeenkomen met bronbestanden die zijn gewijzigd nadat de eerste koppeling is voltooid.
Slechte codegeneratie
Het genereren van ongeldige code is zeldzaam. Dit gebeurt wanneer de compiler per ongeluk onjuiste code genereert die ervoor zorgt dat uw toepassing vastloopt tijdens runtime. In plaats daarvan moet deze de juiste code genereren of een probleem tijdens het compileren detecteren. Als u denkt dat het probleem dat u hebt gevonden, resulteert in slechte codegeneratie, behandelt u uw rapport hetzelfde als een crash van back-end (codegeneratie).
Geef voor dit type crash een Link-repro op als u het opdrachtregelargument /GL gebruikt voor cl.exe. Geef een vooraf verwerkte herpro- op als dat niet zo is.
Een repro genereren
Om ons te helpen de bron van het probleem op te sporen, is een goede repro essentieel. Voordat u een van de onderstaande stappen uitvoert voor specifieke soorten repros, probeert u de code te condenseren die het probleem zoveel mogelijk laat zien. Probeer afhankelijkheden, vereiste headers en bibliotheken te elimineren of te minimaliseren. Beperk indien mogelijk de compileropties en preprocessordefinities die worden gebruikt.
Hieronder volgen instructies voor het genereren van de verschillende soorten repros om verschillende soorten problemen te melden.
Voorverwerkte reproducties
Een vooraf verwerkte repro- is één bronbestand dat een probleem laat zien. Deze wordt gegenereerd op basis van de uitvoer van de C-preprocessor. Gebruik de compileroptie /P op het oorspronkelijke reprobronbestand om er een te maken. Met deze optie worden de opgenomen headers in lijnen om afhankelijkheden van andere bron- en headerbestanden te verwijderen. Met de optie worden ook macro's, #ifdef voorwaarden en andere preprocessoropdrachten opgelost die afhankelijk kunnen zijn van uw lokale omgeving.
Notitie
Voorbewerkte repros zijn niet zo nuttig voor problemen die mogelijk het gevolg zijn van fouten in onze standaardbibliotheek-implementatie, omdat we vaak onze nieuwste, lopende implementatie willen invoegen om te zien of we het probleem al hebben opgelost. In dit geval moet u de repro niet vooraf verwerken en als u het probleem niet kunt verminderen tot één bronbestand, verpakt u de code in een .zip bestand of vergelijkbaar, of kunt u overwegen om een IDE-project opnieuw te gebruiken. Zie Andere reprosvoor meer informatie.
Een broncodebestand vooraf verwerken
Leg de opdrachtregelargumenten vast die worden gebruikt om uw repro te maken, zoals beschreven in De inhoud van de opdrachtregelrapporteren.
Open de opdrachtprompt voor ontwikkelaars die overeenkomt met de Visual Studio-versie en configuratiearchitectuur die wordt gebruikt om uw project te bouwen.
Ga naar de map die uw repro-project bevat.
Voer in het consolevenster van de opdrachtprompt voor ontwikkelaars de opdracht in cl /Pargumentenfilename.cpp. Gebruik voor argumentende lijst met argumenten die u hierboven hebt vastgelegd. filename.cpp is de naam van jouw bronbestand voor repro. Deze opdracht repliceert de opdrachtregel die u hebt gebruikt voor de repro, maar stopt de compilatie nadat de preprocessor is uitgevoerd. Vervolgens wordt de vooraf verwerkte broncode naar bestandsnaam.igeschreven.
Als u een C++/CX-broncodebestand voorbewerkt of als u de functie C++-modules gebruikt, zijn er nog enkele stappen vereist. Zie de onderstaande secties voor meer informatie.
Nadat u het vooraf verwerkte bestand hebt gegenereerd, is het een goed idee om ervoor te zorgen dat het probleem nog steeds opnieuw optreedt wanneer u het vooraf verwerkte bestand compileert.
Om te bevestigen dat het vooraf verwerkte bestand de fout nog steeds reproduceert
Voer in het consolevenster van de opdrachtprompt voor ontwikkelaars de opdracht in clargumenten/TPbestandsnaam.i om cl.exe te vertellen het vooraf verwerkte bestand als een C++-bronbestand te compileren. De argumenten zijn dezelfde als hierboven besproken, maar met alle eventuele /D en /I argumenten verwijderd. Dat komt doordat ze al zijn opgenomen in het voorverwerkte bestand. bestandsnaam.i is de naam van het vooraf verwerkte bestand.
Controleer of het probleem is herhaald.
Voeg tot slot de vooraf verwerkte repro-bestandsnaam.i toe aan uw rapport.
Voorverwerkte C++/CX WinRT/UWP-codereproducties
Als u C++/CX gebruikt om uw uitvoerbare bestand te bouwen, zijn er enkele extra stappen vereist om een vooraf verwerkte repro te maken en te valideren.
C++/CX-broncode vooraf verwerken
Maak een vooraf verwerkt bronbestand zoals beschreven in Een broncodebestand vooraf verwerken.
Zoek in het gegenereerde -bestand.i naar #using-instructies.
Maak een lijst met alle bestanden waarnaar wordt verwezen. Laat alle Windows*.winmd-bestanden, platform.winmd-bestanden en mscorlib.dllweg.
Ter voorbereiding om te controleren of het vooraf verwerkte bestand het probleem nog steeds reproduceert,
Maak een nieuwe map voor het vooraf verwerkte bestand en kopieer deze naar de nieuwe map.
Kopieer de .winmd-bestanden uit uw #using lijst naar de nieuwe map.
Maak een leeg vccorlib.h-bestand in de nieuwe map.
Bewerk het voorverwerkte bestand om alle #using instructies voor mscorlib.dllte verwijderen.
Bewerk het vooraf verwerkte bestand om alle absolute paden te wijzigen in alleen de lege bestandsnamen voor de gekopieerde .winmd-bestanden.
Controleer of het vooraf verwerkte bestand het probleem nog steeds reproduceert, zoals hierboven.
Vooraf verwerkte C++-modules opnieuw
Als u de modulefunctie van de C++-compiler gebruikt, zijn er enkele verschillende stappen vereist om een vooraf verwerkte repro te maken en te valideren.
Een broncodebestand voorbewerken dat gebruikmaakt van een module
Leg de opdrachtregelargumenten vast die worden gebruikt om uw repro te maken, zoals beschreven in De inhoud van de opdrachtregelrapporteren.
Open de opdrachtprompt voor ontwikkelaars die overeenkomt met de Visual Studio-versie en configuratiearchitectuur die wordt gebruikt om uw project te bouwen.
Ga naar de map die uw repro-project bevat.
Voer in het consolevenster van de opdrachtprompt voor ontwikkelaars de opdracht in cl /Pargumentenfilename.cpp. De argumenten zijn de hierboven vastgelegde argumenten, en filename.cpp is de naam van het bronbestand dat de module gebruikt.
Ga naar de map met het repro-project dat de module-interface heeft gebouwd (de IFC-uitvoer).
Leg de opdrachtregelargumenten vast die worden gebruikt om de module-interface te bouwen.
Voer in het consolevenster van de opdrachtprompt voor ontwikkelaars de opdracht in cl /Pargumentenmodulenaam.ixx. De argumenten zijn de hierboven vastgelegde argumenten, en modulenaam.ixx is de bestandsnaam die de module-interface creëert.
Nadat u de vooraf verwerkte bestanden hebt gegenereerd, is het een goed idee om ervoor te zorgen dat het probleem nog steeds opnieuw optreedt wanneer u het vooraf verwerkte bestand gebruikt.
Om te bevestigen dat het vooraf verwerkte bestand de fout nog steeds reproduceert
Ga in het venster van de ontwikkelaarsconsole terug naar de map die uw repro-project bevat.
Voer de opdracht in clargumenten/TPbestandsnaam.i zoals hierboven, om het vooraf verwerkte bestand te compileren alsof het een C++-bronbestand was.
Controleer of het probleem nog steeds wordt gereproduceerd door het vooraf verwerkte bestand.
Voeg tot slot de vooraf verwerkte reprobestanden (bestandsnaam.i en modulenaam.i) samen met de .ifc-uitvoer toe aan uw rapport.
Link-repro's
Een link repro is de door de linker gegenereerde inhoud van een map, die is opgegeven door de link_repro omgevingsvariabele of als argument voor de linkeroptie /LINKREPRO. Het bevat buildartefacten die gezamenlijk een probleem demonstreren dat op het moment van de koppeling optreedt. Voorbeelden hiervan zijn een backendcrash bij LTCG (Link-Time Code Generation) of een linkercrash. Deze build-bestanden zijn nodig als linkerinput, zodat het probleem kan worden gereproduceerd. Een link repro kan eenvoudig worden gemaakt door gebruik te maken van deze omgevingsvariabele. Hiermee kan de ingebouwde functie voor het genereren van reproducties door de linker worden ingeschakeld.
Een koppelingspropro genereren met behulp van de omgevingsvariabele link_repro
Leg de opdrachtregelargumenten vast die worden gebruikt om uw repro te maken, zoals beschreven in De inhoud van de opdrachtregelrapporteren.
Open de opdrachtprompt voor ontwikkelaars die overeenkomt met de Visual Studio-versie en configuratiearchitectuur die wordt gebruikt om uw project te bouwen.
Ga in het consolevenster van de opdrachtprompt voor ontwikkelaars naar de map die uw repro-project bevat.
Voer mkdir linkrepro in om een directory met de naam linkrepro te maken voor de linkrepro. U kunt een andere naam gebruiken om een andere koppelingsrepro te maken.
Voer de opdracht link_repro=linkrepro in om de omgevingsvariabele link_repro in te stellen op de map die u hebt gemaakt. Als uw build wordt uitgevoerd vanuit een andere map, zoals vaak het geval is bij complexere projecten, stelt u in plaats daarvan link_repro in op het volledige pad naar uw koppelingspromap.
Als u het reproproject wilt bouwen in Visual Studio, voert u in het consolevenster van de opdrachtprompt voor ontwikkelaars de opdracht devenv-in. Het zorgt ervoor dat de waarde van de omgevingsvariabele link_repro zichtbaar is voor Visual Studio. Als u het project op de opdrachtregel wilt bouwen, gebruikt u de bovenstaande opdrachtregelargumenten om de repro-build te dupliceren.
Bouw uw repro-project en controleer of het verwachte probleem is opgetreden.
Sluit Visual Studio als u deze hebt gebruikt om de build uit te voeren.
Voer in het consolevenster van de opdrachtprompt voor ontwikkelaars de opdracht in link_repro= om de omgevingsvariabele link_repro te wissen.
Ten slotte verpakt u de repro door de volledige linkrepro-map te comprimeren in een .zip-bestand of vergelijkbaar, en deze toe te voegen aan uw rapport.
De optie /LINKREPRO linker heeft hetzelfde effect als de omgevingsvariabele link_repro. U kunt de optie /LINKREPROTARGET gebruiken om de naam op te geven waarop moet worden gefilterd voor de gegenereerde koppelingspropro. Als u /LINKREPROTARGETwilt gebruiken, moet u ook de linkeroptie /OUT opgeven.
Een koppelingrepro genereren met behulp van de optie /LINKREPRO
Maak een map aan voor het opslaan van de link_repro. We verwijzen naar het volledige mappad dat u maakt als mappad. Gebruik dubbele aanhalingstekens rond het pad als deze spaties bevat.
Voeg de /LINKREPROmappad-commando toe aan de linkeropdrachtregel. Open in Visual Studio het dialoogvenster Eigenschappenpagina's voor uw project. Selecteer de eigenschappenpagina Configuratie-eigenschappen>Linker>opdrachtregel. Typ vervolgens de optie /LINKREPRO:mappad in het vak Extra opties. Kies OK- om uw wijzigingen op te slaan.
Bouw uw repro-project en controleer of het verwachte probleem is opgetreden.
Ten slotte verpakt u de repro door het hele mappad te comprimeren map voor koppelingspromap in een .zip bestand of vergelijkbaar, en deze toe te voegen aan uw rapport.
Andere reproducties
Als u het probleem niet kunt herleiden tot één bronbestand of een voorverwerkte reproductie en het probleem geen koppelingsweergave vereist, kunnen we een IDE-project onderzoeken. Alle richtlijnen voor het maken van een goede repro zijn nog steeds van toepassing: de code moet minimaal en zelfstandig zijn. Het probleem moet optreden in onze meest recente hulpprogramma's en, indien relevant, mag niet worden gezien in andere compilers.
Maak uw repro als een minimaal IDE-project en pak het vervolgens in door de volledige mapstructuur te comprimeren in een .zip-bestand of vergelijkbaar en deze toe te voegen aan uw rapport.
Manieren om uw rapport te verzenden
U hebt een aantal goede manieren om uw rapport naar ons te sturen. U kunt het ingebouwde hulpprogramma voor probleemoplossing van Visual Studio of de pagina Visual Studio Developer Community gebruiken. Er is ook een productfeedbackknop onderaan deze pagina. De keuze is afhankelijk van of u de ingebouwde hulpprogramma's in de IDE wilt gebruiken om schermopnamen vast te leggen en uw rapport te organiseren. Als u dat liever niet wilt, kunt u de website van de Developer Community rechtstreeks gebruiken.
Notitie
Ongeacht hoe u uw rapport indient, respecteert Microsoft uw privacy. Microsoft streeft ernaar om te voldoen aan alle wet- en regelgeving op het gebied van gegevensprivacy. Zie de privacyverklaring van Microsoftvoor informatie over hoe we de gegevens behandelen die u ons stuurt.
Het hulpprogramma Een probleem melden gebruiken
Het hulpprogramma Een probleem melden in Visual Studio is een manier voor Visual Studio-gebruikers om problemen met slechts een paar klikken te melden. Er wordt een eenvoudig formulier weergegeven om gedetailleerde informatie te verzenden over het probleem dat u hebt gevonden. Vervolgens kunt u uw rapport indienen zonder de IDE te verlaten.
Het melden van uw probleem via het Een probleem melden hulpprogramma is eenvoudig en handig vanuit de IDE. U kunt deze openen via de titelbalk door het pictogram Feedback verzenden naast het zoekvak Snel starten te kiezen. U kunt deze ook vinden op de menubalk in Help>Feedback verzenden>Een probleem melden.
Wanneer u ervoor kiest om een probleem te melden, zoekt u eerst in de Ontwikkelaarscommunity naar vergelijkbare problemen. Als uw probleem eerder is gemeld, kunt u het rapport upvoten en opmerkingen toevoegen met meer details. Als u geen vergelijkbaar probleem ziet, kiest u de knop Nieuw probleem melden onder aan het dialoogvenster Feedback van Visual Studio en volgt u de stappen om uw probleem te melden.
De Visual Studio Developer Community-pagina's gebruiken
De Visual Studio Developer Community-pagina's zijn een andere handige manier om problemen te rapporteren en oplossingen te vinden voor Visual Studio en de C++-compiler, hulpprogramma's en bibliotheken. Er zijn specifieke ontwikkelaarscommunitypagina's voor Visual Studio, Visual Studio voor Mac, .NET, C++, Azure DevOps-en Azure DevOps Server.
Onder de communitytabbladen, boven aan elke pagina, bevindt zich een zoekvak. U kunt deze gebruiken om berichten te vinden die problemen melden die vergelijkbaar zijn met die van u. Mogelijk vindt u een oplossing of andere nuttige informatie met betrekking tot uw probleem al beschikbaar. Als iemand hetzelfde probleem eerder heeft gemeld, kunt u het rapport upvoten en erop reageren in plaats van een nieuw probleemrapport te maken. Als u een nieuw probleem wilt toevoegen, stemmen of melden, wordt u mogelijk gevraagd u aan te melden bij uw Visual Studio-account. De eerste keer dat u zich aanmeldt, moet u ermee akkoord gaan om de Developer Community-app toegang te geven tot uw profiel.
Voor problemen met de C++-compiler, linker en andere hulpprogramma's en bibliotheken zoekt u eerst op de pagina C++ Developer Community. Als u zoekt naar uw probleem en dit nog niet is gerapporteerd, kiest u de knop Een probleem melden knop naast het zoekvak. U kunt uw repro-code en opdrachtregel, schermopnamen, koppelingen naar gerelateerde discussies en andere informatie die u relevant en nuttig acht opnemen.
Tip
Informatie in het eerste communityrapport voor ontwikkelaars is altijd openbaar. Als dit een probleem is, raadpleegt u de volgende sectie over Rapporten en privacy.
Tip
Voor andere soorten problemen die u in Visual Studio kunt vinden die niet zijn gerelateerd aan de C++-toolset (bijvoorbeeld problemen met de gebruikersinterface, verbroken IDE-functionaliteit of algemene crashes), gebruikt u de Een probleem melden hulpprogramma in de IDE. Dit is de beste keuze, vanwege de schermopnamemogelijkheden en de mogelijkheid om UI-acties vast te leggen die leiden tot het probleem dat u hebt gevonden. Dit soort fouten kan ook worden opgezoekd op de site van visual Studio Developer Community. Zie Een probleem melden met Visual Studiovoor meer informatie.
Rapporten en privacy
Alle informatie in rapporten en opmerkingen en antwoorden is standaard openbaar zichtbaar. Normaal gesproken is het een voordeel, omdat de hele community de problemen, oplossingen en tijdelijke oplossingen kan zien die andere gebruikers hebben gevonden. Als u zich echter zorgen maakt over het openbaar maken van uw gegevens of identiteit, om privacy- of intellectuele eigendomsredenen, hebt u opties.
Als u zich zorgen maakt over het onthullen van uw identiteit, maak dan een nieuw Microsoft-account dat geen details over u openbaar maakt. Gebruik dit account om uw rapport te maken.
Plaats niets dat u privé wilt houden in de titel of inhoud van het eerste rapport, dat openbaar is. Stel in plaats daarvan dat u gegevens privé in een afzonderlijke opmerking verzendt. Als u ervoor wilt zorgen dat uw rapport naar de juiste personen wordt geleid, neemt u cppcompiler op in de lijst met onderwerpen van uw probleemrapport. Zodra het probleemrapport is gemaakt, kunt u opgeven wie uw antwoorden en bijlagen kan zien.
Een probleemrapport voor persoonlijke gegevens maken
Kies in het rapport dat u hebt gemaakt Opmerking toevoegen om uw persoonlijke beschrijving van het probleem te maken.
Gebruik in de antwoordeditor de dropdown onder de knoppen Verzenden en Annuleren om de doelgroep voor uw antwoord op te geven. Alleen de personen die u opgeeft, kunnen deze privéantwoorden en afbeeldingen, koppelingen of code zien die u hierin opneemt. Kies Zichtbaar door moderators en de oorspronkelijke poster om de zichtbaarheid van Microsoft-werknemers en uzelf te beperken.
Voeg de beschrijving en eventuele andere informatie, afbeeldingen en bestandsbijlagen toe die nodig zijn voor uw repro. Kies de knop Verzenden om deze gegevens privé te verzenden.
Er geldt een limiet van 2 GB voor bijgevoegde bestanden en maximaal 10 bestanden. Voor grotere uploads vraagt u een upload-URL aan in uw persoonlijke opmerking.
Antwoorden onder deze opmerking hebben dezelfde beperkte zichtbaarheid die u hebt opgegeven. Het is waar, zelfs als de dropdownlijst voor antwoorden de beperkte zichtbaarheid niet correct weergeeft.
Wees voorzichtig om uw privacy te behouden en uw gevoelige informatie buiten de openbare weergave te houden. Houd alle interactie met Microsoft bij antwoorden onder de beperkte opmerking. Antwoorden op andere opmerkingen kunnen ertoe leiden dat u per ongeluk gevoelige informatie openbaar maakt.
Een probleem met C++-documentatie melden
We gebruiken GitHub-problemen om problemen bij te houden die zijn gerapporteerd in onze documentatie. U kunt nu rechtstreeks gitHub-problemen maken vanaf een inhoudspagina, zodat u op een uitgebreidere manier kunt communiceren met schrijvers en productteams. Als u een probleem met een document, een slecht codevoorbeeld, een verwarrende uitleg, een kritieke weglating of zelfs een typefout ziet, kunt u ons eenvoudig laten weten. Schuif naar de onderkant van de pagina en selecteer Aanmelden om feedback over documentatie te geven. U moet een GitHub-account maken als u er nog geen hebt. Wanneer u een GitHub-account hebt, kunt u al onze documentatieproblemen en hun status bekijken. U ontvangt ook meldingen wanneer er wijzigingen worden aangebracht voor het probleem dat u hebt gerapporteerd. Zie ons blogbericht Feedback Systemvoor meer informatie.
U maakt een documentatieprobleem op GitHub wanneer u de knop Feedback over documentatie gebruikt. Het probleem wordt automatisch ingevuld met informatie over de pagina waarop u het probleem hebt gemaakt. Zo weten we waar het probleem zich bevindt, dus bewerk deze informatie niet. Voeg gewoon de details toe over wat er mis is en als u wilt, een voorgestelde oplossing. Onze C++-documenten zijn opensource-, dus als u zelf een oplossing wilt indienen, kunt u dat. Zie onze Gids voor bijdragen op GitHub voor meer informatie over hoe u kunt bijdragen aan onze documentatie.