Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Pokud v kompilátoru Microsoft C++ (MSVC), linkeru nebo jiných nástrojích a knihovnách zjistíte problémy, chceme o nich vědět. Pokud je problém v naší dokumentaci, chceme o tom také vědět.
Hlášení problému se sadou nástrojů C++
Nejlepší způsob, jak nám dát vědět o problému, je poslat nám zprávu, která obsahuje popis problému, který jste zjistili. Měl by obsahovat všechny podrobnosti o tom, jak svůj program sestavíte. A mělo by to zahrnovat repro, tedy kompletní testovací případ, který můžeme použít k reprodukci problému na našich vlastních počítačích. Tyto informace nám umožňují rychle ověřit, že problém v našem kódu existuje a že není místní pro vaše prostředí. Pomáhá nám určit, jestli ovlivňuje jiné verze kompilátoru, a diagnostikovat jeho příčinu.
V následujících částech si přečtěte, co dělá zprávu dobrou. Popisujeme, jak vytvořit reprodukci typu problému, který jste našli, a jak odeslat hlášení produktovému týmu. Vaše hlášení jsou důležitá pro nás i pro ostatní vývojáře, jako jste vy. Děkujeme, že nám pomáháte vylepšovat Microsoft C++!
Jak připravit svou zprávu
Je důležité vytvořit kvalitní hlášení, protože bez úplných informací je pro nás obtížné zopakovat problém, který jste našli. Čím lepší je vaše hlášení, tím efektivněji můžeme problém reprodukovat a diagnostikovat.
Zpráva by měla obsahovat alespoň:
Úplné informace o verzi sady nástrojů, kterou používáte.
Úplný cl.exe příkazový řádek použitý k sestavení kódu.
Podrobný popis problému, který jste našli.
Reprodukční příklad: úplný, zjednodušený a samostatný příklad zdrojového kódu, který demonstruje problém.
Přečtěte si další informace o konkrétních informacích, které potřebujeme, a o tom, kde je najdete, a o tom, jak vytvořit dobrou reprodukci.
Verze sady nástrojů
Potřebujeme úplné informace o verzi a cílovou architekturu sady nástrojů, která problém způsobuje. Je to proto, abychom mohli otestovat váš reprodukční případ se stejnou sadou nástrojů na našich počítačích. Pokud můžeme problém reprodukovat, tyto informace nám také poskytují výchozí bod, abychom zjistili, které jiné verze sady nástrojů mají stejný problém.
Hlášení úplné verze kompilátoru
Otevřete příkazový řádek pro vývojáře, který odpovídá architektuře konfigurace a verze sady Visual Studio použité k sestavení projektu. Pokud například sestavujete pomocí aplikace Visual Studio 2017 na platformě x64 pro cílovou architekturu x64, zvolte x64 Native Tools Command Prompt for VS 2017. Další informace najdete v tématu Klávesové zkratky příkazového řádku pro vývojáře.
V okně konzoly příkazového řádku pro vývojáře zadejte příkaz cl /Bv.
Výstup by měl vypadat nějak takto:
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
Zkopírujte a vložte celý výstup do zprávy.
Příkazový řádek
K sestavení kódu potřebujeme přesný příkazový řádek, cl.exe a všechny jeho argumenty. To je proto, abychom ho mohli sestavit úplně stejným způsobem na našich počítačích. Je důležité, protože nalezený problém může existovat pouze při sestavování s určitým argumentem nebo kombinací argumentů.
Nejlepší místo, kde tyto informace najít, je v protokolu sestavení hned po zjištění problému. Zajišťuje, že příkazový řádek obsahuje přesně stejné argumenty, které by mohly přispět k problému.
Vypsat obsah příkazové řádky
Vyhledejte soubor CL.command.1.tlog a otevřete ho. Ve výchozím nastavení se tento soubor nachází ve složce Dokumenty v cestě \Visual Studio version\Projects\SolutionName\ProjectName\Configuration\ProjectName.tlog\CL.command.1.tlog nebo v uživatelské složce v cestě \Source\Repos\SolutionName\ProjectName\Configuration\ProjectName.tlog\CL.command.1.tlog. Pokud používáte jiný systém sestavení nebo jste změnili výchozí umístění projektu, může být v jiném umístění.
V tomto souboru najděte názvy souborů zdrojového kódu následované argumenty příkazového řádku, které se používají k jejich kompilaci, a to na samostatných řádcích.
Vyhledejte řádek, který obsahuje název souboru zdrojového kódu, ve kterém k problému dochází. Řádek pod ním obsahuje odpovídající cl.exe argumenty příkazu.
Zkopírujte a vložte celý řádek příkazu do hlášení.
Popis problému
Potřebujeme podrobný popis zjištěného problému. To znamená, že můžeme ověřit, že na našich počítačích vidíme stejný účinek. Někdy je také užitečné vědět, co jste se snažili dosáhnout a co jste očekávali.
Dobrý popis uvádí přesné chybové zprávy, které nástrojová sada vypisuje, nebo přesné chování za běhu, které pozorujete. Tyto informace potřebujeme k ověření, že jsme problém správně reprodukovali. Zahrňte všechny výstupy kompilátoru, nejen poslední chybovou zprávu. Musíme vidět všechno, co vedlo k problému, který nahlásíte. Pokud můžete problém duplikovat pomocí kompilátoru příkazového řádku, je upřednostňovaný výstup kompilátoru. Integrované vývojové prostředí (IDE) a další systémy sestavení můžou filtrovat chybové zprávy, které vidíte, nebo zachytit pouze první řádek chybové zprávy.
Pokud problém spočívá v tom, že kompilátor přijímá neplatný kód a negeneruje diagnostiku, uveďte to ve svém hlášení.
Pokud chcete nahlásit problém s chováním za běhu, uveďte přesnou kopii toho, co program vytiskne a co očekáváte. V ideálním případě ho vložte do samotného výstupního příkazu, printf("This should be 5: %d\n", actual_result);například . Pokud se váš program chybově ukončí nebo přestane reagovat, uveďte to také.
Přidejte další podrobnosti, které nám můžou pomoct s diagnostikou zjištěného problému, například jakékoli zjištěné alternativní řešení. Snažte se neopakovat informace uvedené jinde ve zprávě.
Reprodukce
repro je úplný samostatný příklad zdrojového kódu. To spolehlivě reprodukuje problém, který jste našli, odtud ten název. Potřebujeme reprodukci, abychom mohli chybu reprodukovat na našich počítačích. Kód by měl být dostatečný sám pro vytvoření základního spustitelného souboru, který se zkompiluje a spustí. Nebo by se to zkompilovalo a spustilo, nebýt problému, který jste našli. Repro není ukázka kódu. Měl by mít kompletní funkce a třídy a obsahovat všechny nezbytné #include direktivy, i pro standardní hlavičky.
Co dělá dobrou repropro
Dobrá reproce je:
Minimální. Repros by měl být co nejmenší, ale přesto stále ukazuje přesně problém, který jste našli. Repros nemusí být složitý ani realistický. Potřebují jenom zobrazit kód, který odpovídá standardu, nebo k zdokumentované implementaci kompilátoru. Pokud chybí diagnostika, vaše repro by mělo obsahovat kód, který není v souladu. Nejlepší jsou jednoduché a stručné reprodukční příklady, které obsahují jen tolik kódu, kolik je potřeba k předvedení problému. Pokud můžete kód odstranit nebo zjednodušit a zůstat v souladu, a také ponechat problém beze změny, udělejte to. Nemusíte zadávat příklady kódu, který funguje.
Soběstačný. Opakování by se mělo vyhnout zbytečným závislostem. Pokud můžete problém reprodukovat bez knihoven třetích stran, udělejte to. Pokud můžete problém reprodukovat bez kódu knihovny kromě jednoduchých výstupních příkazů (například
puts("this shouldn't compile");,std::cout << value;aprintf("%d\n", value);), udělejte to. Je ideální, pokud je možné příklad zkondenzovat na jeden soubor zdrojového kódu bez odkazu na záhlaví uživatele. Snížení množství kódu, který musíme zvážit jako možný přispěvatel problému, je pro nás nesmírně užitečné.Proti nejnovější verzi kompilátoru. Funkce Repros by měla používat nejnovější aktualizaci na nejnovější verzi sady nástrojů, kdykoli je to možné. Nebo použijte nejnovější předběžnou verzi příští aktualizace nebo příští hlavní verze. Problémy, které můžete najít ve starších verzích sady nástrojů, jsou často opravené v novějších verzích. Opravy se přeportují do starších verzí pouze za výjimečných okolností.
V případě potřeby se kontrolují jiné kompilátory . Repros, který zahrnuje přenosný kód C++, by měl ověřit chování vůči jiným kompilátorům, pokud je to možné. Standard C++ nakonec určuje správnost programu a žádný kompilátor není dokonalý. Pokud však Clang a GCC přijímají váš kód bez diagnostiky a MSVC ne, pravděpodobně jste v našem kompilátoru našli chybu. (Další možnosti zahrnují rozdíly v chování systémů Unix a Windows nebo různé úrovně implementace standardů C++ atd.) Když všechny kompilátory váš kód zamítnou, je pravděpodobné, že váš kód není správný. Zobrazení různých chybových zpráv vám může pomoct s diagnostikou problému sami.
Seznamy online kompilátorů pro testování kódu v kompilátorech jazyka C++ Online najdete na webu ISO C++ nebo v tomto kurátorovaném seznamu kompilátorů jazyka C++ online na GitHubu. Mezi konkrétní příklady patří Wandbox a Compiler Explorer.
Poznámka:
Online weby kompilátoru nejsou přidruženy k Microsoftu. Mnoho webových stránek s online kompilátorem je provozováno jako osobní projekty. Některé z těchto webů můžou být při čtení nedostupné, ale hledání by mělo najít jiné, které můžete použít.
Problémy v kompilátoru, linkeru a knihovnách se obvykle zobrazují určitými způsoby. To, na jaký problém narazíte, určí, jaký postup reprodukce byste měli zahrnout do hlášení. Bez odpovídajícího postupu reprodukce problému nemáme co prošetřovat. Tady je několik druhů problémů, se kterými se můžete setkat. Uvádíme pokyny, jak vytvořit reprodukovatelný příklad, který byste měli použít při hlášení každého typu problému.
Chyba front-endu (analyzátoru)
K pádům frontendu dochází během fáze analýzy kompilátoru. Kompilátor obvykle generuje závažnou chybu C1001 a odkazuje na soubor zdrojového kódu a číslo řádku, ke kterému došlo k chybě. Často se zmíní soubor s názvem msc1.cpp, ale tento detail můžete ignorovat.
Pro tento typ pádu poskytněte předzpracované repro.
Tady je příklad výstupu kompilátoru pro tento druh chybového ukončení:
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
Chyba back-endu (generování kódu)
Ve fázi generování kódu kompilátoru dochází k pádům backendu. Kompilátor obvykle generuje závažnou chybu C1001 a nemusí odkazovat na soubor zdrojového kódu a číslo řádku přidružené k problému. Často se zmíní kompilátor souboru\utc\src\p2\main.c, ale tento detail můžete ignorovat.
Pro tento druh chybového ukončení poskytněte Link repro, pokud používáte generování kódu při linkování (LTCG) povolené argumentem příkazového řádku /GL pro cl.exe. Pokud ne, poskytněte místo toho předzpracovaný repro případ.
Tady je příklad výstupu kompilátoru pro chybové ukončení back-endu, ve kterém se LTCG nepoužívá. Pokud výstup kompilátoru vypadá následujícím způsobem, měli byste poskytnout předzpracovaný reprodukovatelný příklad.
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
Pokud řádek začínající chybou interního kompilátoru zmíní link.exe místo cl.exe, byla povolena funkce LTCG. V tomto případě uveďte repro odkaz. Pokud není jasné, jestli byla funkce LTCG povolena z chybové zprávy kompilátoru, prozkoumejte argumenty příkazového řádku. Zkopírovali jste je z protokolu sestavení, v předchozím kroku, pro argument příkazového řádku /GL.
Selhání linkeru
K pádům linkeru dochází během fáze linkování poté, co proběhne kompilace. Obvykle linker vygeneruje chybu nástrojů linkeru LNK1000.
Poznámka:
Pokud výstup obsahuje zmínku o C1001 nebo se týká Link-Time Code Generation, odkažte se místo toho na selhání backendu (generování kódu).
Pro tento druh selhání poskytněte odkaz na reprodukci.
Tady je příklad výstupu kompilátoru pro tento druh chybového ukončení:
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
Pokud je povolené přírůstkové propojení a k chybovému ukončení došlo až po úspěšném počátečním propojení, to znamená až po prvním úplném propojení, na kterém je založeno pozdější přírůstkové propojení, uveďte také kopii souborů objektu (.obj) a knihovny (.lib), které odpovídají zdrojovým souborům upraveným po dokončení počátečního propojení.
Chybné generování kódu
Generování chybného kódu je vzácné. Nastane, když kompilátor omylem vygeneruje nesprávný kód, který způsobí chybové ukončení aplikace za běhu. Místo toho by měl vygenerovat správný kód nebo zjistit problém v době kompilace. Pokud se domníváte, že vámi nalezený problém vede k chybnému generování kódu, nahlížejte na své hlášení stejně jako na pád back-endu (generování kódu).
V případě tohoto druhu selhání uveďte reprodukci pro linker, pokud pro cl.exe používáte argument příkazového řádku /GL. Pokud ne, zadejte předzpracované opakování.
Jak vytvořit reprodukční scénář
Abychom mohli vypátrat příčinu problému, je nezbytná spolehlivá reprodukce. Než provedete některý z níže uvedených kroků pro konkrétní druhy opakování, zkuste co nejvíce zkondenzovat kód, který ukazuje problém. Pokuste se eliminovat nebo minimalizovat závislosti, požadované hlavičky a knihovny. Pokud je to možné, omezte možnosti kompilátoru a definice preprocesoru.
Níže jsou uvedeny pokyny pro generování různých druhů opakování, které se použijí k hlášení různých druhů problémů.
Předzpracované opakování
Předzpracované repro je jediný zdrojový soubor, který demonstruje problém. Generuje se z výstupu preprocesoru jazyka C. Pokud ho chcete vytvořit, použijte možnost kompilátoru /P v původním zdrojovém souboru pro reprodukci. Tato možnost vloží obsah zahrnutých hlaviček přímo do souboru, čímž odstraní závislosti na jiných zdrojových souborech a souborech záhlaví. Tato možnost také řeší makra, #ifdef podmíněné příkazy a další příkazy preprocesoru, které by mohly záviset na místním prostředí.
Poznámka:
Předzpracované opakování nejsou tak užitečné pro problémy, které můžou být výsledkem chyb v naší standardní implementaci knihovny, protože často chceme nahradit nejnovější probíhající implementaci, abychom zjistili, jestli jsme problém již opravili. V takovém případě nezpracovávejte předzpracování a pokud nemůžete problém omezit na jeden zdrojový soubor, zabalte kód do souboru .zip nebo podobného souboru nebo zvažte použití reproprodukování projektu IDE. Další informace najdete v části Další reprodukční příklady.
Předběžné zpracování souboru zdrojového kódu
Zaznamenejte argumenty příkazového řádku použité k vytvoření reprodukce problému, jak je popsáno v části Jak nahlásit obsah příkazového řádku.
Otevřete příkazový řádek pro vývojáře, který odpovídá architektuře konfigurace a verze sady Visual Studio použité k sestavení projektu.
Přejděte do adresáře, který obsahuje váš projekt pro reprodukci.
V okně konzoly příkazového řádku pro vývojáře zadejte příkaz cl /Pargumentyfilename.cpp. Pro argumenty použijte seznam argumentů, které jste zachytili výše. filename.cpp je název zdrojového souboru pro reprodukci. Tento příkaz replikuje příkazový řádek, který jste použili pro reprodukci, ale zastaví kompilaci po předání preprocesoru. Potom zapíše předzpracovaný zdrojový kód na název souboru.i.
Pokud předzpracujete soubor zdrojového kódu C++/CX nebo používáte funkci modulů C++, je potřeba provést několik dalších kroků. Další informace najdete v následujících částech.
Po vygenerování předzpracovaného souboru je vhodné ověřit, že se problém při kompilaci tohoto předzpracovaného souboru stále reprodukuje.
Potvrdit, že předzpracovaný soubor stále reprodukuje chybu
V okně konzoly příkazového řádku pro vývojáře zadejte příkaz clarguments/TPfilename.i, aby nástroj cl.exe zkompiloval předzpracovaný soubor jako zdrojový soubor jazyka C++. Argumenty jsou stejné argumenty zachycené výše, ale s odebranými argumenty /D a /I . Je to proto, že už jsou součástí předzpracovaného souboru. filename.i je název vašeho předzpracovaného souboru.
Ověřte, že je problém reprodukován.
Nakonec ke svému hlášení připojte předzpracovaný repro soubor filename.i.
Předzpracované reprodukční příklady kódu C++/CX pro WinRT/UWP
Pokud k sestavení spustitelného souboru používáte C++/CX, je potřeba provést několik dalších kroků, aby bylo možné vytvořit a ověřit předzpracovaný reprodukční případ.
Předběžné zpracování zdrojového kódu C++/CX
Vytvořte předzpracovaný zdrojový soubor, jak je popsáno v části Předběžné zpracování souboru zdrojového kódu.
Vyhledejte v vygenerovaném souboru filename.i direktivy #using.
Vytvořte seznam všech odkazovaných souborů. Vynechejte všechny soubory Windows*.winmd, soubory platform.winmd a mscorlib.dll.
Příprava na ověření, že předzpracovaný soubor stále reprodukuje problém,
Vytvořte nový adresář pro předzpracovaný soubor a zkopírujte ho do nového adresáře.
Zkopírujte soubory .winmd ze seznamu #using do nového adresáře.
V novém adresáři vytvořte prázdný soubor vccorlib.h.
Upravte předzpracovaný soubor tak, aby se z něj odebraly všechny direktivy #using pro mscorlib.dll.
Upravte předzpracovaný soubor a nahraďte všechny absolutní cesty samotnými názvy souborů u zkopírovaných souborů .winmd.
Ověřte, že předzpracovaný soubor stále reprodukuje problém, jak je uvedeno výše.
Reprodukční případy předzpracovaných modulů C++
Pokud používáte funkci modulů v kompilátoru C++, je třeba provést několik odlišných kroků, abyste vytvořili a ověřili předzpracovaný repro případ.
Předběžné zpracování souboru zdrojového kódu, který používá modul
Zaznamenejte argumenty příkazového řádku použité k vytvoření reprodukčního scénáře, jak je popsáno v části Jak nahlásit obsah příkazového řádku.
Otevřete příkazový řádek pro vývojáře, který odpovídá architektuře konfigurace a verze sady Visual Studio použité k sestavení projektu.
Přejděte do adresáře, který obsahuje váš projekt pro reprodukci.
V okně konzoly příkazového řádku pro vývojáře zadejte příkaz cl /Pargumentyfilename.cpp. Argumenty jsou argumenty zachycené výše a filename.cpp je název zdrojového souboru, který modul využívá.
Přejděte do adresáře, který obsahuje ukázkový projekt, v němž se zkompilovalo rozhraní modulu (výstupní soubor .ifc).
Zachyťte argumenty příkazového řádku použité k sestavení rozhraní modulu.
V okně konzoly příkazového řádku vývojáře zadejte příkaz cl /Pargumentsmodulename.ixx. Argumenty jsou argumenty zachycené výše a modulename.ixx je název souboru, který vytvoří rozhraní modulu.
Po vygenerování předzpracovaných souborů je vhodné ověřit, zda lze problém při použití tohoto předzpracovaného souboru stále reprodukovat.
Potvrdit, že předzpracovaný soubor stále reprodukuje chybu
V okně konzoly pro vývojáře přejděte zpět do adresáře, který obsahuje váš projekt pro reprodukci.
Zadejte příkaz clarguments/TPfilename.i, jak je uvedeno výše, a zkompilujte předzpracovaný soubor, jako by se jednalo o zdrojový soubor jazyka C++.
Ověřte, že problém lze stále reprodukovat pomocí předzpracovaného souboru.
Nakonec ke svému hlášení připojte předzpracované reprodukční soubory (název_souboru.i a název_modulu.i) spolu s výstupem .ifc.
Generování trasovacího souboru modulu
Pokud problémy zahrnují moduly C++, poskytněte soubor trasování modulu spolu s předzpracovaným souborem reprodukce, což zlepší kvalitu diagnostiky a sníží dobu odezvy. Trasovací soubor modulu zaznamenává podrobné informace o operacích modulu během kompilace.
Je ideální, pokud je možné příklad zkondenzovat na jeden soubor zdrojového kódu bez odkazu na záhlaví uživatele.
Snížení množství kódu, který musíme zvážit jako možný přispěvatel problému, je pro nás nesmírně užitečné. Použití /MP nebo vyvolání s více zdroji může způsobit, že trasování představuje pouze poslední zkompilovaný soubor, nebo může být neúplné. Pokud nemůžete problém omezit na jeden zdrojový soubor, zabalte kód do souboru .zip nebo podobného archivu, nebo zvažte použití reprodukce projektu v IDE. Další informace najdete v části Další reprodukční příklady.
- Otevřete příkazový řádek pro vývojáře, který odpovídá architektuře konfigurace a verze sady Visual Studio použité k sestavení projektu.
- Zadejte příkaz
cl /d1module:enableLoggingtrace.json [other-args] filename.cpp. Pro trace.jsonzadejte požadovaný název výstupního souboru pro trasování modulu. Mezi výstupním souborem a názvem výstupního souboru nesmí být mezera/d1module:enableLogging. Pro [other-args] uveďte všechny dodatečné kompilační argumenty. Pro filename.cpp zadejte zdrojový soubor, který problém reprodukuje. - Pokud se problému týká více jednotek překladu, spusťte samostatné vyvolání s jedním souborem a shromážděte trasování pro konkrétní soubor, který problém reprodukuje. V případě potřeby můžete shromažďovat záznamy dalších relevantních souborů.
Nakonec k sestavě připojte vygenerovaný soubortrace.json spolu s předzpracovaným opakováním.
Přepouštěné odkazy
Link repro je obsah adresáře vygenerovaný linkerem, zadaný buď proměnnou prostředí link_repro, nebo jako argument přepínače linkeru /LINKREPRO. Obsahuje artefakty sestavení, které souhrnně ukazují problém, ke kterému dochází v době propojení. Mezi příklady patří selhání backendu s využitím technologie Link-Time Code Generation (LTCG) nebo selhání linkeru. Tyto artefakty sestavení jsou potřeba jako vstup pro linker, aby bylo možné problém reprodukovat. Pomocí této proměnné prostředí lze snadno vytvořit reprodukční odkaz. Umožňuje vestavěnou funkci linkeru pro generování repro balíčku.
Generování opakování odkazu pomocí proměnné prostředí link_repro
Zaznamenejte argumenty příkazového řádku použité při vytváření reprodukce problému, jak je popsáno v části Jak nahlásit obsah příkazového řádku.
Otevřete příkazový řádek pro vývojáře, který odpovídá architektuře konfigurace a verze sady Visual Studio použité k sestavení projektu.
V okně konzoly příkazového řádku pro vývojáře přejděte do adresáře, který obsahuje váš projekt pro reprodukci.
Zadáním příkazu mkdir linkrepro vytvořte adresář s názvem linkrepro pro repro . K zachycení dalšího opakování odkazu můžete použít jiný název.
Zadáním sady příkazů link_repro=linkrepro nastavte proměnnou prostředí link_repro na adresář, který jste vytvořili. Pokud je sestavení spuštěno z jiného adresáře, což je u složitějších projektů často běžné, nastavte místo toho link_repro na úplnou cestu k adresáři link repro.
Pokud chcete vytvořit projekt pro reprodukci v sadě Visual Studio, zadejte v okně konzoly příkazového řádku vývojáře příkaz devenv. Zajišťuje, aby hodnota proměnné prostředí link_repro byla viditelná pro Visual Studio. K sestavení projektu na příkazovém řádku použijte argumenty příkazového řádku, které jsou zachyceny výše, a duplikujte sestavení pro reprodukci.
Sestavte projekt pro reprodukci a ověřte, že došlo k očekávanému problému.
Zavřete Visual Studio, pokud jste ho použili k sestavení.
V okně konzoly příkazového řádku vývojáře zadejte sadu příkazů link_repro= a vymažte link_repro proměnnou prostředí.
Nakonec zabalte repro komprimací celého adresáře linkrepro do souboru .zip nebo podobného archivu a připojte ho ke svému hlášení.
Možnost linkeru /LINKREPRO má stejný účinek jako proměnná prostředí link_repro. Můžete použít možnost /LINKREPROTARGET k zadání názvu, podle kterého se má filtrovat vygenerovaný reprodukční soubor odkazu. Chcete-li použít /LINKREPROTARGET, musíte také zadat volbu linkeru /OUT.
Generování opakování odkazu pomocí možnosti /LINKREPRO
Vytvořte adresář pro uložení reproproce odkazu. Úplnou cestu k adresáři, kterou vytvoříte, budeme označovat jako directory-path. Použijte kolem cesty dvojité uvozovky, pokud obsahuje mezery.
Do příkazového řádku linkeru přidejte příkaz /LINKREPRO:directory-path . Ve Visual Studiu otevřete dialogové okno Stránky vlastností vašeho projektu. Vyberte stránku vlastností Vlastnosti konfigurace>Linker>Příkazový řádek. Potom do pole Další možnosti zadejte možnost /LINKREPRO:directory-path. Kliknutím na OK uložte provedené změny.
Sestavte projekt pro reprodukci a ověřte, že došlo k očekávanému problému.
Nakonec zabalte repro tak, že celý adresář link repro v umístění directory-path zkomprimujete do souboru .zip nebo podobného archivu a přiložíte jej ke svému hlášení.
Další reprodukce
Pokud nemůžete problém omezit na jeden zdrojový soubor nebo předzpracované opakování a problém nevyžaduje reproprodukování odkazu, můžeme prozkoumat projekt integrovaného vývojového prostředí (IDE). Všechny pokyny, jak vytvořit dobrou reprodukci, stále platí: kód by měl být minimální a soběstačný. Problém by se měl vyskytovat v našich nejnovějších nástrojích a, je-li to relevantní, neměl by se objevovat v jiných kompilátorech.
Vytvořte reprodukční příklad jako minimální projekt v IDE, pak jej zabalte tak, že celou strukturu adresářů zkomprimujete do souboru .zip nebo podobného archivu, a přiložte jej k hlášení.
Způsoby odeslání vaší sestavy
Máte několik dobrých způsobů, jak nám doručit svou zprávu. Můžete použít integrovaný nástroj pro hlášení problémů sady Visual Studio nebo stránku komunity vývojářů sady Visual Studio. V dolní části této stránky je také tlačítko Pro odeslání názoru na produkt. Záleží na tom, jestli chcete pomocí integrovaných nástrojů v IDE pořizovat snímky obrazovky a uspořádat svou zprávu. Pokud nechcete, můžete přímo použít web komunity vývojářů.
Poznámka:
Ať už své hlášení odešlete jakkoli, Microsoft respektuje vaše soukromí. Společnost Microsoft se zavazuje dodržovat všechny zákony a předpisy týkající se ochrany osobních údajů. Informace o tom, jak zacházíme s daty, která nám pošlete, najdete v prohlášení společnosti Microsoft o zásadách ochrany osobních údajů.
Použití nástroje Nahlásit problém
Nástroj Nahlásit problém v sadě Visual Studio je způsob, jak uživatelé sady Visual Studio hlásit problémy několika kliknutími. Zobrazí se jednoduchý formulář pro odeslání podrobných informací o zjištěném problému. Sestavu pak můžete odeslat bez opuštění integrovaného vývojového prostředí (IDE).
Hlášení problému pomocí nástroje Nahlásit problém je snadné a pohodlné z integrovaného vývojového prostředí (IDE). Přístup k němu můžete získat z záhlaví tak, že vyberete ikonu Odeslat názor vedle vyhledávacího pole Snadné spuštění . Nebo ji najdete na panelu nabídek v Nápověda>Odeslat zpětnou vazbu>Nahlásit problém.
Když se rozhodnete nahlásit problém, nejprve vyhledejte podobné problémy v komunitě vývojářů. Pokud již byl váš problém nahlášen, podpořte hlášení hlasem a přidejte komentáře s podrobnějšími informacemi. Pokud podobný problém nevidíte, zvolte tlačítko Nahlásit nový problém v dolní části dialogového okna Zpětná vazba sady Visual Studio a postupujte podle pokynů a problém nahlaste.
Použití stránek komunity vývojářů sady Visual Studio
Stránky komunity vývojářů sady Visual Studio jsou dalším pohodlným způsobem, jak hlásit problémy a najít řešení pro Visual Studio a kompilátor, nástroje a knihovny jazyka C++. Existují konkrétní stránky komunity vývojářů pro Visual Studio, Visual Studio pro Mac, .NET, C++, Azure DevOps a Azure DevOps Server.
Pod kartami komunity v horní části každé stránky je vyhledávací pole. Můžete ho použít k vyhledání příspěvků, které hlásí problémy podobné vašemu. Možná najdete řešení nebo jiné užitečné informace související s vaším problémem už jsou k dispozici. Pokud někdo stejný problém nahlásil už dříve, dejte tomuto hlášení hlas a přidejte k němu komentář, místo abyste vytvářeli nové hlášení problému. Pokud chcete komentovat, hlasovat nebo nahlásit nový problém, můžete být požádáni, abyste se přihlásili ke svému účtu sady Visual Studio. Při prvním přihlášení musíte souhlasit s tím, že aplikaci komunity vývojářů udělíte přístup k vašemu profilu.
V případě problémů s kompilátorem, linkerem a dalšími nástroji a knihovnami jazyka C++ nejprve vyhledejte stránku komunity vývojářů jazyka C++. Pokud hledáte problém a ještě není hlášený, zvolte tlačítko Nahlásit problém vedle vyhledávacího pole. Můžete zahrnout kód pro reprodukci a příkazový řádek, snímky obrazovky, odkazy na související diskuze a všechny další informace, které si myslíte, že jsou relevantní a užitečné.
Návod
Informace v počáteční zprávě komunity vývojářů budou vždy veřejné. Pokud vás to znepokojuje, podívejte se na následující část o Reportech a ochraně osobních údajů.
Návod
V případě jiných typů problémů, které se můžou v sadě Visual Studio vyskytovat nesouvisející s nástroji sestavení Microsoft C++ (například problémy s uživatelským rozhraním, nefunkční funkce integrovaného vývojového prostředí nebo obecné chybové ukončení), použijte nástroj Nahlásit problém v integrovaném vývojovém prostředí (IDE). Je to nejlepší volba, protože umožňuje pořizovat snímky obrazovky a zaznamenávat akce uživatelského rozhraní, které vedly k problému, na který jste narazili. Tyto druhy chyb se také dají vyhledat na webu komunity vývojářů sady Visual Studio. Další informace naleznete v tématu Jak nahlásit problém se sadou Visual Studio.
Reporty a soukromí
Veškeré informace v reportech a veškeré komentáře a odpovědi jsou ve výchozím nastavení veřejně viditelné. Za normálních okolností je to výhoda, protože umožňuje celé komunitě zobrazit problémy, řešení a alternativní řešení, která našli jiní uživatelé. Pokud se ale obáváte, že se vaše data nebo identita zpřístupní z důvodů ochrany osobních údajů nebo duševního vlastnictví, máte k dispozici možnosti.
Pokud vás zajímá odhalení vaší identity, vytvořte si nový účet Microsoft, který o vás nezveřejňuje žádné podrobnosti. Pomocí tohoto účtu vytvořte svou zprávu.
Do názvu ani obsahu počátečního hlášení neuvádějte nic, co si přejete zachovat jako soukromé, protože jsou veřejné. Místo toho řekněme, že podrobnosti pošlete soukromě v samostatném komentáři. Abyste měli jistotu, že se vaše hlášení dostane ke správným lidem, uveďte v seznamu témat svého hlášení problému cppcompiler. Po vytvoření sestavy problémů je teď možné určit, kdo uvidí vaše odpovědi a přílohy.
Vytvořit hlášení o problému týkajícím se soukromých údajů
V sestavě, kterou jste vytvořili, zvolte Přidat komentář a vytvořte svůj soukromý popis problému.
V editoru odpovědí použijte ovládací prvek rozevíracího seznamu pod tlačítky Odeslat a Zrušit a určete cílovou skupinu pro vaši odpověď. Tyto soukromé odpovědi a všechny obrázky, odkazy nebo kód, které do nich zahrnete, uvidí jenom vámi zadané osoby. Zvolte možnost Viditelné pro moderátory a původního autora příspěvku, aby byl obsah viditelný jen zaměstnancům Microsoftu a vám.
Přidejte popis a všechny další informace, obrázky a přílohy souborů potřebné pro vaše opakování. Pokud chcete tyto informace odeslat soukromě, zvolte tlačítko Odeslat.
U připojených souborů platí limit 2 GB a maximálně 10 souborů. U všech větších souborů požádejte v soukromém komentáři o adresu URL pro nahrání.
Všechny odpovědi pod tímto komentářem mají stejnou omezenou viditelnost, jakou jste zadali. Platí to i v případě, že ovládací prvek rozevíracího seznamu u odpovědí nezobrazuje správně stav omezené viditelnosti.
Pokud chcete zachovat ochranu osobních údajů a zachovat citlivé informace mimo veřejné zobrazení, buďte opatrní. Veškerou komunikaci s Microsoftem omezte na odpovědi pod omezeným komentářem. Odpovědi na jiné komentáře můžou způsobit náhodné zveřejnění citlivých informací.
Nahlášení problému s dokumentací jazyka C++
Pokud se zobrazí problém s dokumentem, chybným vzorovým kódem, matoucím vysvětlením, kritickým vynecháním nebo dokonce jen překlepem, můžete nám snadno dát vědět pomocí tlačítek pro zpětnou vazbu na stránce. Od roku 2024 už nepoužíváme problémy GitHubu ke sledování nahlášených problémů. Další informace najdete v tématu Oznámení nového způsobu, jak poskytnout zpětnou vazbu k Microsoft Learn.
Naše dokumenty c++ jsou opensourcové, takže pokud chcete odeslat opravu sami, můžete. Další informace o tom, jak můžete přispívat do naší dokumentace, najdete v naší příručce pro přispívání na GitHubu.