Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Se riscontri problemi nel compilatore Microsoft C++ (MSVC), nel linker o in altri strumenti e librerie, vogliamo saperlo. Quando il problema riguarda la nostra documentazione, vogliamo saperlo anche noi.
Come segnalare un problema con il set di strumenti C++
Il modo migliore per segnalare un problema consiste nell'inviare un report che include una descrizione del problema individuato. Il report dovrebbe includere tutti i dettagli del modo in cui è stato compilato il programma, E dovrebbe includere una procedura di riproduzione, ovvero un caso di test completo che possiamo usare per riprodurre il problema sui nostri computer. Queste informazioni ci consentono di verificare rapidamente che il problema esiste nel nostro codice e non è specifico del tuo ambiente. nonché di determinare se influisce su altre versioni del compilatore e di diagnosticarne la causa.
Nelle sezioni seguenti vengono fornite informazioni su ciò che rende un buon report. Descriviamo come creare una procedura per riprodurre il tipo di problema riscontrato e come inviare la segnalazione al team di prodotto. Le tue segnalazioni sono importanti per noi e per altri sviluppatori come te. Grazie per contribuire a migliorare Microsoft C++.
Come preparare il report
È importante creare un report di alta qualità, perché è difficile per Microsoft riprodurre il problema riscontrato senza informazioni complete. Quanto più accurata è la segnalazione, tanto più efficacemente possiamo ricreare e diagnosticare il problema.
Il report deve contenere almeno le informazioni seguenti:
Informazioni complete sulla versione del set di strumenti usata.
L'intera riga di comando cl.exe usata per compilare il codice.
Una descrizione dettagliata del problema riscontrato.
Un caso di riproduzione: un esempio completo, semplificato e autonomo di codice sorgente che dimostra il problema.
Continuare a leggere per sapere dove trovare le informazioni specifiche necessarie e come creare una procedura di riproduzione del problema esaustiva.
Versione del set di strumenti
Sono necessarie informazioni complete sulla versione e sull'architettura di destinazione del set di strumenti che causa il problema. Così possiamo testare il tuo scenario di riproduzione usando gli stessi strumenti sui nostri computer. Se il problema può essere riprodotto, queste informazioni rappresentano anche un punto di partenza per capire quali altre versioni del set di strumenti hanno lo stesso problema.
Per segnalare la versione completa del compilatore
Aprire il prompt dei comandi per gli sviluppatori corrispondente alla versione di Visual Studio e all'architettura di configurazione usata per compilare il progetto. Ad esempio, se si compila con Visual Studio 2017 su x64 per destinazioni x64, scegliere x64 Native Tools Command Prompt for VS 2017. Per altre informazioni, vedi Scelte rapide del prompt dei comandi per sviluppatori.
Nella finestra della console del prompt dei comandi per gli sviluppatori immettere il comando cl /Bv.
L'output sarà simile al seguente:
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
Copiare e incollare l'intero output nel report.
riga di comando
È necessaria la riga di comando esatta di cl.exe con tutti i relativi argomenti, usata per compilare il codice. Questo serve per poterlo compilare esattamente nello stesso modo sui nostri computer. È importante perché il problema riscontrato potrebbe verificarsi solo in fase di compilazione con un determinato argomento o una combinazione di argomenti.
Il posto migliore in cui trovare queste informazioni è nel log di compilazione immediatamente dopo aver riscontrato il problema. La riga di comando conterrà esattamente gli stessi argomenti che potrebbero essere la causa del problema.
Per segnalare i contenuti della riga di comando
Individuare il file CL.command.1.tlog e aprirlo. Per impostazione predefinita, il file si trova nella cartella Documenti in \Visual Studio version\Projects\SolutionName\ProjectName\Configuration\ProjectName.tlog\CL.command.1.tlog oppure nella cartella utente in \Source\Repos\SolutionName\ProjectName\Configuration\ProjectName.tlog\CL.command.1.tlog. Può trovarsi in un percorso diverso se si usa un altro sistema di compilazione o se è stata modificata la posizione predefinita per il progetto.
All'interno di questo file trovare i nomi dei file di codice sorgente, seguiti dagli argomenti della riga di comando usati per compilarli, ognuno in righe separate.
Individuare la riga che contiene il nome del file del codice sorgente in cui si verifica il problema. La riga sottostante contiene gli argomenti del comando cl.exe corrispondenti.
Copiare e incollare l'intera riga di comando nel report.
Descrizione del problema
È necessaria una descrizione dettagliata del problema riscontrato. Questo ci permette di verificare che sulle nostre macchine si verifichi lo stesso effetto. A volte può esserci utile anche sapere cosa stavi cercando di fare e cosa ti aspettavi che accadesse.
Una buona descrizione include i messaggi di errore esatti generati dal set di strumenti o l'esatto comportamento del runtime. Abbiamo bisogno di queste informazioni per verificare di aver riprodotto correttamente il problema. Includi tutto l'output del compilatore, non solo l'ultimo messaggio di errore. È necessario avere a disposizione tutti gli elementi che hanno causato il problema segnalato. Se è possibile duplicare il problema usando il compilatore della riga di comando, è preferibile l'output del compilatore. L'IDE e altri sistemi di compilazione potrebbero filtrare i messaggi di errore visualizzati o acquisire solo la prima riga di un messaggio di errore.
Se il problema consiste nel fatto che il compilatore accetta codice non valido e non genera dati di diagnostica, includerlo nel report.
Per segnalare un problema di comportamento del runtime, includi una copia esatta di ciò che il programma stampa e di ciò che ti aspetti di vedere. Idealmente, incorporarlo nell'istruzione di output stessa, printf("This should be 5: %d\n", actual_result);ad esempio . Segnalare anche se il programma si arresta in modo anomalo o si blocca.
Aggiungi qualsiasi altro dettaglio che possa aiutarci a diagnosticare il problema riscontrato, ad esempio eventuali soluzioni temporanee che hai individuato. Cercare di non ripetere le informazioni già presenti altrove nel report.
La riproduzione
Un repro è un esempio completo e autosufficiente di codice sorgente. Viene illustrato in modo riproducibile il problema riscontrato, quindi il nome. Abbiamo bisogno di una procedura per riprodurre il problema, in modo da poter riprodurre l'errore sulle nostre macchine. Il codice dovrebbe essere sufficiente da solo per creare un file eseguibile di base che viene compilato ed eseguito. Oppure, quello si compilerebbe e verrebbe eseguito, se non fosse per il problema che hai trovato. Una procedura di riproduzione non è un frammento di codice. Deve contenere funzioni e classi complete e tutte le direttive #include necessarie, anche per le intestazioni standard.
Cosa rende valida una buona procedura per riprodurre il problema?
Una procedura di riproduzione esaustiva è:
Minima. I passaggi per riprodurre il problema devono essere il più concisi possibile, pur mostrando esattamente il problema che hai riscontrato. Le procedure di riproduzione non devono essere né complesse né realistiche. È sufficiente che dimostrino codice conforme allo standard o all'implementazione del compilatore documentata. In caso di diagnosi mancante, lo scenario di riproduzione deve mostrare il codice che non è conforme. Sono preferibili procedure di riproduzione semplici e pertinenti, che contengono solo il codice sufficiente a illustrare il problema. Se possibile, eliminare o semplificare il codice rimanendo conformi e lasciando inalterato il problema. Non è necessario includere controesempi di codice funzionante.
Autonomo. È consigliabile non includere nelle procedure di riproduzione dipendenze non necessarie. Se riesci a riprodurre il problema senza librerie di terze parti, fallo. Se si riesce a riprodurre il problema senza alcun codice di libreria oltre a semplici istruzioni di output (per esempio,
puts("this shouldn't compile");,std::cout << value;eprintf("%d\n", value);), allora farlo. È preferibile ridurre l'esempio a un singolo file di codice sorgente senza riferimento a intestazioni utente. È molto utile ridurre la quantità di codice da analizzare come possibile responsabile del problema.Rispetto all'ultima versione del compilatore Le procedure di riproduzione devono usare l'aggiornamento più recente dell'ultima versione del set di strumenti quando possibile. In alternativa, usare la versione provvisoria più recente dell'aggiornamento successivo o della versione principale successiva. I problemi che possono verificarsi nelle versioni precedenti del set di strumenti sono spesso risolti nelle versioni più recenti. Il backporting delle correzioni in versioni precedenti avviene solo in casi eccezionali.
Confronto con altri compilatori, se pertinente. I casi di riproduzione che coinvolgono codice C++ portabile dovrebbero verificarne il comportamento con altri compilatori, se possibile. Lo standard C++ stabilisce in definitiva la correttezza del programma e nessun compilatore è perfetto. Tuttavia, quando Clang e GCC accettano il vostro codice senza segnalare alcun errore e MSVC no, probabilmente avete trovato un bug nel nostro compilatore. Altre possibilità includono differenze nel comportamento di Unix e Windows o livelli diversi di implementazione degli standard C++ e così via. Quando tutti i compilatori rifiutano il codice, è probabile che il codice non sia corretto. Analizzare messaggi di errore diversi può aiutare l'utente a diagnosticare il problema.
Puoi trovare elenchi di compilatori C++ online con cui testare il tuo codice in Online C++ compilers sul sito web di ISO C++, oppure in questa raccolta curata List of Online C++ Compilers su GitHub. Alcuni esempi specifici includono Wandbox e Compiler Explorer.
Nota
I siti Web dei compilatori online non sono associati a Microsoft. Molti siti Web dei compilatori online vengono eseguiti come progetti personali. Alcuni di questi siti potrebbero non essere disponibili quando si legge questo articolo, ma con una ricerca dovrebbe essere semplice trovarne altri.
I problemi che riguardano compilatore, linker e librerie sono soliti manifestarsi in modi particolari. Il tipo di problema riscontrato determinerà quale tipo di procedura di riproduzione includere nel report. Senza una procedura di riproduzione adeguata, non abbiamo nulla da analizzare. Ecco alcuni dei tipi di problemi che si potrebbero riscontrare. Sono incluse istruzioni su come generare il tipo di procedura di riproduzione che è consigliabile usare per segnalare ogni tipo di problema.
Arresto anomalo del frontend (parser)
Gli arresti anomali del front-end si verificano durante la fase di analisi del compilatore. In genere, il compilatore genera l'errore irreversibile C1001 con riferimenti al file del codice sorgente e al numero di riga in cui si è verificato l'errore. Spesso viene menzionato un file denominato msc1.cpp, ma è possibile ignorare questo dettaglio.
Per questo tipo di crash, fornire un caso di riproduzione pre-elaborato.
Di seguito è riportato un esempio di output del compilatore per questo tipo di arresto anomalo:
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
Arresto anomalo del backend (generazione del codice)
Gli arresti anomali del back-end si verificano durante la fase di generazione del codice del compilatore. In genere, il compilatore genera l'errore irreversibile C1001 e potrebbe non includere riferimenti al file del codice sorgente e al numero di riga associati al problema. Spesso viene menzionato il compilatore di file\utc\src\p2\main.c, ma è possibile ignorare questo dettaglio.
Per questo tipo di arresto anomalo, fornire una riproduzione del problema di collegamento se si usa la Generazione di codice in fase di collegamento (LTCG), abilitata dall'opzione della riga di comando /GL di cl.exe. Altrimenti, fornisci una procedura di riproduzione preelaborata.
Ecco un esempio di output del compilatore per un arresto anomalo del backend in cui non viene usata la generazione di codice in fase di collegamento (LTCG). Se l'output del compilatore è simile al seguente, è opportuno fornire una riproduzione preelaborata.
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
Se la riga che inizia con INTERNAL COMPILER ERROR fa riferimento a link.exe anziché a cl.exe, significa che la generazione di codice in fase di collegamento era stata abilitata. Fornire un link per la riproduzione in questo caso. Quando non è chiaro dal messaggio di errore del compilatore se LTCG è stato abilitato, controllare gli argomenti nella riga di comando. Li hai copiati dal log di compilazione, in un passaggio precedente, per l'argomento della riga di comando /GL.
Arresto anomalo del linker
Gli arresti anomali del linker si verificano durante la fase di collegamento, dopo l'esecuzione del compilatore. In genere, il linker restituisce Errore degli strumenti del linker LNK1000.
Nota
Se l'output menziona C1001 o riguarda la Generazione del codice in fase di collegamento, fare riferimento a Arresto anomalo del back-end (generazione del codice) invece.
Per questo tipo di arresto anomalo, inviare una procedura di riproduzione del collegamento.
Di seguito è riportato un esempio di output del compilatore per questo tipo di arresto anomalo:
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
Se è abilitato il collegamento incrementale e l'arresto anomalo si è verificato solo dopo il collegamento iniziale, vale a dire solo dopo il primo collegamento completo su cui si basa il collegamento incrementale successivo, inviare anche una copia dei file oggetto (con estensione obj) e libreria (con estensione lib) che corrispondono ai file sorgente che sono stati modificati dopo il completamento del collegamento iniziale.
Generazione di codice errato
La generazione di codice errato è rara. Si verifica quando il compilatore genera erroneamente codice non corretto che causa l'arresto anomalo in fase di esecuzione dell'applicazione. Dovrebbe invece generare codice corretto o rilevare un problema in fase di compilazione. Se si ritiene che il problema riscontrato restituisca una generazione di codice non valida, considerare il report uguale a un arresto anomalo del back-end (generazione di codice).
Per questo tipo di arresto anomalo, fornire una riproduzione del problema di collegamento se si utilizza l'opzione della riga di comando /GL con cl.exe. Altrimenti, fornire una repro pre-elaborata.
Come generare una riproduzione
Per aiutarci a individuare l’origine del problema, è fondamentale una buona procedura di riproduzione. Prima di eseguire i passaggi descritti di seguito per tipi specifici di riproduzione, ridurre il più possibile il codice che illustra il problema. Cercare di eliminare o ridurre al minimo le dipendenze, i file di intestazione necessari e le librerie. Limitare le opzioni del compilatore e le definizioni del preprocessore usate, se possibile.
Di seguito sono riportate le istruzioni per generare i vari tipi di repository da usare per segnalare diversi tipi di problemi.
Casi di riproduzione preelaborati
Una procedura di riproduzione pre-elaborata è un singolo file di origine che dimostra un problema. Viene generata dall'output del preprocessore C. Per crearne uno, usare l'opzione del compilatore /P sul file sorgente repro originale. Questa opzione incorpora i file di intestazione inclusi per rimuovere le dipendenze da altri file di origine e di intestazione. L'opzione risolve anche le macro, le istruzioni condizionali #ifdef e altri comandi del preprocessore che potrebbero dipendere dall'ambiente locale.
Nota
I repro preelaborati non sono altrettanto utili per i problemi che potrebbero essere dovuti a bug nell'implementazione della nostra libreria standard, perché spesso vorremo sostituirla con la nostra implementazione più recente, ancora in corso di sviluppo, per verificare se abbiamo già risolto il problema. In questo caso non pre-elaborare la procedure di riproduzione. Se non è possibile ridurre il problema a un solo file di origine, comprimere il codice in un file ZIP, o simile, oppure usare una procedura di riproduzione del progetto IDE. Per altre informazioni, vedi Altre riproduzioni.
Per pre-elaborare un file del codice sorgente
Acquisisci gli argomenti della riga di comando usati per creare la tua riproduzione del problema, come descritto in Per segnalare il contenuto della riga di comando.
Aprire il prompt dei comandi per gli sviluppatori corrispondente alla versione di Visual Studio e all'architettura di configurazione usata per compilare il progetto.
Passare alla directory che contiene il progetto di riproduzione.
Nella finestra della console del prompt dei comandi per sviluppatori, immettere il comando cl /Pargumentsfilename.cpp. Per argomenti usare l'elenco degli argomenti acquisiti in precedenza. filename.cpp è il nome del file sorgente per la riproduzione. Questo comando consente di replicare la riga di comando usata per la riproduzione, ma arresta la compilazione dopo il passaggio del preprocessore, quindi scrive il codice sorgente pre-elaborato in nomefile.i.
Se si sta pre-elaborando un file di codice sorgente C++/CX o si usa la funzionalità Moduli C++, sono necessari altri passaggi. Per altre informazioni, vedere le sezioni riportate di seguito.
Dopo aver generato il file preprocessato, è consigliabile verificare che il problema si ripresenti ancora quando si compila il file preprocessato.
Per verificare che il file preelaborato riproduca ancora l'errore
Nella finestra della console del prompt dei comandi per gli sviluppatori immettere il comando cl arguments /TPfilename.i per indicare cl.exe di compilare il file pre-elaborato come file di origine C++. Gli argomenti sono gli stessi argomenti acquisiti in precedenza, ma con eventuali argomenti /D e /I rimossi, perché sono già stati inclusi nel file pre-elaborato. filename.i è il nome del file preelaborato.
Confermare che il problema si ripresenti.
Infine, allega al report il file di riproduzione preelaborato filename.i
Casi di riproduzione di codice C++/CX WinRT/UWP preprocessato
Se si utilizza C++/CX per creare il file eseguibile, sono necessari alcuni passaggi aggiuntivi per creare e convalidare un repro preprocessato.
Preelaborare il codice sorgente C++/CX
Creare un file del codice sorgente pre-elaborato come descritto in Per pre-elaborare un file del codice sorgente.
Cercare nel file filename.i generato le direttive #using.
Creare un elenco di tutti i file di riferimento. Lasciare tutti i file Windows*.winmd, platform.winmd e mscorlib.dll.
Per prepararsi a verificare che il file preelaborato riproduca ancora il problema,
Creare una nuova directory per il file pre-elaborato e copiarlo nella nuova directory.
Copiare i file .winmd dall'elenco #using nella nuova directory.
Creare un file vccorlib.h vuoto nella nuova directory.
Modificare il file pre-elaborato per rimuovere qualsiasi direttiva #using per mscorlib.dll.
Modifica il file preelaborato in modo da cambiare tutti i percorsi assoluti nei soli nomi file per i file .winmd copiati.
Confermare che il file preelaborato riproduca ancora il problema, come sopra.
Casi di riproduzione dei moduli C++ preprocessati
Se si usa la funzionalità di moduli del compilatore C++, sono necessari alcuni passaggi diversi per creare e convalidare una procedura di riproduzione pre-elaborata.
Per pre-elaborare un file del codice sorgente che usa un modulo
Acquisire gli argomenti della riga di comando usati per compilare la procedura di riproduzione, come descritto in Per segnalare i contenuti della riga di comando.
Aprire il prompt dei comandi per gli sviluppatori corrispondente alla versione di Visual Studio e all'architettura di configurazione usata per compilare il progetto.
Passa alla directory che contiene il progetto di riproduzione.
Nella finestra della console del prompt dei comandi per sviluppatori, immettere il comando cl /Pargumentsfilename.cpp. Gli argomenti sono gli argomenti acquisiti in precedenza e nomefile.cpp è il nome del file di origine che utilizza questo modulo.
Passare alla directory contenente il progetto di riproduzione con cui è stata compilata l'interfaccia del modulo (output con estensione ifc).
Acquisisci gli argomenti della riga di comando usati per generare l'interfaccia del tuo modulo.
Nella finestra della console del prompt dei comandi per sviluppatori, immetti il comando cl /Pargumentsmodulename.ixx. Gli argomenti sono gli argomenti acquisiti in precedenza e nomemodulo.ixx è il nome del file che crea l'interfaccia del modulo.
Dopo aver generato i file preprocessati, è consigliabile assicurarsi che il problema si ripresenti ancora quando si utilizza il file preprocessato.
Per verificare che il file preprocessato riproduca ancora l'errore
Nella finestra della console sviluppatore, tornare alla directory che contiene il progetto di riproduzione.
Immettere il comando clarguments/TPfilename.i come sopra, per compilare il file pre-elaborato come se fosse un file di origine C++.
Confermare che il problema sia ancora riproducibile dal file pre-elaborato.
Infine, allega al rapporto i file repro preelaborati (nomefile.i e nomemodulo.i) insieme all'output .ifc.
Per generare un file di traccia del modulo
Quando i problemi coinvolgono i moduli C++, fornire un file di traccia del modulo insieme alla riproduzione pre-elaborata migliora la qualità diagnostica per ridurre i tempi di turnaround. Un file di traccia del modulo registra informazioni dettagliate sulle operazioni del modulo durante la compilazione.
È preferibile ridurre l'esempio a un singolo file di codice sorgente senza riferimento a intestazioni utente.
È molto utile ridurre la quantità di codice da analizzare come possibile responsabile del problema. L'uso di /MP o invocazioni multi-sorgente può far sì che la traccia rappresenti solo l'ultimo file compilato o risulti incompleta. Se non è possibile ridurre il problema a un singolo file di origine, creare un pacchetto del codice in un file di .zip o simile oppure valutare l'uso di una procedura di riproduzione di un progetto IDE. Per altre informazioni, vedi Altri casi di riproduzione.
- Aprire il prompt dei comandi per gli sviluppatori corrispondente alla versione di Visual Studio e all'architettura di configurazione usata per compilare il progetto.
- Immettere il comando
cl /d1module:enableLoggingtrace.json [other-args] filename.cpp. Per trace.json, specificare il nome del file di output desiderato per la traccia del modulo. Non può esistere uno spazio tra/d1module:enableLogginge il nome del file di output. Per [other-args], includere eventuali argomenti di compilazione aggiuntivi. Per filename.cpp, specificare il file di origine che riproduce il problema. - Se nel problema sono coinvolte più unità di conversione, eseguire chiamate separate a file singolo per raccogliere una traccia per il file specifico che riproduce il problema. Se necessario, è possibile raccogliere tracce per altri file pertinenti.
Infine, allegare il file trace.json generato insieme al repro preelaborato al report.
Casi di riproduzione dei link
Un link repro è il contenuto di una directory generato dal linker, specificato tramite la variabile di ambiente link_repro oppure come argomento dell'opzione del linker /LINKREPRO. Contiene gli artefatti di build che nel loro insieme dimostrano un problema che si verifica in fase di collegamento. Tra gli esempi figurano un arresto anomalo del back-end che interessa la generazione di codice in fase di collegamento (LTCG) o un arresto anomalo del linker. Questi artefatti di build sono quelli necessari come input per il linker, così da poter riprodurre il problema. È possibile creare facilmente una procedura di riproduzione dei collegamenti usando questa variabile di ambiente. Abilita la funzionalità integrata del linker per la generazione di un repro.
Per generare una riproduzione dei collegamenti usando la variabile di ambiente link_repro
Acquisire gli argomenti della riga di comando usati per compilare la procedura di riproduzione, come descritto in Per segnalare i contenuti della riga di comando.
Aprire il prompt dei comandi per gli sviluppatori corrispondente alla versione di Visual Studio e all'architettura di configurazione usata per compilare il progetto.
Nella finestra della console del Prompt dei comandi per sviluppatori, passare alla directory che contiene il progetto di riproduzione.
Immettere mkdir linkrepro per creare una directory denominata linkrepro per la riproduzione del collegamento. È possibile usare un nome diverso per acquisire un altro collegamento di riproduzione.
Immettere il comando set link_repro=linkrepro per impostare la variabile di ambiente link_repro sulla directory creata. Se la compilazione viene eseguita da una directory diversa, come spesso accade nei progetti più complessi, imposta invece link_repro sul percorso completo della directory link_repro.
Per compilare il progetto di riproduzione in Visual Studio, nella finestra della console del prompt dei comandi per gli sviluppatori digitare il comando devenv. Garantisce che il valore della variabile di ambiente link_repro sia visibile a Visual Studio. Per compilare il progetto dalla riga di comando, usa gli argomenti della riga di comando indicati sopra per replicare la build di riproduzione.
Compilare il progetto di riproduzione e verificare che si sia verificato il problema previsto.
Chiudere Visual Studio se è stato usato per eseguire la compilazione.
Nella finestra della console del prompt dei comandi per sviluppatori, immettere il comando set link_repro= per cancellare la variabile di ambiente link_repro.
Infine, crea un pacchetto della repro comprimendo l'intera directory linkrepro in un file .zip o simile e allegalo alla segnalazione.
L'opzione del linker /LINKREPRO ha lo stesso effetto della variabile di ambiente link_repro . È possibile usare l'opzione /LINKREPROTARGET per specificare il nome in base a cui filtrare per il repro del collegamento generato. Per usare /LINKREPROTARGET, è necessario specificare anche l'opzione del linker /OUT.
Per generare una riproduzione dei collegamenti usando l'opzione /LINKREPRO
Creare una directory per contenere la riproduzione del collegamento. Ci riferiremo al percorso completo della directory che crei come directory-path. Se include spazi, usare virgolette doppie intorno al percorso.
Aggiungere il comando /LINKREPRO:directory-path alla riga di comando del linker. In Visual Studio, aprire la finestra di dialogo Pagine delle proprietà del progetto. Selezionare la pagina delle proprietà Proprietà di configurazione>Linker>Riga di comando. Immettere quindi l'opzione /LINKREPRO:directory-path nella casella Opzioni aggiuntive . Scegli OK per salvare le modifiche.
Crea il progetto di riproduzione e conferma che il problema atteso si è verificato.
Infine, crea un pacchetto della repro comprimendo l'intera directory directory-path link repro directory in un file .zip o simile e allegalo al report.
Altre procedure di riproduzione
Se non riesci a ridurre il problema a un singolo file sorgente o a un repro preelaborato, e il problema non richiede un repro di linking, possiamo analizzare un progetto dell'IDE. Tutte le indicazioni su come creare una procedura di riproduzione valida si applicano ancora: il codice deve essere minimo e autonomo. Il problema dovrebbe verificarsi negli strumenti Microsoft più recenti e se rilevante, non dovrebbe comparire in altri compilatori.
Crea il caso di riproduzione come progetto minimo in un IDE, quindi comprimi l'intera struttura di directory in un file .zip o simile e allegalo alla segnalazione.
Modi per inviare il report
Hai un paio di ottimi modi per inviarci il report. È possibile usare lo strumento di segnalazione dei problemi predefinito di Visual Studio o la pagina Della community degli sviluppatori di Visual Studio. È anche disponibile il pulsante Commenti sul prodotto nella parte inferiore della pagina. La scelta dipende dal fatto che si desideri o meno usare gli strumenti predefiniti nell'IDE per acquisire gli screenshot e organizzare il report. Se si preferisce non usarli, è possibile usare direttamente il sito Web della community degli sviluppatori.
Nota
Indipendentemente dalla modalità di invio del report, Microsoft rispetta la privacy degli utenti. Microsoft garantisce conformità a tutte le leggi che regolano la privacy dei dati. Per informazioni sul trattamento dei dati inviati a Microsoft, vedere l'Informativa sulla privacy di Microsoft.
Usare lo strumento Segnala un problema
Segnala un problema è uno strumento di Visual Studio che consente agli utenti di segnalare i problemi con pochi clic. Viene visualizzato un modulo semplice per inviare informazioni dettagliate sul problema riscontrato. È quindi possibile inviare il report senza mai uscire dall'IDE.
Segnalare il problema tramite lo strumento Segnala un problema dall'IDE è facile e comodo. È possibile accedervi dalla barra del titolo scegliendo l'icona Invia commenti e suggerimenti accanto alla casella di ricerca Avvio veloce. In alternativa, è possibile trovarlo nella barra dei menu in Guida>Invia commenti e suggerimenti>Segnala un problema.
Quando si sceglie di segnalare un problema, eseguire la ricerca di problemi simili nella Community degli sviluppatori. Nel caso in cui il problema sia già stato segnalato, votare positivamente la segnalazione e aggiungere commenti con ulteriori dettagli. Se non viene visualizzato un problema analogo, fare clic sul pulsante Segnala un nuovo problema nella parte inferiore della finestra di dialogo Commenti e suggerimenti di Visual Studio e seguire i passaggi per segnalare il problema.
Usare le pagine della community di sviluppatori di Visual Studio
Le pagine della community di sviluppatori di Visual Studio sono un altro modo pratico per segnalare problemi e trovare soluzioni per Visual Studio e il compilatore C++, strumenti e librerie. Sono disponibili pagine specifiche della community per sviluppatori per Visual Studio, Visual Studio per Mac, .NET, C++, Azure DevOps e Azure DevOps Server.
Sotto le schede della community, nella parte superiore di ogni pagina, è presente una casella di ricerca. È possibile usarla per trovare i post che segnalano problemi simili ai propri. Possono già essere presenti soluzioni o altre informazioni utili relative al problema. Se un utente ha riportato lo stesso problema in precedenza, votare a favore della segnalazione e aggiungere un commento anziché procedere con una nuova segnalazione del problema. Per commentare, votare o segnalare un problema nuovo, potrebbe essere chiesto di accedere all'account di Visual Studio. La prima volta che si esegue l'accesso, è necessario accettare di concedere all'app Developer Community l'accesso al profilo.
Per problemi relativi al compilatore, al linker e ad altri strumenti e librerie C++, cercare prima di tutto la pagina Della community per sviluppatori C++. Se si cerca il problema e non è già segnalato, scegliere il pulsante Segnala un problema accanto alla casella di ricerca. È possibile includere il codice della procedura di riproduzione e la riga di comando, screenshot, collegamenti alle discussioni correlate e qualsiasi altra informazione attinente e utile.
Suggerimento
Le informazioni contenute nel report iniziale della community degli sviluppatori saranno sempre pubbliche. Se si tratta di un problema, vedere la sezione successiva relativa ai report e alla privacy.
Suggerimento
Per altri tipi di problemi che potrebbero verificarsi in Visual Studio non correlati agli strumenti di compilazione di Microsoft C++ (ad esempio, problemi dell'interfaccia utente, funzionalità IDE interrotte o arresti anomali generali), usare lo strumento Segnala un problema nell'IDE. Questa è la scelta migliore, grazie alle funzionalità di screenshot e alla possibilità di registrare le azioni dell'interfaccia utente che causano il problema riscontrato. Questi tipi di errori possono anche essere cercati nel sito della community degli sviluppatori di Visual Studio. Per altre informazioni, vedere Come segnalare un problema con Visual Studio.
Segnalazioni e privacy
Tutte le informazioni contenute nelle segnalazioni, i commenti e le risposte sono pubblicamente visibili per impostazione predefinita. In genere si tratta di un vantaggio, perché consente all'intera community di visualizzare i problemi, le soluzioni e le soluzioni alternative individuate da altri utenti. Tuttavia, se per motivi di privacy o di proprietà intellettuale, si teme che i propri dati o la propria identità diventino di dominio pubblico, sono disponibili alcune opzioni.
Se non si vuole rivelare la propria identità, creare un nuovo account Microsoft che non divulghi informazioni personali. Usare questo account per creare la segnalazione.
Nel titolo o nel contenuto della segnalazione iniziale che sono pubblici, non inserire informazioni che si vogliono mantenere private. Indicare invece che i dettagli saranno inviati privatamente in un commento a parte. Per assicurarsi che la segnalazione sia indirizzata al destinatario corretto, includere cppcompiler nell'elenco degli argomenti nella segnalazione del problema. Dopo aver segnalato il problema, è possibile specificare chi potrà visualizzare le risposte e gli allegati.
Per creare una segnalazione di un problema con informazioni private
Nella segnalazione creata scegliere Aggiungi commento per creare la descrizione privata del problema.
Nell'editor di risposta, usa il menu a discesa sotto i pulsanti Invia e Annulla per specificare il pubblico della risposta. Solo le persone specificate potranno visualizzare le risposte private, le immagini, i collegamenti o il codice inclusi nelle risposte. Scegliere Viewable by moderators and the original poster (Visualizzabile da moderatori e dall'autore originale del post) per limitare la visibilità ai dipendenti Microsoft e all'utente.
Aggiungere la descrizione ed eventuali altre informazioni, immagini e allegati di file necessari per la procedura di riproduzione. Scegliere il pulsante Invia per inviare queste informazioni privatamente.
Esiste un limite di 2 GB per i file allegati e un massimo di 10 file. Per caricare file di dimensioni maggiori, richiedere un URL di caricamento in un commento privato.
Le risposte in questo commento sono soggette allo stesso limite di visibilità specificata, È vero anche se il menu a discesa nei controlli delle risposte non mostra correttamente lo stato di visibilità con restrizioni.
Per tutelare la privacy e impedire la visualizzazione pubblica delle informazioni riservate, prestare attenzione. Limitare tutte le interazioni con Microsoft alle risposte sotto il commento con restrizioni. Le risposte ad altri commenti potrebbero accidentalmente divulgare informazioni riservate.
Come segnalare un problema di documentazione di C++
Se viene visualizzato un problema con un documento, un esempio di codice non valido, una spiegazione confusa, un'omissione critica o anche solo un errore di digitazione, è possibile segnalarlo facilmente usando i pulsanti di feedback nella pagina. Dal 2024, non utilizziamo più le segnalazioni di GitHub per gestire i problemi segnalati. Per altre informazioni, vedere Annuncio di un nuovo modo per inviare commenti e suggerimenti su Microsoft Learn.
La documentazione di C++ è open source, pertanto è possibile inviare una correzione, se lo si desidera. Per ulteriori informazioni su come contribuire alla documentazione, vedere la nostra Contributing guide (Guida ai contributi) su GitHub.