Как сообщить о проблеме с набором инструментов или документацией для Microsoft C++

Если вы обнаружите проблемы с компилятором (MSVC), компоновщиком или другими средствами и библиотеками Microsoft C++, мы хотим узнать о них. Кроме того, мы хотим знать и о недостатках нашей документации.

Как сообщить о проблеме с набором инструментов C++

Лучший способ сообщить нам о проблеме — отправить отчет с подробным описанием найденной проблемы. Он должен содержать все сведения о том, как компилировалась программа. Также в него нужно включить полный тестовый случай для воспроизведения, который позволит нам продублировать проблему на наших компьютерах. Эта информация позволит нам быстро выяснить, действительно ли проблема находится в нашем коде и не ограничивается только вашей средой. Также мы сможет определить, затрагивает ли она другие версии компилятора, и установить ее причину.

Из следующих разделов вы узнаете, что представляет собой качественный отчет. Мы расскажем, как создать данные для воспроизведения обнаруженной проблемы и как отправить отчет команде разработчиков. Ваши отчеты важны для нас и других разработчиков. Благодарим вас за помощь в улучшении Microsoft C++!

Подготовка отчета

Создание качественного отчета имеет важное значение, так как без полной информации нам будет очень трудно воспроизвести возникшую проблему. Чем подробнее будет ваш отчет, тем эффективнее будет попытка воссоздать и диагностировать проблему.

Отчет должен содержать по меньшей мере следующие данные:

  • полная информация о версии используемого набора инструментов;

  • полная команда cl.exe, используемая для сборки кода;

  • подробное описание возникшей проблемы;

  • данные для воспроизведения — полный, упрощенный, автономный образец исходного кода, демонстрирующий проблему.

Далее мы подробно опишем, какая именно информация нам нужна, где ее найти и как оптимально создавать данные для воспроизведения.

Версия набора инструментов

Обязательно предоставьте нам полную информация о версии и целевой архитектуре набора инструментов, вызывающего проблему. Это нужно, чтобы мы могли воспроизвести ее с теми же инструментами на своих компьютерах. Если мы сможем воспроизвести проблему, то эта информация поможет нам далее выяснить, в каких еще версиях набора инструментов проявляется такая же проблема.

Предоставление полной информации о версии используемого компилятора

  1. Откройте командную строку разработчика, соответствующую версии Visual Studio и архитектуре конфигурации, используемой для создания проекта. Например, если сборка выполняется в Visual Studio 2017 на x64-системе для целевой архитектуры x64, выберите Командная строка Native Tools x64 для VS 2017. Дополнительные сведения см. в разделе Ярлыки командной строки разработчика.

  2. В окне консоли командной строки разработчика введите команду cl /Bv.

Результат должен выглядеть следующим образом:

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

Скопируйте все выходные данные и вставьте их в отчет.

Командная строка

Нам нужна точная команда (cl.exe и все аргументы), которую вы использовали для сборки кода. Это нужно, чтобы мы в точности повторили этот процесс на своих компьютерах. Это важно, так как найденная проблема может возникать только при сборке с определенным аргументом или сочетанием аргументов.

Эту информацию проще всего получить из журнала сборки сразу после возникновения проблемы. Так мы получим командную строку именно с теми аргументами, которые могут быть важной частью проблемы.

Предоставление содержимого командной строки

  1. Найдите файл CL.command.1.tlog и откройте его. По умолчанию этот файл расположен в папке "Документы" в каталоге \Visual Studio version\Projects\SolutionName\ProjectName\Configuration\ProjectName.tlog\CL.command.1.tlog или в вашей папке пользователя в каталоге \Source\Repos\SolutionName\ProjectName\Configuration\ProjectName.tlog\CL.command.1.tlog. Он может находиться в другом месте, если вы используете другую систему сборки или изменили расположение проекта по умолчанию.

    В этом файле в отдельных строках указываются имена файлов с исходным кодом и аргументы командной строки, которые использовались для их компиляции.

  2. Найдите среди них строку с именем того файла с исходным кодом, в котором возникает найденная проблема. Под ней размещается строка с аргументами команды cl.exe.

Скопируйте командную строку полностью и вставьте ее в отчет.

Описание проблемы

Нам потребуется подробное описание найденной проблемы. Оно поможет нам убедиться, что мы получаем на своих компьютерах тот же эффект. Иногда оно помогает нам понять, какую задачу вы пытались выполнить и какой результат ожидали получить.

Хорошее описание должно содержать точные сообщения об ошибках, полученных от набора инструментов, или точное поведение в среде выполнения. Эти сведения позволят проверить, что мы правильно воспроизвели проблему. Укажите все выходные данные компилятора, а не только последнее сообщение об ошибке. Нам нужны сведения обо всех процессах, которые привели к сообщаемой проблеме. Если вы можете воспроизвести проблему с помощью компилятора командной строки, лучше предоставить именно эти выходные данные. Интегрированные среды разработки и другие системы сборки могут фильтровать отображаемые сообщения об ошибках или показывать только их первые строки.

Если проблема заключается в том, что компилятор принимает недопустимый код и не выдает диагностические сообщения, укажите это в отчете.

Чтобы сообщить о проблеме с работой среды выполнения, приложите точную копию выдаваемых программой данных и опишите, что вы ожидаете увидеть. В идеале эти данные включаются в оператор вывода, например так: printf("This should be 5: %d\n", actual_result);. Если программа зависает или аварийно завершает работу, также сообщите нам об этом.

Добавьте любые другие сведения, которые могут помочь нам диагностировать найденную проблему, например обнаруженные обходные пути. Старайтесь повторять сведения, которые уже включены в другие части отчета.

Данные для воспроизведения

Пример для воспроизведения содержит полный и автономный образец кода. Он должен стабильно воспроизводить найденную проблему, что и отражено в его названии. Данные для воспроизведения нужны нам, чтобы воспроизвести ошибку на своих компьютерах. Этот код должен быть достаточно полным, чтобы создать простой исполняемый файл, который будет компилироваться и запускаться. Либо этот пример кода должен компилироваться и выполняться при отсутствии найденной проблемы. Пример для воспроизведения — это не фрагмент кода. Этот код должен содержать полные варианты функций и классов, а также все необходимые директивы #include даже для стандартных заголовков.

Как создать оптимальные данные для воспроизведения

Оптимальные данные для воспроизведения характеризует

  • Минимальный размер. Пример для воспроизведения должен иметь минимально необходимый размер, позволяющий продемонстрировать проблему. Не следует присылать сложный или реалистичный пример для воспроизведения. В нем должен быть лишь тот код, который соответствует стандарту или задокументированной реализации компилятора. Если вы сообщаете о проблеме с отсутствием диагностики, пример для воспроизведения должен содержать код, который не соответствует стандартам. Лучше всего присылать простые примеры для воспроизведения, содержащие только необходимый для демонстрации проблемы код. Если вы можете исключить или упростить часть кода, сохранив соответствие стандартам и не изменяя проявления проблемы, сделайте это. Нет необходимости включать "обратные" примеры с кодом, который не вызывает ошибку.

  • Автономность. В данных для воспроизведения следует избегать лишних зависимостей. Если проблему можно воспроизвести без сторонних библиотек, то не используйте их. Если проблему можно воспроизвести вообще без библиотек кода, кроме простых операторов вывода (таких как puts("this shouldn't compile");, std::cout << value; и printf("%d\n", value);), сделайте это. В идеале следует сократить пример до одного файла исходного кода без ссылок на какие-либо пользовательские заголовки. Сокращая объем кода, который может вносить вклад в возникновение проблемы, вы оказываете нам большую услугу.

  • Использование последней версии компилятора. По возможности используйте в примере для воспроизведения самую последнюю версию набора инструментов. Допустима также самая свежая предварительная версия следующего пакета обновления или следующего основного выпуска. Часто бывает так, что найденные в старых версиях набора инструментов проблемы уже исправлены в более новых версиях. Исправления переносятся в более ранние версии только в исключительных случаях.

  • Тестирование с другими компиляторами, если это необходимо. Данные для воспроизведения, включающие переносимый код C++, следует протестировать с другими компиляторами, если это возможно. В конечном счете корректность программ определяется только стандартом C++, ведь ни один компилятор не идеален. Но в том случае, если Clang и GCC принимают ваш код без диагностических сообщений, а MSVC — нет, вполне вероятно наличие ошибки в нашем компиляторе. (Другие варианты: различия в поведении Unix и Windows, разные уровни реализации стандартов C++ и т. д.) Если же код отклоняют все компиляторы, наиболее вероятна ошибка в самом коде. Различные сообщения об ошибках могут помочь вам самостоятельно диагностировать проблему.

    Списки веб-компиляторов для тестирования кода см. в разделе веб-компиляторов C++ на веб-сайте ISO C++ или в курируемом списке веб-компиляторов C++ на GitHub. Примеры конкретных компиляторов: Wandbox и Compiler Explorer.

    Примечание

    Сайты с веб-компиляторами не связаны с Майкрософт. Многие веб-компиляторы созданы в статусе персональных проектов. Некоторые из них уже будут недоступны, когда вы прочитаете эти строки, но не составит особого труда найти другие, пригодные для вашей цели.

Проблемы в компиляторе, компоновщике и библиотеках, как правило, проявляются определенным образом. Данные для воспроизведения, которые следует включить в отчет, зависят от типа возникшей проблемы. Не имея этих данных, мы не сможем провести анализ. Ниже описаны несколько типов проблем, с которыми вы можете столкнуться. Мы добавили инструкции по созданию примеров для воспроизведения, которые уместны в отчете для каждого из этих типов проблем.

Сбой интерфейсной части (средства синтаксического анализа)

Сбои интерфейсной части происходят на этапе выполнения синтаксического анализа компилятором. Как правило, компилятор выдает неустранимую ошибку C1001 с указанием файла с исходным кодом и номера строки, в которой произошла ошибка. Часто упоминается файл msc1.cpp, однако эту информацию можно игнорировать.

В случае такого сбоя предоставьте предварительно обработанный пример для воспроизведения.

Вот пример выходных данных компилятора для сбоя такого типа:

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

Внутренний сбой (при создании кода)

Внутренние сбои происходят на этапе создания кода компилятором. Как правило, компилятор выдает неустранимую ошибку C1001, возможно без указания файла с исходным кодом и номера строки, в которой произошла ошибка. В ней часто упоминается файл compiler\utc\src\p2\main.c, однако эту информацию можно игнорировать.

В случае такого сбоя предоставьте данные компоновки для воспроизведения, если вы используете функцию создания кода во время компоновки (LTCG), которая включается аргументом командной строки /GL для cl.exe. Если же нет, предоставьте предварительно обработанные данные для воспроизведения.

Ниже приведен пример выходных данных компилятора для внутреннего сбоя, когда не используется LTCG. Если компилятор возвращает выходные данные, похожие на пример ниже, следует предоставить предварительно обработанные данные для воспроизведения.

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

Если в строке, которая начинается со слов ВНУТРЕННЯЯ ОШИБКА КОМПИЛЯТОРА, упоминается программа link.exe, а не cl.exe, значит функция LTCG была включена. В этом случае следует предоставить данные компоновки для воспроизведения. Если из сообщения компилятора об ошибке не очевидно, была ли включена функция LTCG, проверьте аргументы командной строки. Вы должны были скопировать их из журнала сборки на предыдущем шаге для аргумента командной строки /GL.

Сбой компоновщика

Сбои компоновщика происходят на этапе компоновки после выполнения компилятора. Как правило, компоновщик выдает ошибку средств компоновщика LNK1000.

Примечание

Если в выходных данных указывается ошибка C1001 или использовалась функция создания кода во время компоновки, обратитесь к разделу Внутренний сбой (при создании кода).

Для такого сбоя предоставьте данные компоновки для воспроизведения.

Ниже представлен пример выходных данных компилятора для сбоя такого типа.

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

Если включена инкрементная компоновка и сбой произошел только после выполнения начальной компоновки (то есть первой полной компоновки, после которой осуществляется инкрементная), предоставьте также копии файлов объектов (.obj) и библиотек (.lib), соответствующие файлам исходного кода, измененным после начальной компоновки.

Создание неверного кода

Создание неверного кода происходит очень редко. Так называется ситуация, когда ошибочно созданный компилятором код приводит к сбою приложения во время выполнения. Компилятор должен всегда создавать выполнимый код или обнаруживать проблемы во время компиляции. Если вы считаете, что найденная проблема приводит к созданию неверного кода, следуйте указаниям из раздела Внутренний сбой (при создании кода).

В случае такого сбоя предоставьте данные компоновки для воспроизведения, если вы используете аргумент командной строки /GL для cl.exe. Если это не так, предоставьте предварительно обработанные данные для воспроизведения.

Создание данных для воспроизведения

Чтобы найти источник проблемы, нам крайне важно получить подходящие данные для воспроизведения. Прежде чем выполнять какие-либо из описанных ниже действий по созданию определенных типов данных для воспроизведения, постарайтесь насколько возможно сократить код, демонстрирующий проблему. Попробуйте устранить или свести к минимуму зависимости, требуемые заголовки и библиотеки. Если возможно, сократите число используемых параметров компилятора и определений препроцессора.

Ниже приведены инструкции по созданию различных типов данных для воспроизведения в зависимости от характера проблемы.

Предварительно обработанные данные для воспроизведения

Предварительно обработанные данные для воспроизведения представляют собой один файл исходного кода, который успешно демонстрирует проблему. Они создаются из выходных данных препроцессора C. Чтобы создать такой пример, примените параметр компилятора /P к файлу исходного кода из базового примера для воспроизведения. Этот параметр переносит включенные заголовки в код, чтобы устранить зависимости от внешних файлов источника и заголовков. Также этот параметр разрешает макросы, условные выражения #ifdef и другие команды препроцессора, которые могут зависеть от локальной среды.

Примечание

Предварительно обработанные данные для воспроизведения не очень помогают в решении проблем, возникающих из-за ошибок в нашей реализации стандартных библиотек, так как мы часто для пробы используем находящиеся сейчас в разработке, еще не выпущенные реализации, в которых проблема, возможно, уже устранена. В этом случае не выполняйте предварительную обработку данных. Если вы не можете продемонстрировать проблему в одном файле исходного кода, упакуйте код в ZIP-файл или иной архив или предоставьте в качестве примера проект из вашей интегрированной среды разработки. Дополнительные сведения см. в разделе Другие типы данных для воспроизведения.

Предварительная обработка файла с исходным кодом

  1. Запишите аргументы командной строки, используемые для сборки данных для воспроизведения, как описано в разделе Предоставление содержимого командной строки.

  2. Откройте командную строку разработчика, соответствующую версии Visual Studio и архитектуре конфигурации, используемой для создания проекта.

  3. Перейдите в каталог, содержащий проект данных для воспроизведения.

  4. В окне консоли командной строки разработчика введите команду cl /Pargumentsfilename.cpp. Вместо строки arguments используйте собранный ранее список аргументов. filename.cpp содержит имя файла исходного кода для воспроизведения. Эта команда реплицирует командную строку, которую вы включили в пример для воспроизведения, но прекращает компиляцию после выполнения препроцессора. Созданный препроцессором исходный код сохраняется в файл filename.i.

Если вы выполняете предварительную обработку файла с исходным кодом C++/CX или используете функцию модулей C++, то требуются некоторые дополнительные шаги. Дополнительные сведения см. в разделе ниже.

После создания предварительно обработанного файла мы рекомендуем проверить, успешно ли он воспроизводит проблему после компиляции.

Проверка воспроизведения ошибки с помощью предварительно обработанного файла

  1. В окне консоли командной строки для разработчика введите команду clarguments/TPfilename.i, чтобы скомпилировать предварительно обработанный файл как файл исходного кода C++. Строка arguments содержит те же аргументы, собранные выше, но уже без аргументов /D или /I. Это связано с тем, что они уже включены в предварительно обработанный файл. Файл filename.i содержит имя предварительно обработанного файла.

  2. Убедитесь в том, что проблема воспроизводится.

Наконец, вложите <имя_файла> .i с предварительно обработанными данными для воспроизведения в свой отчет.

Предварительно обработанные данные для воспроизведения кода C++/CX WinRT/UWP

Если вы используете C++/CX для создания исполняемого файла, то необходимы дополнительные действия для создания и проверки предварительно обработанных данных для воспроизведения.

Предварительная обработка исходного кода C++/CX

  1. Создайте предварительно обработанный файл с исходным кодом, как описано в разделе Предварительная обработка файла с исходным кодом.

  2. Найдите созданный файл <имя файла=""> .i для директив #using.

  3. Создайте список всех файлов, на которые есть ссылки. Исключите файлы Windows*.winmd, platform.winmd и mscorlib.dll.

Чтобы подготовить проверку того, что предварительно обработанные файлы по-прежнему воспроизводят проблему,

  1. создайте новый каталог и скопируйте в него предварительно обработанный файл.

  2. Скопируйте в новый каталог файлы WINMD из списка #using.

  3. Создайте пустой файл vccorlib.h в новом каталоге.

  4. Отредактируйте предварительно обработанный файл, чтобы удалить все директивы #using для mscorlib.dll.

  5. Отредактируйте предварительно обработанный файл, чтобы изменить все абсолютные пути таким образом, чтобы они содержали только имена скопированных файлов WINMD.

Проверьте, что предварительно обработанные файлы по-прежнему воспроизводят проблему, как и раньше.

Предварительно обработанные модули C++ для воспроизведения

Если вы используете функцию модулей компилятора C++, то процесс создания и проверки предварительно обработанных данных для воспроизведения немного отличается.

Предварительная обработка файла c исходным кодом, в котором используется модуль

  1. Запишите аргументы командной строки, используемые для сборки данных для воспроизведения, как описано в разделе Предоставление содержимого командной строки.

  2. Откройте командную строку разработчика, соответствующую версии Visual Studio и архитектуре конфигурации, используемой для создания проекта.

  3. Перейдите в каталог, содержащий проект данных для воспроизведения.

  4. В окне консоли командной строки разработчика введите команду cl /Pargumentsfilename.cpp. Строка arguments содержит собранные выше аргументы, а filename.cpp — имя исходного файла, который использует модуль.

  5. Перейдите в каталог, содержащий проект для воспроизведения, в котором создается интерфейс модуля (выходной файл IFC).

  6. Запишите аргументы командной строки, которые использовались для сборки интерфейса модуля.

  7. В окне консоли командной строки разработчика введите команду cl /Pargumentsmodulename.ixx. Строка arguments содержит собранные выше аргументы, а modulename.ixx — имя файла, который создает интерфейс модуля.

После создания предварительно обработанного файла мы рекомендуем проверить, успешно ли он воспроизводит проблему.

Проверка воспроизведения ошибки с помощью предварительно обработанного файла

  1. В окне консоли разработчика перейдите обратно в каталог, который содержит проект с данными для воспроизведения.

  2. Введите команду cl<аргументы>/TP<имя_файла>.i, как это описано выше, чтобы скомпилировать предварительно обработанный файл так, как если бы это был файл исходного кода C++.

  3. Убедитесь, что проблема по-прежнему воспроизводится предварительно подготовленным файлом.

В завершение присоедините к отчету предварительно обработанные файлы для воспроизведения ( <имя_файла> .i и <имя_модуля> .i) и файл вывода IFC.

Данные компоновки для воспроизведения — это созданное компоновщиком содержимое каталога, указанное переменной среды link_repro или как аргумент для параметра компоновщика /LINKREPRO. Они содержат артефакты сборки, которые вместе демонстрируют проблему, возникающую во время компоновки, например внутренний сбой при создании кода во время компоновки (LTCG) или сбой компоновщика. Эти артефакты сборки нужны в качестве входных данных компоновщика, позволяющих воспроизвести проблему. Эта переменная среды позволяет легко получить данные компоновки для воспроизведения. Она включает встроенную функцию компоновщика по созданию примера для воспроизведения.

  1. Запишите аргументы командной строки, используемые для сборки данных для воспроизведения, как описано в разделе Предоставление содержимого командной строки.

  2. Откройте командную строку разработчика, соответствующую версии Visual Studio и архитектуре конфигурации, используемой для создания проекта.

  3. В окне консоли командной строки разработчика перейдите в каталог, который содержит проект с данными для воспроизведения.

  4. Введите команду mkdir linkrepro, чтобы создать каталог linkrepro для данных компоновки для воспроизведения. Вы можете использовать другое имя для записи других данных компоновки для воспроизведения.

  5. Введите команду set link_repro=linkrepro, чтобы задать переменную среды link_repro для созданного каталога. Если сборка выполняется из другого каталога, как это обычно бывает для более сложных проектов, вместо этого задайте для link_repro полный путь к каталогу данных компоновки для воспроизведения.

  6. Чтобы выполнить сборку проекта данных для воспроизведения в Visual Studio, в окне консоли командной строки разработчика введите команду devenv. Благодаря ей значение переменной среды link_repro будет доступно Visual Studio. Для сборки проекта в командной строке используйте аргументы командной строки, записанные выше, чтобы повторить сборку данных для воспроизведения.

  7. Выполните сборку проекта данных для воспроизведения и проверьте, возникает ли проблема.

  8. Закройте Visual Studio, если сборка выполнялась в этой среде.

  9. В окне консоли командной строки разработчика введите команду set link_repro= для очистки переменной среды link_repro.

Наконец, упакуйте данные для воспроизведения, сжав весь каталог linkrepro в ZIP-файл или аналогичный архив, и вложите их в отчет.

Параметр компоновщика /LINKREPRO действует так же, как переменная среды link_repro. Параметр /LINKREPROTARGET позволяет указать имя для фильтра для созданных данных компоновки для воспроизведения. Чтобы использовать /LINKREPROTARGET, укажите параметр компоновщика /OUT.

  1. Создайте каталог для размещения данных компоновки для воспроизведения. Созданный вами полный путь к каталогу мы будем называть путь_каталога. Если путь содержит пробелы, заключите его в двойные кавычки.

  2. Добавьте команду /LINKREPRO:путь_каталога в командную строку компоновщика. В Visual Studio откройте диалоговое окно Страницы свойств проекта. Перейдите на страницу свойств Свойства конфигурации>Компоновщик>Командная строка. Затем введите параметр /LINKREPRO:путь_каталога в поле Дополнительные параметры. Выберите ОК для сохранения внесенных изменений.

  3. Выполните сборку проекта данных для воспроизведения и проверьте, возникает ли проблема.

Наконец, упакуйте данные для воспроизведения, сжав весь каталог linkrepro путь_каталога в ZIP-файл или аналогичный архив, и вложите их в отчет.

Другие типы данных для воспроизведения

Если вы не можете свести проблему к одному файлу исходного кода или представить ее в виде предварительно обработанных данных для воспроизведения, а данные компоновки не помогают описать проблему, мы можем проанализировать проект из вашей интегрированной среды разработки. Все рекомендации по созданию хороших данных для воспроизведения сохраняются прежними: код должен быть минимальным и автономным; проблема должна наблюдаться в последней версии инструментов и, если применимо, не должна возникать в других компиляторах.

Создайте данные для воспроизведения в виде проекта интегрированной среды разработки минимального размера, упакуйте его, сжав всю структуру каталогов в ZIP-файл или файл аналогичного формата, и вложите в отчет.

Способы отправки отчета

Существует несколько надежных способов доставить нам отчет. Можно воспользоваться встроенным средством для отчетов о проблемах Visual Studio или страницей сообщества разработчиков Visual Studio. Есть также кнопка Отзыв о продукте внизу страницы. Выбор метода зависит от того, нужно ли использовать встроенные средства интегрированной среды разработки для создания снимков экрана и структурирования отчета. Если это не требуется, вы можете сообщить о проблеме напрямую на сайте сообщества разработчиков.

Примечание

Независимо от способа отправки отчета корпорация Майкрософт сохраняет вашу конфиденциальность. Корпорация Майкрософт привержена соблюдению всех законов и положений о конфиденциальности данных. Сведения о том, как мы обращаемся с поступающей от вас информацией, см. в Заявлении о конфиденциальности Майкрософт.

Использование инструмента "Сообщить о проблеме"

Инструмент Сообщить о проблеме в Visual Studio позволяет пользователям Visual Studio сообщать о проблемах всего несколькими щелчками мыши. Он открывает простую форму для отправки подробных сведений о найденной проблеме. Вы сможете отправить отчет, даже не выходя из интегрированной среды разработки.

С помощью инструмента Сообщить о проблеме вы можете быстро сообщить о проблеме из интегрированной среды разработки. Этот инструмент доступен через строку заголовка. Чтобы его открыть, щелкните значок Отправить отзыв рядом с полем поиска Быстрый запуск. Либо найдите его в строке меню, последовательно выбрав Справка>Отправить отзыв>Сообщить о проблеме.

Решив сообщить о проблеме, сначала попытайтесь найти подобный вопрос в сообществе разработчиков. Если проблема уже была зарегистрирована ранее, проголосуйте за соответствующий отчет и добавьте комментарии с дополнительными подробностями. Если подобная проблема отсутствует, нажмите кнопку Сообщить о новой проблеме, расположенную в нижней части диалогового окна отзывов Visual Studio, и выполните действия об указании сведений об ошибке.

Использование страниц сообщества разработчиков Visual Studio

Страницы сообщества разработчиков Visual Studio являются еще одним удобным способом указания сведений о проблемах и поиска решений по работе с Visual Studio, а также с компилятором, средствами и библиотеками C++. Существуют отдельные страницы сообщества разработчиков для Visual Studio, Visual Studio для Mac, .NET, C++, Azure DevOps и Azure DevOps Server.

Под вкладками сообществ в верхней части каждой страницы находится поле поиска. Его можно использовать для поиска записей с похожими проблемами. Возможно, для вашей проблемы уже существует готовое решение или имеется другая полезная информация. Если кто-то уже сообщил о подобной проблеме ранее, проголосуйте за это сообщение и добавьте комментарий, а не создавайте новый отчет о проблеме. Чтобы оставить комментарий или отчет о новой проблеме, вам потребуется войти в учетную запись Visual Studio. При первом входе также следует предоставить приложению сообщества разработчиков доступ к вашему профилю.

Сведения о проблемах с компилятором C++, компоновщиком и другими средствами и библиотеками прежде всего ищите на странице сообщества разработчиков C++. Если поиск информации о проблеме покажет, что ранее о ней никто не сообщал, нажмите кнопку Сообщить о проблеме рядом с полем поиска. Вы можете включить код воспроизведения, командную строку, снимки экранов, ссылки на соответствующие обсуждения и любую другую информацию, которую вы считаете актуальной и полезной.

Совет

Для проблем других типов, которые могут встречаться в Visual Studio, но не имеют прямого отношения к набору инструментов C++ (например, проблемы пользовательского интерфейса, неработающие функциональные возможности интегрированной среды разработки или сбои общего характера), используйте инструмент Сообщить о проблеме в интегрированной среде разработки. Это самый правильный вариант, поскольку он позволяет использовать снимки экрана и записывать действия в пользовательском интерфейсе, которые приводят к найденной проблеме. Также сведения об ошибках такого рода можно искать на сайте сообщества разработчиков Visual Studio. Дополнительные сведения см. в статье Как сообщить о проблеме с Visual Studio 2017.

Отчеты и конфиденциальность

По умолчанию все данные в отчетах и любые комментарии и ответы видимы для всех. Обычно это удобно, так как позволяет всему сообществу видеть проблемы, решения и обходные пути, обнаруженные другими пользователями. Тем не менее, если вы обеспокоены тем, что ваши данные или данные о вас станут общедоступны, из-за нежелания вмешательства в личную жизнь или охраны интеллектуальной собственности, то для вас есть решение.

Если вы не хотите раскрывать вашу личность, создайте учетную запись Майкрософт, которая не будет содержать никаких сведений о вас. Используйте эту учетную запись для создания отчета.

Не следует размещать ничего, что необходимо сохранить в тайне, в заголовке или содержимом исходного отчета, который является общедоступным. Вместо этого сообщите, что все подробности отправите в частном порядке в отдельном комментарии. Чтобы убедиться в том, что отчет попадет к нужным сотрудникам, включите cppcompiler в список тем вашего отчета о проблеме. После создания отчета о проблеме можно указать, кто может просматривать ответы и вложения.

Создание отчета о проблеме с закрытой информацией

  1. В созданном отчете выберите Добавить комментарий для создания закрытого описания проблемы.

  2. В редакторе ответа используйте раскрывающийся список элементов под кнопками Отправить и Отмена, чтобы указать тех, кто сможет увидеть ответ. Только указанные вами пользователи смогут увидеть закрытые ответы, так же как и все изображения, ссылки или код, включенные в них. Выберите Видимый для модераторов и создателя сообщения, чтобы ограничить видимость только сотрудниками корпорации Майкрософт и вами.

  3. Добавьте описание и любые другие сведения, изображения и вложенные файлы, необходимые для воспроизведения вашей проблемы. Нажмите кнопку Отправить, чтобы отправить эти сведения в частном порядке.

    Действует ограничение: не более 10 вложенных файлов максимальным размером 2 ГБ. Для загрузки файлов большего размера запросите в частном комментарии URL-адрес для отправки.

Все ответы на этот комментарий имеют те же ограничения видимости, что и заданные вами ограничения в исходном сообщении. Так происходит даже в тех случаях, когда в раскрывающемся списке элементов неправильно отображается ограничение видимости для ответов.

Соблюдайте осторожность, чтобы сохранить конфиденциальность и не предоставлять критически важную информацию в открытый доступ. Все взаимодействие с корпорацией Майкрософт следует ограничить ответами в комментариях с ограниченным доступом. Ответы на другие комментарии могут привести к случайному раскрытию конфиденциальной информации.

Как сообщить о проблеме с документацией C++

Мы используем проблемы GitHub для отслеживания проблем с нашей документацией. Теперь можно создавать проблему GitHub прямо на странице содержимого. Это удобный способ взаимодействия с нашими авторами и командами разработки продуктов. Если вы заметили проблему с документом, неверный пример кода, непонятное объяснение, критическое упущение или хотя бы просто опечатку, сообщите нам об этом. В нижней части страницы нажмите Войти и оставить отзыв о документации. Следует создать бесплатную учетную запись GitHub, если у вас ее еще нет. Если у вас есть учетная запись GitHub, вы сможете увидеть все проблемы, касающиеся документации, и их текущее состояние. Вы также будете получать уведомления, если произойдут изменения, касающиеся проблемы, о которой вы сообщили. Дополнительные сведения см. в записи блога о системе обратной связи.

Вы можете создать на сайте GitHub сообщение о проблеме с документацией, используя кнопку обратной связи по вопросам документации. Сообщение о проблеме автоматически заполняется данными о той странице, на которой вы создали это сообщение. Так мы получим сведения о том, где присутствует проблема. Не изменяйте эти сведения. Просто добавьте информацию о сути ошибки и, если пожелаете, предложите вариант исправления. Наши документы по C++ предоставляются в формате открытого кода, поэтому вы можете отправить собственное исправление, если пожелаете. Дополнительные сведения о том, какой вклад вы можете внести в нашу документацию, см. в Руководстве о совместной работе на GitHub.