Jak zgłosić problem z zestawem narzędzi microsoft C++ lub dokumentacją

Jeśli znajdziesz problemy w kompilatorze języka Microsoft C++ (MSVC), konsolidatorze lub innych narzędziach i bibliotekach, chcemy o nich wiedzieć. Gdy problem znajduje się w naszej dokumentacji, chcemy również wiedzieć o tym.

Jak zgłosić problem z zestawem narzędzi języka C++

Najlepszym sposobem, aby poinformować nas o problemie, jest wysłanie nam raportu zawierającego opis wykrytego problemu. Powinien on zawierać wszystkie szczegóły dotyczące sposobu tworzenia programu. I powinien zawierać ponowne wykonanie, kompletny przypadek testowy, który możemy użyć do odtworzenia problemu na własnych maszynach. Te informacje pozwalają nam szybko sprawdzić, czy problem istnieje w naszym kodzie i nie jest lokalny w twoim środowisku. Pomaga nam to określić, czy ma wpływ na inne wersje kompilatora i zdiagnozować jego przyczynę.

W poniższych sekcjach dowiesz się, co sprawia, że raport jest dobry. Opisujemy sposób generowania ponownego odtworzenia rodzaju znalezionego problemu oraz sposobu wysyłania raportu do zespołu produktu. Twoje raporty są dla nas ważne i dla innych deweloperów, takich jak Ty. Dziękujemy za pomoc w ulepszaniu języka Microsoft C++!

Jak przygotować raport

Ważne jest utworzenie raportu o wysokiej jakości, ponieważ trudno nam odtworzyć problem, który został znaleziony bez pełnych informacji. Tym lepiej jest raport, tym skuteczniej możemy odtworzyć i zdiagnozować problem.

Raport powinien zawierać co najmniej:

  • Pełne informacje o wersji używanego zestawu narzędzi.

  • Pełny cl.exe wiersza polecenia używany do kompilowania kodu.

  • Szczegółowy opis znalezionego problemu.

  • Odtworzenie: kompletny, uproszczony, samodzielny przykład kodu źródłowego, który pokazuje problem.

Przeczytaj, aby dowiedzieć się więcej o konkretnych potrzebnych informacjach i miejscu, w których można je znaleźć, oraz o tym, jak utworzyć dobrą próbę odtworzenia.

Wersja zestawu narzędzi

Potrzebujemy pełnych informacji o wersji i docelowej architektury zestawu narzędzi, który powoduje problem. Dzięki temu możemy przetestować twoją ponowną próbę pod kątem tego samego zestawu narzędzi na naszych maszynach. Jeśli możemy odtworzyć problem, te informacje zawierają również punkt wyjścia do zbadania, które inne wersje zestawu narzędzi mają ten sam problem.

Aby zgłosić pełną wersję kompilatora

  1. Otwórz wiersz polecenia dla deweloperów zgodny z wersją programu Visual Studio i architekturą konfiguracji używaną do kompilowania projektu. Jeśli na przykład kompilujesz przy użyciu programu Visual Studio 2017 w wersji x64 dla elementów docelowych x64, wybierz pozycję x64 Native Tools Command Prompt for VS 2017 (Wiersz polecenia narzędzi natywnych x64 dla programu VS 2017). Aby uzyskać więcej informacji, zobacz Skróty wiersza polecenia dla deweloperów.

  2. W oknie konsoli wiersza polecenia dewelopera wprowadź polecenie cl /Bv.

Dane wyjściowe powinny wyglądać podobnie do następujących:

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

Skopiuj i wklej całe dane wyjściowe do raportu.

Wiersz polecenia

Potrzebujemy dokładnego wiersza polecenia, cl.exe i wszystkich jego argumentów, używanych do kompilowania kodu. Dzięki temu możemy ją skompilować w dokładnie taki sam sposób na naszych maszynach. Ważne jest, ponieważ znaleziony problem może istnieć tylko w przypadku kompilowania przy użyciu określonego argumentu lub kombinacji argumentów.

Najlepsze miejsce do znalezienia tych informacji znajduje się w dzienniku kompilacji natychmiast po wystąpieniu problemu. Gwarantuje to, że wiersz polecenia zawiera dokładnie te same argumenty, które mogą przyczynić się do problemu.

Aby zgłosić zawartość wiersza polecenia

  1. Znajdź plik CL.command.1.tlog i otwórz go. Domyślnie ten plik znajduje się w folderze Documents w folderze \Visual Studioversion\Projects\SolutionName ProjectName ProjectName Configuration\ProjectName.tlog\\\CL.command.1.tlog lub w folderze User w folderze \Source\Repos\SolutionName ProjectName ProjectName.tlog\\\\CL.command.1.tlog. Może to być inna lokalizacja, jeśli używasz innego systemu kompilacji lub jeśli zmieniono domyślną lokalizację projektu.

    W tym pliku znajdziesz nazwy plików kodu źródłowego, a następnie argumenty wiersza polecenia używane do ich skompilowania, z których każdy znajduje się w oddzielnych wierszach.

  2. Znajdź wiersz zawierający nazwę pliku kodu źródłowego, w którym występuje problem. Poniższy wiersz zawiera odpowiednie argumenty polecenia cl.exe.

Skopiuj i wklej cały wiersz polecenia do raportu.

Opis problemu

Potrzebujemy szczegółowego opisu znalezionego problemu. Dzięki temu możemy sprawdzić, czy widzimy ten sam wpływ na nasze maszyny. Czasami przydaje się nam również wiedzieć, co próbujesz osiągnąć, i co się spodziewano zdarzyć.

Dobry opis zawiera dokładne komunikaty o błędach podane przez zestaw narzędzi lub dokładne zachowanie środowiska uruchomieniowego. Potrzebujemy tych informacji, aby sprawdzić, czy problem został prawidłowo odtworzony. Uwzględnij wszystkie dane wyjściowe kompilatora, a nie tylko ostatni komunikat o błędzie. Musimy zobaczyć wszystko, co doprowadziło do zgłoszenia problemu. Jeśli problem można zduplikować przy użyciu kompilatora wiersza polecenia, preferowane są dane wyjściowe kompilatora. Środowisko IDE i inne systemy kompilacji mogą filtrować wyświetlane komunikaty o błędach lub przechwytywać tylko pierwszy wiersz komunikatu o błędzie.

Jeśli problem polega na tym, że kompilator akceptuje nieprawidłowy kod i nie generuje diagnostyki, uwzględnij je w raporcie.

Aby zgłosić problem z zachowaniem środowiska uruchomieniowego, dołącz dokładną kopię wydruku programu i oczekiwaną kopię. W idealnym przypadku osadzisz ją w samej instrukcji wyjściowej, na przykład printf("This should be 5: %d\n", actual_result);. Jeśli program ulegnie awarii lub powiesi, należy również wspomnieć o tym.

Dodaj wszelkie inne szczegóły, które mogą pomóc nam zdiagnozować znaleziony problem, na przykład wszelkie odnalezione obejścia. Spróbuj nie powtórzyć informacji znalezionych w innym miejscu w raporcie.

Ponowne odtworzenie

Ponowne odtworzenie to kompletny, samodzielny przykład kodu źródłowego. Powtarzanie demonstruje znaleziony problem, stąd nazwa. Potrzebujemy ponownego odtworzenia błędu na naszych maszynach. Kod powinien być wystarczający do utworzenia podstawowego pliku wykonywalnego, który kompiluje i uruchamia. Można też skompilować i uruchomić polecenie , jeśli nie dotyczy znalezionego problemu. Repro nie jest fragmentem kodu. Powinien mieć pełne funkcje i klasy oraz zawierać wszystkie niezbędne dyrektywy #include, nawet w przypadku nagłówków standardowych.

Co sprawia, że dobre ponowne odtworzenie

Dobrym rozwiązaniem jest:

  • Minimalne. Repros powinien być tak mały, jak to możliwe, ale nadal pokazuje dokładnie znaleziony problem. Repros nie musi być złożony ani realistyczny. Muszą tylko pokazać kod zgodny ze standardem lub udokumentowaną implementacją kompilatora. W przypadku brakującej diagnostyki ponów próbę powinien pokazać kod, który nie jest zgodny. Proste, to-the-point repros, które zawierają tylko wystarczającą ilość kodu, aby zademonstrować problem, są najlepsze. Jeśli możesz wyeliminować lub uprościć kod i zachować zgodność, a także pozostawić problem bez zmian, zrób to. Nie musisz uwzględniać przykładów kodu, który działa.

  • Self-Contained. Repozytorium powinno unikać niepotrzebnych zależności. Jeśli możesz odtworzyć problem bez bibliotek innych firm, zrób to. Jeśli możesz odtworzyć problem bez żadnego kodu biblioteki oprócz prostych instrukcji wyjściowych (na przykład puts("this shouldn't compile");, , std::cout << value;i printf("%d\n", value);), wykonaj to. Jest to idealne rozwiązanie, jeśli przykład można skondensować do pojedynczego pliku kodu źródłowego bez odwołania do nagłówków użytkownika. Zmniejszenie ilości kodu, który musimy wziąć pod uwagę jako możliwy współautor problemu, jest dla nas niezwykle pomocne.

  • W przypadku najnowszej wersji kompilatora. Repozytorium powinno używać najnowszej aktualizacji do najnowszej wersji zestawu narzędzi, jeśli jest to możliwe. Możesz też użyć najnowszej wersji wstępnej następnej aktualizacji lub następnej wersji głównej. Problemy, które można znaleźć w starszych wersjach zestawu narzędzi, często zostały rozwiązane w nowszych wersjach. Poprawki są przywracane do starszych wersji tylko w wyjątkowych okolicznościach.

  • W razie potrzeby sprawdzono inne kompilatory . Repros, który obejmuje przenośny kod C++ powinien zweryfikować zachowanie wobec innych kompilatorów, jeśli to możliwe. Standard C++ ostatecznie określa poprawność programu, a kompilator nie jest doskonały. Jeśli jednak język Clang i GCC akceptują kod bez diagnostyki, a MSVC nie, prawdopodobnie znaleziono usterkę w naszym kompilatorze. (Inne możliwości obejmują różnice w zachowaniu systemów Unix i Windows lub różnych poziomach implementacji standardów języka C++ itd.) Gdy wszystkie kompilatory odrzucą kod, prawdopodobnie kod jest niepoprawny. Wyświetlanie różnych komunikatów o błędach może pomóc w samodzielnej diagnozowaniu problemu.

    Listę kompilatorów online do testowania kodu można znaleźć w kompilatorach języka C++ online w witrynie internetowej ISO C++ lub tej wyselekcjonowanej listy kompilatorów języka C++ online w usłudze GitHub. Niektóre konkretne przykłady to Wandbox i Eksplorator kompilatora.

    Uwaga

    Witryny internetowe kompilatora online nie są powiązane z firmą Microsoft. Wiele witryn internetowych kompilatora online jest uruchamianych jako projekty osobiste. Niektóre z tych witryn mogą być niedostępne podczas czytania, ale wyszukiwanie powinno znaleźć inne, których można użyć.

Problemy w kompilatorze, konsolidatorze i w bibliotekach mają tendencję do pokazywania się w określony sposób. Rodzaj problemu, który znajdziesz, określi rodzaj ponownego odtworzenia, który należy uwzględnić w raporcie. Bez odpowiedniego odtworzenia nie mamy nic do zbadania. Poniżej przedstawiono kilka rodzajów problemów, które mogą zostać wyświetlone. Dołączamy instrukcje dotyczące sposobu generowania rodzaju ponownego odtworzenia, którego należy użyć do zgłaszania każdego rodzaju problemu.

Awaria frontonu (analizatora)

Awarie frontonu występują w fazie analizowania kompilatora. Zazwyczaj kompilator emituje błąd krytyczny C1001 i odwołuje się do pliku kodu źródłowego i numeru wiersza, na którym wystąpił błąd. Często wspomina o pliku o nazwie msc1.cpp, ale można zignorować te szczegóły.

W przypadku tego rodzaju awarii podaj wstępnie przetworzoną próbę ponownego przetworzenia.

Oto przykładowe dane wyjściowe kompilatora dla tego rodzaju awarii:

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

Awaria zaplecza (generowanie kodu)

Awarie zaplecza występują w fazie generowania kodu kompilatora. Zazwyczaj kompilator emituje błąd krytyczny C1001 i może nie odwoływać się do pliku kodu źródłowego i numeru wiersza skojarzonego z problemem. Często wspomina on kompilatora plików\utc\src\p2\main.c, ale można zignorować te szczegóły.

W przypadku tego rodzaju awarii podaj ponownie link , jeśli używasz funkcji Generowanie kodu czasu połączenia (LTCG), włączonego przez argument wiersza polecenia /GL do cl.exe. W przeciwnym razie podaj wstępnie przetworzoną próbę ponownego przetworzenia .

Oto przykładowe dane wyjściowe kompilatora dla awarii zaplecza, w której nie jest używana funkcja LTCG. Jeśli dane wyjściowe kompilatora wyglądają następująco, należy podać wstępnie przetworzoną próbę ponownego przetworzenia.

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

Jeśli wiersz rozpoczynający się od wewnętrznego błędu kompilatora wspomina link.exe, a nie cl.exe, włączono funkcję LTCG. W tym przypadku podaj ponownie link . Jeśli nie jest jasne, czy funkcja LTCG została włączona z komunikatu o błędzie kompilatora, sprawdź argumenty wiersza polecenia. Skopiowano je z dziennika kompilacji w poprzednim kroku dla argumentu wiersza polecenia /GL .

Awaria konsolidatora

Awarie konsolidatora występują w fazie łączenia po uruchomieniu kompilatora. Zazwyczaj konsolidator emituje błąd narzędzi konsolidatora LNK1000.

Uwaga

Jeśli dane wyjściowe będą wspominać o C1001 lub obejmuje generowanie kodu w czasie połączenia, zapoznaj się z zamiast tego awarią zaplecza (generowania kodu).

W przypadku tego rodzaju awarii podaj ponownie link.

Oto przykład danych wyjściowych kompilatora dla tego rodzaju awarii:

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

Jeśli łączenie przyrostowe jest włączone, a awaria wystąpiła dopiero po pomyślnym łączem początkowym, czyli dopiero po pierwszym pełnym linku, na którym opiera się później łącze przyrostowe, podaj również kopię plików obiektu (.obj) i biblioteki (lib), które odpowiadają plikom źródłowym zmodyfikowanym po zakończeniu początkowego linku.

Nieprawidłowe generowanie kodu

Nieprawidłowe generowanie kodu jest rzadkie. Dzieje się tak, gdy kompilator błędnie generuje nieprawidłowy kod, który powoduje awarię aplikacji w czasie wykonywania. Zamiast tego powinien wygenerować prawidłowy kod lub wykryć problem w czasie kompilacji. Jeśli uważasz, że problem, który został znaleziony, powoduje nieprawidłowe generowanie kodu, traktuj raport tak samo jak awaria zaplecza (generowania kodu).

W przypadku tego rodzaju awarii podaj ponownie link , jeśli używasz argumentu wiersza polecenia /GL do cl.exe. Jeśli nie, podaj wstępnie przetworzoną próbę ponownego przetworzenia .

Jak wygenerować odtworzenie

Aby pomóc nam w wytropieniu źródła problemu, ważne jest dobre ponowne odtworzenie . Przed wykonaniem dowolnego z poniższych kroków dla określonego rodzaju repozytorium spróbuj skondensować kod, który demonstruje problem jak najwięcej. Spróbuj wyeliminować lub zminimalizować zależności, wymagane nagłówki i biblioteki. Ogranicz używane opcje kompilatora i definicje preprocesora, jeśli to możliwe.

Poniżej przedstawiono instrukcje dotyczące generowania różnych rodzajów repozytoriów, których będziesz używać do zgłaszania różnych rodzajów problemów.

Wstępnie przetworzone repozytorium

Wstępnie przetworzone ponowne odtworzenie jest pojedynczym plikiem źródłowym, który demonstruje problem. Jest on generowany na podstawie danych wyjściowych preprocesora języka C. Aby je utworzyć, użyj opcji /P kompilatora w oryginalnym pliku źródłowym ponownego odtworzenia. Ta opcja powoduje, że dołączone nagłówki usuwają zależności z dodatkowymi plikami źródłowymi i nagłówkowymi. Opcja rozwiązuje również makra, #ifdef warunkowe i inne polecenia preprocesora, które mogą zależeć od środowiska lokalnego.

Uwaga

Wstępnie przetworzone repozytorium nie są tak przydatne w przypadku problemów, które mogą być wynikiem usterek w naszej standardowej implementacji biblioteki, ponieważ często chcemy zastąpić naszą najnowszą implementację w toku, aby sprawdzić, czy problem został już rozwiązany. W takim przypadku nie przetwarzaj wstępnie ponownego przetwarzania i jeśli nie możesz zmniejszyć problemu do pojedynczego pliku źródłowego, spakować kod do pliku .zip lub podobnego lub rozważyć ponowne wykonanie projektu IDE. Aby uzyskać więcej informacji, zobacz Inne repozytorium.

Aby wstępnie przetworzyć plik kodu źródłowego

  1. Przechwyć argumenty wiersza polecenia użyte do skompilowania ponownego wykonania, zgodnie z opisem w temacie Aby zgłosić zawartość wiersza polecenia.

  2. Otwórz wiersz polecenia dla deweloperów zgodny z wersją programu Visual Studio i architekturą konfiguracji używaną do kompilowania projektu.

  3. Przejdź do katalogu zawierającego projekt ponownego tworzenia.

  4. W oknie konsoli wiersza polecenia dewelopera wprowadź polecenie cl /Pargumentynazwa_pliku.cpp. W przypadku argumentów użyj listy argumentów przechwyconych powyżej. nazwa pliku.cpp jest nazwą pliku źródłowego ponownego tworzenia. To polecenie replikuje wiersz polecenia użyty do ponownego odtworzenia, ale zatrzymuje kompilację po przekazaniu preprocesora. Następnie zapisuje wstępnie przetworzony kod źródłowy do pliku.i.

Jeśli wstępnie przetwarzasz plik kodu źródłowego C++/CX lub używasz funkcji modułów języka C++, wymagane są dodatkowe kroki. Aby uzyskać więcej informacji, zobacz poniższe sekcje.

Po wygenerowaniu wstępnie przetworzonego pliku warto upewnić się, że problem nadal jest powtarzany podczas kompilowania wstępnie przetworzonego pliku.

Aby potwierdzić, że wstępnie przetworzony plik nadal reprosuje błąd

  1. W oknie konsoli wiersza polecenia dewelopera wprowadź argumentycl cl/nazwa pliku TP, aby poinformować cl.exe o skompilowaniu wstępnie przetworzonego pliku jako pliku źródłowego języka C++. Argumenty są tymi samymi argumentami przechwytywanymi powyżej, ale z usuniętymi argumentami /D i /I. Dzieje się tak, ponieważ zostały one już uwzględnione w wstępnie przetworzonym pliku. nazwa pliku.i to nazwa wstępnie przetworzonego pliku.

  2. Upewnij się, że problem został odtworzony.

Na koniec dołącz wstępnie przetworzoną nazwę pliku repro.i do raportu.

Wstępnie przetworzone repozytorium kodu C++/CX WinRT/UWP

Jeśli używasz języka C++/CX do kompilowania pliku wykonywalnego, istnieje kilka dodatkowych kroków wymaganych do utworzenia i zweryfikowania wstępnie przetworzonego ponownego wykonania.

Aby wstępnie przetworzyć kod źródłowy C++/CX

  1. Utwórz wstępnie przetworzony plik źródłowy zgodnie z opisem w temacie Aby wstępnie przetworzyć plik kodu źródłowego.

  2. Wyszukaj wygenerowany plik nazwa_pliku.i dla dyrektyw #using .

  3. Utwórz listę wszystkich odwołanych plików. Pozostaw wszystkie pliki systemu Windows*.winmd, pliki platform.winmd i mscorlib.dll.

Aby przygotować się do sprawdzenia, czy wstępnie przetworzony plik nadal odtwarza problem,

  1. Utwórz nowy katalog dla wstępnie przetworzonego pliku i skopiuj go do nowego katalogu.

  2. Skopiuj pliki winmd z listy #using do nowego katalogu.

  3. Utwórz pusty plik vccorlib.h w nowym katalogu.

  4. Edytuj wstępnie przetworzony plik, aby usunąć wszystkie dyrektywy #using dla mscorlib.dll.

  5. Edytuj wstępnie przetworzony plik, aby zmienić wszystkie ścieżki bezwzględne na tylko najgorętsze nazwy plików skopiowanych plików winmd.

Upewnij się, że wstępnie przetworzony plik nadal odtwarza problem, jak pokazano powyżej.

Wstępnie przetworzone repozytorium modułów języka C++

Jeśli używasz funkcji Moduły kompilatora języka C++, istnieje kilka różnych kroków wymaganych do utworzenia i zweryfikowania wstępnie przetworzonego ponownego wykonania.

Aby wstępnie przetworzyć plik kodu źródłowego, który używa modułu

  1. Przechwyć argumenty wiersza polecenia użyte do skompilowania ponownego wykonania, zgodnie z opisem w temacie Aby zgłosić zawartość wiersza polecenia.

  2. Otwórz wiersz polecenia dla deweloperów zgodny z wersją programu Visual Studio i architekturą konfiguracji używaną do kompilowania projektu.

  3. Przejdź do katalogu zawierającego projekt ponownego tworzenia.

  4. W oknie konsoli wiersza polecenia dewelopera wprowadź polecenie cl /Pargumentynazwa_pliku.cpp. Argumenty są argumentami przechwytywanymi powyżej, a nazwa pliku.cpp jest nazwą pliku źródłowego, który korzysta z modułu.

  5. Przejdź do katalogu zawierającego projekt ponownego tworzenia, który skompilował interfejs modułu (dane wyjściowe ifc).

  6. Przechwyć argumenty wiersza polecenia używane do kompilowania interfejsu modułu.

  7. W oknie konsoli wiersza polecenia dewelopera wprowadź polecenie cl /Pargumentsmodulename.ixx. Argumenty są argumentami przechwytywanymi powyżej, a modulename.ixx to nazwa pliku, który tworzy interfejs modułu.

Po wygenerowaniu wstępnie przetworzonych plików warto upewnić się, że problem nadal jest powtarzany podczas używania wstępnie przetworzonego pliku.

Aby potwierdzić, że wstępnie przetworzony plik nadal reprosuje błąd

  1. W oknie konsoli dewelopera przejdź z powrotem do katalogu zawierającego projekt ponownego tworzenia.

  2. Wprowadź polecenie clarguments/TPnazwa pliku.i jak powyżej, aby skompilować wstępnie przetworzony plik tak, jakby był to plik źródłowy języka C++.

  3. Upewnij się, że problem nadal jest odtwarzany przez wstępnie przetworzony plik.

Na koniec dołącz wstępnie przetworzone pliki odtworzenia (nazwa pliku.i i nazwa modułu) wraz z danymi wyjściowymi pliku ifc do raportu.

Ponowne odtworzenie linku to wygenerowana przez konsolidator zawartość katalogu określona przez zmienną środowiskową link_repro lub jako argument opcji konsolidatora /LINKREPRO . Zawiera artefakty kompilacji, które wspólnie demonstrują problem występujący w czasie połączenia. Przykłady obejmują awarię zaplecza z udziałem generowania kodu czasu połączenia (LTCG) lub awarii konsolidatora. Te artefakty kompilacji są potrzebne jako dane wejściowe konsolidatora, aby można było odtworzyć problem. Ponowne tworzenie linku można łatwo utworzyć przy użyciu tej zmiennej środowiskowej. Umożliwia wbudowane generowanie ponownego tworzenia konsolidatora.

  1. Przechwyć argumenty wiersza polecenia użyte do skompilowania ponownego wykonania, zgodnie z opisem w temacie Aby zgłosić zawartość wiersza polecenia.

  2. Otwórz wiersz polecenia dla deweloperów zgodny z wersją programu Visual Studio i architekturą konfiguracji używaną do kompilowania projektu.

  3. W oknie konsoli wiersza polecenia dewelopera przejdź do katalogu zawierającego projekt ponownego uruchamiania.

  4. Wprowadź ciąg mkdir linkrepro , aby utworzyć katalog o nazwie linkrepro dla ponownego odtworzenia linku. Możesz użyć innej nazwy, aby przechwycić inny link do ponownego odtworzenia.

  5. Wprowadź zestaw poleceń link_repro=linkrepro , aby ustawić zmienną środowiskową link_repro na utworzony katalog. Jeśli kompilacja jest uruchamiana z innego katalogu, podobnie jak często w przypadku bardziej złożonych projektów, ustaw link_repro na pełną ścieżkę do katalogu ponownego tworzenia linku.

  6. Aby skompilować projekt ponownego tworzenia w programie Visual Studio, w oknie konsoli wiersza polecenia dewelopera wprowadź polecenie devenv. Gwarantuje to, że wartość zmiennej środowiskowej link_repro jest widoczna dla programu Visual Studio. Aby skompilować projekt w wierszu polecenia, użyj argumentów wiersza polecenia przechwyconych powyżej, aby zduplikować kompilację ponownego wykonania.

  7. Skompiluj projekt ponownego wykonania i upewnij się, że wystąpił oczekiwany problem.

  8. Zamknij program Visual Studio, jeśli został użyty do wykonania kompilacji.

  9. W oknie konsoli wiersza polecenia dewelopera wprowadź zestaw poleceń link_repro= w celu wyczyszczenia zmiennej środowiskowej link_repro.

Na koniec utwórz pakiet ponownie, kompresując cały katalog linkrepro do pliku .zip lub podobnego i dołącz go do raportu.

Opcja konsolidatora /LINKREPRO ma taki sam efekt jak zmienna środowiskowa link_repro. Możesz użyć opcji /LINKREPROTARGET , aby określić nazwę do filtrowania dla wygenerowanego linku ponownie. Aby użyć /LINKREPROTARGET, należy również określić opcję /OUT konsolidatora.

  1. Utwórz katalog do przechowywania ponownego tworzenia linku. Odwołujemy się do pełnej ścieżki katalogu, którą utworzysz jako ścieżkę katalogu. Użyj podwójnych cudzysłowów wokół ścieżki, jeśli zawiera spacje.

  2. Dodaj polecenie /LINKREPRO:directory-path do wiersza polecenia konsolidatora. W programie Visual Studio otwórz okno dialogowe Strony właściwości dla projektu. Wybierz stronę właściwościwiersza poleceniakonsolidatora>konfiguracji>. Następnie wprowadź opcję /LINKREPRO:directory-path w polu Dodatkowe opcje . Wybierz przycisk OK , aby zapisać zmiany.

  3. Skompiluj projekt ponownego wykonania i upewnij się, że wystąpił oczekiwany problem.

Na koniec spakuj ponownie pakiet, kompresując cały katalog-ścieżka do katalogu ponownego tworzenia katalogu do pliku .zip lub podobnego i dołącz go do raportu.

Inne repozytorium

Jeśli nie możesz zmniejszyć problemu do pojedynczego pliku źródłowego lub wstępnie przetworzonego ponownego przetworzenia, a problem nie wymaga ponownego odtworzenia linku, możemy zbadać projekt IDE. Wszystkie wskazówki dotyczące sposobu tworzenia dobrego ponownego odtworzenia nadal mają zastosowanie: Kod powinien być minimalny i samodzielny. Problem powinien wystąpić w naszych najnowszych narzędziach, a jeśli ma to zastosowanie, nie powinien być widoczny w innych kompilatorach.

Utwórz ponownie jako minimalny projekt IDE, a następnie spakuj go, kompresując całą strukturę katalogów do pliku .zip lub podobnego i dołączając go do raportu.

Sposoby wysyłania raportu

Masz kilka dobrych sposobów, aby uzyskać raport do nas. Możesz użyć wbudowanego narzędzia do raportowania problemów programu Visual Studio lub strony programu Visual Studio Developer Community. W dolnej części tej strony znajduje się również przycisk Opinia o produkcie . Wybór zależy od tego, czy chcesz używać wbudowanych narzędzi w środowisku IDE do przechwytywania zrzutów ekranu i organizowania raportu. Jeśli nie chcesz, możesz bezpośrednio użyć witryny internetowej Developer Community.

Uwaga

Niezależnie od sposobu przesyłania raportu firma Microsoft szanuje Twoją prywatność. Firma Microsoft zobowiązuje się do przestrzegania wszystkich przepisów i przepisów dotyczących prywatności danych. Aby uzyskać informacje na temat sposobu traktowania wysyłanych przez Ciebie danych, zobacz Zasady zachowania poufności informacji firmy Microsoft.

Korzystanie z narzędzia Zgłoś problem

Narzędzie Zgłoś problem w programie Visual Studio to sposób, w jaki użytkownicy programu Visual Studio zgłaszają problemy za pomocą zaledwie kilku kliknięć. Zostanie wyświetlony prosty formularz, aby wysłać szczegółowe informacje o znalezionym problemie. Następnie możesz przesłać raport bez opuszczania środowiska IDE.

Raportowanie problemu za pomocą narzędzia Zgłoś problem jest łatwe i wygodne w środowisku IDE. Dostęp do niego można uzyskać na pasku tytułu, wybierając ikonę Wyślij opinię obok pola wyszukiwania Szybkie uruchamianie . Możesz go też znaleźć na pasku menu w obszarze Wyślij opinię w raporcie>o>problemie.

Gdy zdecydujesz się zgłosić problem, najpierw wyszukaj Developer Community pod kątem podobnych problemów. Jeśli problem został zgłoszony wcześniej, zagłosuj raport i dodaj komentarze z dodatkowymi specyfikami. Jeśli nie widzisz podobnego problemu, wybierz przycisk Zgłoś nowy problem w dolnej części okna dialogowego Opinie programu Visual Studio i wykonaj kroki, aby zgłosić problem.

Korzystanie ze stron Developer Community programu Visual Studio

Strony Developer Community programu Visual Studio to kolejny wygodny sposób zgłaszania problemów i znajdowania rozwiązań dla programu Visual Studio oraz kompilatora, narzędzi i bibliotek języka C++. Istnieją określone strony Developer Community dla programu Visual Studio, Visual Studio dla komputerów Mac, .NET, C++, Azure DevOps i Azure DevOps Server.

Pod kartami społeczności w górnej części każdej strony znajduje się pole wyszukiwania. Można go użyć do znajdowania wpisów, które zgłaszają problemy podobne do Twoich. Rozwiązanie lub inne przydatne informacje związane z problemem są już dostępne. Jeśli ktoś zgłosił ten sam problem wcześniej, wywołaj i skomentuj ten raport, a nie utwórz nowego raportu problemu. Aby komentować, głosować lub zgłaszać nowy problem, może zostać wyświetlony monit o zalogowanie się na koncie programu Visual Studio. Po pierwszym zalogowaniu musisz wyrazić zgodę na udzielenie aplikacji Developer Community dostępu do profilu.

W przypadku problemów z kompilatorem języka C++, konsolidatorem i innymi narzędziami i bibliotekami najpierw wyszukaj stronę Developer Community języka C++. Jeśli szukasz problemu i nie zgłoszono go wcześniej, wybierz przycisk Zgłoś problem obok pola wyszukiwania. Możesz dołączyć kod odtworzenia i wiersz polecenia, zrzuty ekranu, linki do powiązanych dyskusji oraz wszelkie inne informacje, które uważasz za istotne i przydatne.

Porada

W przypadku innych rodzajów problemów można znaleźć w programie Visual Studio, które nie są powiązane z zestawem narzędzi języka C++ (na przykład problemy z interfejsem użytkownika, uszkodzone funkcje środowiska IDE lub ogólne awarie), użyj narzędzia Zgłoś problem w środowisku IDE. Jest to najlepszy wybór ze względu na możliwości zrzutu ekranu i możliwość rejestrowania akcji interfejsu użytkownika, które prowadzą do znalezionego problemu. Tego rodzaju błędy można również wyszukać w witrynie programu Visual Studio Developer Community. Aby uzyskać więcej informacji, zobacz Jak zgłosić problem z programem Visual Studio.

Raporty i prywatność

Wszystkie informacje w raportach oraz wszelkie komentarze i odpowiedzi są domyślnie widoczne publicznie. Zwykle jest to korzyść, ponieważ umożliwia całej społeczności wyświetlanie problemów, rozwiązań i obejść innych użytkowników. Jeśli jednak martwisz się o upublicznienie danych lub tożsamości, ze względów dotyczących prywatności lub własności intelektualnej, masz opcje.

Jeśli martwisz się o ujawnienie tożsamości, utwórz nowe konto Microsoft , które nie ujawnia żadnych szczegółów o Tobie. Użyj tego konta, aby utworzyć raport.

Nie umieszczaj niczego, co chcesz zachować jako prywatny w tytule lub zawartości początkowego raportu, który jest publiczny. Zamiast tego załóżmy, że szczegóły będą wysyłane prywatnie w osobnym komentarzu. Aby upewnić się, że raport jest kierowany do odpowiednich osób, dołącz plik cppcompiler na liście tematów raportu problemu. Po utworzeniu raportu problemu można teraz określić, kto może zobaczyć odpowiedzi i załączniki.

Aby utworzyć raport problemu dla informacji prywatnych

  1. W utworzonym raporcie wybierz pozycję Dodaj komentarz , aby utworzyć prywatny opis problemu.

  2. W edytorze odpowiedzi użyj kontrolki listy rozwijanej poniżej przycisków Prześlij i Anuluj , aby określić odbiorców odpowiedzi. Tylko osoby, które określisz, mogą wyświetlać te prywatne odpowiedzi i wszystkie obrazy, linki lub kod, który do nich dołączysz. Wybierz pozycję Wyświetlanie przez moderatorów i oryginalny plakat , aby ograniczyć widoczność pracowników firmy Microsoft i siebie.

  3. Dodaj opis i wszelkie inne informacje, obrazy i załączniki plików potrzebne do odtworzenia. Wybierz przycisk Prześlij , aby wysłać te informacje prywatnie.

    Istnieje limit 2 GB dla dołączonych plików i maksymalnie 10 plików. W przypadku większych przekazań zażądaj adresu URL przekazywania w swoim prywatnym komentarzu.

Wszystkie odpowiedzi w tym komentarzu mają taką samą ograniczoną widoczność, jaką określono. To prawda, nawet jeśli kontrolka listy rozwijanej w odpowiedziach nie pokazuje prawidłowo stanu widoczności z ograniczeniami.

Aby zachować prywatność i zachować poufne informacje poza widokiem publicznym, należy zachować ostrożność. Zachowaj całą interakcję z firmą Microsoft, aby odpowiadać w obszarze ograniczonego komentarza. Odpowiedzi na inne komentarze mogą spowodować przypadkowe ujawnienie poufnych informacji.

Jak zgłosić problem z dokumentacją języka C++

Problemy z usługą GitHub są używane do śledzenia problemów zgłoszonych w naszej dokumentacji. Teraz możesz tworzyć problemy z usługą GitHub bezpośrednio ze strony zawartości, co umożliwia interakcję w znacznie bogatszy sposób z autorami i zespołami produktów. Jeśli widzisz problem z dokumentem, nieprawidłowym przykładem kodu, mylącym wyjaśnieniem, krytycznym pominięciem, a nawet tylko literówką, możesz łatwo poinformować nas o tym. Przewiń do dołu strony i wybierz pozycję Zaloguj się, aby przekazać opinię na temat dokumentacji. Jeśli jeszcze go nie masz, musisz utworzyć konto usługi GitHub. Gdy masz konto usługi GitHub, możesz zobaczyć wszystkie problemy z dokumentacją i ich stan. Otrzymasz również powiadomienia o wprowadzeniu zmian dotyczących zgłoszonego problemu. Aby uzyskać więcej informacji, zobacz wpis w blogu System opinii.

Podczas korzystania z przycisku przesyłania opinii o dokumentacji utworzysz problem z dokumentacją w usłudze GitHub. Problem jest automatycznie wypełniany za pomocą niektórych informacji o stronie, na której został utworzony problem. W ten sposób wiemy, gdzie znajduje się problem, więc nie edytuj tych informacji. Wystarczy dołączyć szczegóły dotyczące tego, co jest nie tak, a jeśli chcesz, sugerowana poprawka. Nasze dokumenty w języku C++ są open source, więc jeśli chcesz przesłać poprawkę samodzielnie, możesz. Aby uzyskać więcej informacji na temat współtworzenia naszej dokumentacji, zobacz nasz przewodnik dotyczący współtworzenia w witrynie GitHub.