Visual C++ 도구 집합의 문제를 보고하는 방법How to Report a Problem with the Visual C++ Toolset

Visual C++ 컴파일러, 링커 또는 기타 도구에 문제가 발생하면 문제를 파악하고자 합니다.If you encounter problems with the Visual C++ compiler, linker, or other tools, we want to know about them.

문제를 알리는 가장 좋은 방법은 발생한 문제에 대한 설명, 프로그램 빌드 방법에 대한 세부 정보 및 다른 컴퓨터에서 문제를 재현하는 데 사용할 수 있는 일부 코드를 포함하는 보고서를 보내는 것입니다.The best way to let us know about a problem is to send us a report that includes a description of the problem you've encountered, details about how you're building your program, and some code we can use to reproduce the problem on our own machines. 이 정보를 통해 문제가 있고 사용자 환경에서만 발생하는 문제가 아님을 빠르게 확인할 수 있으며, 다른 버전의 컴파일러에 영향을 주는지 여부를 확인하고 원인을 진단할 수 있습니다.This information lets us quickly verify that the problem exists and is not local to your environment, determine whether it affects other versions of the compiler, and to diagnose its cause.

이 문서의 내용은 다음과 같습니다.In this document, you'll read about

보고서는 Microsoft와 다른 개발자에게 중요합니다.Your reports are important to us and to other developers like you. Visual C++ 개선에 도움 주셔서 감사합니다!Thank you for helping us improve Visual C++!

보고서를 준비하는 방법How to prepare your report

완전한 정보가 없으면 발생한 문제를 다른 컴퓨터에서 재현하는 것이 매우 어렵기 때문에 고품질 보고서를 만드는 것이 중요합니다.Creating a high-quality report is important because its very difficult to reproduce the problem you encountered on our own machines without complete information. 보고서가 향상될수록 더 효과적으로 문제를 재현하고 진단할 수 있습니다.The better your report is, the more effectively we are able recreate and diagnose the problem.

보고서에는 최소한 다음 정보가 포함되어야 합니다.At a minimum, your report should contain

  • 사용 중인 도구 집합의 전체 버전 정보The full version information of the toolset you're using.

  • 코드를 빌드하는 데 사용된 전체 cl.exe 명령줄The full cl.exe command line used to build your code.

  • 발생한 문제에 대한 자세한 설명A detailed description of the problem you encountered.

  • '재현' - 문제를 보여 주는 소스 코드A 'repro'—source code that demonstrates the problem.

필요한 특정 정보와 이 정보를 확인할 수 있는 위치에 대해 자세히 읽어보세요.Read on to learn more about the specific information we need and where you can find it.

도구 집합 버전The toolset version

다른 컴퓨터에서 동일한 도구 집합에 대해 재현을 테스트하기 위해 사용 중인 도구 집합의 전체 버전 정보가 필요합니다.We need the full version information of the toolset you're using so that we can test your repro against the same toolset on our machines. 문제를 재현할 수 있는 경우 이 정보는 동일한 문제가 발생하는 다른 도구 집합 버전을 조사하는 시작점을 제공하기도 합니다.If we can reproduce the problem, this information also gives us a starting point to investigate which other versions of the toolset exhibit the same problem.

사용 중인 컴파일러의 전체 버전을 보고하려면To report the full version of the compiler you're using

  1. 키보드에서 Windows 키를 누르고 Developer Command Prompt 입력을 시작합니다.Press the Windows key on your keyboard and begin typing Developer Command Prompt.

  2. 일치 항목 목록에 표시되는 경우 사용 중인 Visual Studio 버전과 일치하는 개발자 명령 프롬프트 버전을 선택합니다.Choose the Developer Command Prompt version that matches the version of Visual Studio you're using when it appears in the list of matches.

  3. 개발자 명령 프롬프트 콘솔에서 cl /Bv /CLR 명령을 입력합니다.In the Developer Command Prompt console, enter the command cl /Bv /CLR.

다음과 유사한 출력이 표시됩니다.The output should look similar to this:

C:\Compiler>cl /Bv /CLR
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.40209
for Microsoft (R) .NET Framework version 4.00.30319.34014
Copyright (C) Microsoft Corporation.  All rights reserved.

Compiler Passes:
 C:\WinCComp\binaries.x86chk\bin\i386\cl.exe:        Version 18.00.40209.0
 C:\WinCComp\binaries.x86chk\bin\i386\c1.dll:        Version 18.00.40209.0
 C:\WinCComp\binaries.x86chk\bin\i386\c1xx.dll:      Version 18.00.40209.0
 C:\WinCComp\binaries.x86chk\bin\i386\c2.dll:        Version 18.00.40209.0
 C:\WinCComp\binaries.x86chk\bin\i386\link.exe:      Version 12.00.40209.0
 C:\WinCComp\binaries.x86chk\bin\i386\mspdb120.dll:  Version 12.00.40209.0
 C:\WinCComp\binaries.x86chk\bin\i386\1033\clui.dll: Version 18.00.40209.0
 Common Language Runtime:                            Version  4.00.30319.34014

cl : Command line error D8003 : missing source filename

전체 출력을 복사하여 보고서에 붙여넣습니다.Copy and paste the entire output into your report.

명령줄The command line

다른 컴퓨터에서 동일한 방식으로 빌드하기 위해 코드를 빌드하는 데 사용된 전체 명령줄(cl.exe 및 인수)이 필요합니다.We need the full command line (cl.exe and its arguments) used to build your code so that we can build it in exactly the same way on our machines. 발생한 문제가 특정 인수 또는 인수 조합을 사용하여 빌드하는 경우에만 나타날 수도 있기 때문에 이 정보는 중요합니다.This is important because the problem you've encountered might only exist when building with a certain argument or combination of arguments.

이 정보를 찾을 수 있는 최상의 위치는 문제가 발생한 직후의 빌드 로그입니다.The best place to find this information is in the build log immediately after experiencing the problem. 이렇게 하면 문제를 초래하는 동일한 인수가 명령줄에 정확히 포함됩니다.This ensures that the command line contains exactly the same arguments that might be contributing to the problem.

명령줄의 내용을 보고하려면To report the contents of the command line

  1. CL.command.1.tlog 파일을 찾아서 엽니다.Locate the CL.command.1.tlog file and open it. 기본적으로 이 파일은 \...\Visual Studio Version\Projects\SolutionName\ProjectName\Config\ProjectName.tlog\CL.command.1.tlog에 있습니다.By default, this file is located at \...\Visual Studio Version\Projects\SolutionName\ProjectName\Config\ProjectName.tlog\CL.command.1.tlog.

    이 파일 내에서 소스 코드 파일의 이름과 각 파일을 컴파일하는 데 사용된 명령줄 인수를 각 줄에 하나씩 찾을 수 있습니다.Inside this file, you'll find the names of source code files followed by the command line arguments used to compile them, each on separate lines.

  2. 문제가 발생하는 소스 코드 파일의 이름을 포함하는 줄을 찾습니다. 그 아래 줄에는 해당 cl.exe 명령과 인수가 포함되어 있습니다.Locate the line that contains the name of the source code file where the problem occurs; the line below it contains the corresponding cl.exe command and its arguments.

전체 명령줄을 복사하여 보고서에 붙여넣습니다.Copy and paste the entire command line into your report.

문제에 대한 설명A description of the problem

다른 컴퓨터에서도 동일한 결과가 표시되는지 확인할 수 있도록 발생한 문제에 대한 자세한 설명이 필요합니다. 이 정보는 수행하려던 작업과 예상한 동작을 파악하는 데에도 유용할 수 있습니다.We need a detailed description of the problem you've encountered so that we can verify that we see the same effect on our machines; its also sometimes useful for us to know what you were trying to accomplish, and what you expected to happen.

도구 집합에서 제공된 정확한 오류 메시지, 수행하려던 작업에 대한 간략한 설명(재현 코드 파악에 유용), 발견한 해결 방법 등 발생한 문제 진단에 도움이 되는 기타 세부 정보도 제공해 주세요.Please provide the precise error messages given by the toolset, a brief description of what you were trying to accomplish to help us understand your repro code, and any other details that might help us diagnose the problem you experienced, such as any work-arounds you might have found. 보고서에 같은 정보를 반복해서 포함하지 마세요.Avoid repeating information found elsewhere in your report.

재현The repro

다른 컴퓨터에서 오류를 재현할 수 있도록 발생한 문제를 보여 주는 자체 포함된 소스 코드 예제인 재현이 필요합니다.We need a repro, a self-contained source code example that demonstrates the problem you've encountered, so that we can reproduce the error on our machines. 발생한 문제 종류에 따라 보고서에 포함해야 하는 재현 종류가 결정됩니다.The kind of problem you encounter will determine what kind of repro you should include in your report. 적절한 재현이 없으면 아무것도 조사할 수 없습니다.Without an appropriate repro, we have nothing to investigate.

짧은 자체 포함된 재현은 보고서 텍스트에 직접 포함할 수 있지만, 큰 소스 코드 재현은 보고서에 첨부해야 합니다.Short, self-contained repros can be directly included in your report text, but larger source code repros should be attached to the report. 단일 소스 코드 파일로 줄일 수 없는 재현은 모든 파일이 포함된 디렉터리를 .zip 파일 등으로 압축하여 패키징하고 보고서에 첨부해야 합니다.Repros that can't be reduced to a single source code file should be packaged by compressing a directory containing all the files into a .zip file or similar and attached to the report. 시나리오와 관련된 추가 세부 정보는 항상 보고서 텍스트에 포함해야 하며, 소스 코드에 포함하면 안 됩니다.Any additional scenario-specific details should always be included in the report text, never in source code.

제공할 수 있는 최상의 재현 종류는 최소 재현입니다.The best kind of repro you can provide us is a minimal repro. 이는 문제를 보여 주기에 충분한 코드만 포함된 하나의 자체 포함된 소스 코드 파일(사용자 헤더에 대한 참조 없음)입니다.This is a single, self-contained source code file (without references to user headers) that contains just enough code to demonstrate the problem. 이러한 형태의 재현을 제공할 수 있다면 소스 코드 파일을 보고서에 첨부하기만 하면 됩니다.If you can provide a repro in this form, just attach the source code file to your report; its all we need.

종속성이 없이 최소 재현으로 문제를 줄일 수 없는 경우 다음 섹션을 참조하여 보고서에 포함해야 하는 재현 종류를 확인하세요.If you can't condense the problem to a minimal repro without dependencies, refer to the following sections to determine the kind of repro you should include in your report.

프런트 엔드(파서) 충돌Frontend (parser) crash

프런트 엔드 충돌은 컴파일러의 구문 분석 단계 중에 발생합니다.Frontend crashes occur during the parsing phase of the compiler. 일반적으로 컴파일러는 심각한 오류 C1001을 내보내고 오류가 발생한 소스 코드 파일 및 줄 번호를 참조합니다. msc1.cpp 파일을 언급하는 경우도 많지만 이 세부 정보는 무시해도 됩니다.Typically, the compiler will emit Fatal Error C1001 and reference the source code file and line number on which the error occurred; it will often mention a file msc1.cpp, but you can ignore this detail.

이러한 종류의 충돌을 보고하려면 전처리 재현을 제공하세요.For this kind of crash, please provide a Preprocessed Repro.

이러한 종류의 충돌에 대한 컴파일러 출력 예는 다음과 같습니다.Here's example compiler output for this kind of crash:

SandBoxHost.cpp
d:\o\dev\search\foundation\common\tools\sandbox\managed\managed.h(929):
        fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'msc1.cpp', line 1369)
To work around this problem, try simplifying or changing the program near the
        locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
d:\o\dev\search\foundation\common\tools\sandbox\managed\managed.h(929):
        note: This diagnostic occurred in the compiler generated function
        'void Microsoft::Ceres::Common::Tools::Sandbox::SandBoxedProcess::Dispose(bool)'
Internal Compiler Error in d:\o\dev\otools\bin\x64\cl.exe.  You will be prompted
        to send an error report to Microsoft later.
INTERNAL COMPILER ERROR in 'd:\o\dev\otools\bin\x64\cl.exe'
    Please choose the Technical Support command on the Visual C++
    Help menu, or open the Technical Support help file for more information

백 엔드(코드 생성) 충돌Backend (code generation) crash

백 엔드 충돌은 컴파일러의 코드 생성 단계 중에 발생합니다.Backend crashes occur during the code generation phase of the compiler. 일반적으로 컴파일러는 심각한 오류 C1001을 내보내며, 문제와 관련된 소스 코드 파일 및 줄 번호를 참조하지 않을 수도 있습니다. compiler\utc\src\p2\main.c 파일을 언급하는 경우도 많지만 이 세부 정보는 무시해도 됩니다.Typically, the compiler will emit Fatal Error C1001, and might not reference the source code file and line number associated with the problem; it will often mention a file compiler\utc\src\p2\main.c, but you can ignore this detail.

이러한 종류의 충돌을 보고하려면 링크 재현(LTCG(링크 타임 코드 생성)를 사용하는 경우) 또는 전처리 재현(LTCG를 사용하지 않는 경우)을 제공하세요.For this kind of crash please provide a Link Repro if you are using Link-Time Code Generation (LTCG) or a Preprocessed Repro if not. LTGC는 cl.exe에 대한 /GL 명령줄 인수를 통해 사용됩니다.LTGC is enabled by the /GL command-line argument to cl.exe.

LTCG가 사용되지 않는 경우 이러한 종류의 충돌에 대한 컴파일러 출력 예는 다음과 같습니다.Here's example compiler output for this kind of crash in which LTCG is not used. 컴파일러 출력이 이렇게 표시되는 경우 전처리 재현을 제공해야 합니다.If your compiler output looks like this you should provide a Preprocessed Repro.

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

INTERNAL COMPILER ERROR로 시작하는 줄에서 cl.exe 대신 link.exe가 언급되는 경우 LTCG가 사용된 것이며 링크 재현을 제공해야 합니다.If the line that begins with INTERNAL COMPILER ERROR mentions link.exe, rather than cl.exe, LTCG was enabled and you should provide a Link Repro. 컴파일러 오류 메시지에서 LTCG 사용 여부가 확실하지 않은 경우 이전 단계에서 빌드 로그를 통해 복사한 명령줄 인수에서 /GL 명령줄 인수를 검사해야 할 수도 있습니다.If its not clear whether LTCG was enabled from the compiler error message, you may need to examine the command line arguments that you copied from your build log in a previous step for the /GL command-line argument.

링커 충돌Linker crash

링커 충돌은 컴파일러가 실행된 후 연결 단계 중에 발생합니다.Linker crashes occur during the linking phase, after the compiler has run. 일반적으로 링커는 링커 도구 오류 LNK1000을 내보냅니다.Typically, the linker will emit Linker Tools Error LNK1000.

참고

출력에서 C1001이 언급되거나 링크 타임 코드 생성이 포함된 경우 대신 백 엔드(코드 생성) 충돌에서 자세한 내용을 참조하세요.If the output mentions C1001 or involves Link-Time Code Generation, refer to Backend (code generation) crash instead for more information.

이러한 종류의 충돌을 보고하려면 링크 재현을 제공하세요.For this kind of crash, please provide a Link Repro.

이러한 종류의 충돌에 대한 컴파일러 출력 예는 다음과 같습니다.Here's example compiler output for this kind of crash.

z:\foo.obj : error LNK1000: Internal error during IMAGE::Pass2

  Version 14.00.22816.0

  ExceptionCode            = C0000005
  ExceptionFlags           = 00000000
  ExceptionAddress         = 00007FF73C9ED0E6 (00007FF73C9E0000)
        "z:\tools\bin\x64\link.exe"
  NumberParameters         = 00000002
  ExceptionInformation[ 0] = 0000000000000000
  ExceptionInformation[ 1] = FFFFFFFFFFFFFFFF

CONTEXT:

  Rax    = 0000000000000400  R8     = 0000000000000000
  Rbx    = 000000655DF82580  R9     = 00007FF840D2E490
  Rcx    = 005C006B006F006F  R10    = 000000655F97E690
  Rdx    = 000000655F97E270  R11    = 0000000000000400
  Rsp    = 000000655F97E248  R12    = 0000000000000000
  Rbp    = 000000655F97EFB0  E13    = 0000000000000000
  Rsi    = 000000655DF82580  R14    = 000000655F97F390
  Rdi    = 0000000000000000  R15    = 0000000000000000
  Rip    = 00007FF73C9ED0E6  EFlags = 0000000000010206
  SegCs  = 0000000000000033  SegDs  = 000000000000002B
  SegSs  = 000000000000002B  SegEs  = 000000000000002B
  SegFs  = 0000000000000053  SegGs  = 000000000000002B
  Dr0    = 0000000000000000  Dr3    = 0000000000000000
  Dr1    = 0000000000000000  Dr6    = 0000000000000000
  Dr2    = 0000000000000000  Dr7    = 0000000000000000

증분 연결이 사용되고 초기 연결 후에만(즉, 후속 증분 연결의 기준이 되는 첫 번째 전체 연결 후에만) 충돌이 발생한 경우 초기 연결이 완료된 후 수정한 소스 파일에 해당하는 개체(.obj) 및 라이브러리(.lib) 파일의 복사본도 제공해 주세요.If incremental linking is enabled and the crash occurred only after initial linking—that is, only after the first full linking on which subsequent incremental linking is based—please also provide a copy of the object (.obj) and library (.lib) files that correspond to source files that were modified after the initial linking was completed.

잘못된 코드 생성Bad code generation

잘못된 코드 생성은 드물지만 컴파일러에서 실수로 잘못된 코드가 생성되고 응용 프로그램이 컴파일 시간에 이 문제를 검색하지 못하고 런타임에 충돌하는 경우에 발생합니다.Bad code generation is rare, but occurs when the compiler mistakenly generates incorrect code that will cause your application to crash at runtime rather than detecting this problem at compile-time. 발생하는 문제로 인해 잘못된 코드가 생성된다고 의심하는 경우 보고서를 백 엔드(코드 생성) 충돌과 동일하게 처리하세요.If you believe the problem you are experiencing results in bad code generation, treat your report the same as a Backend (code generation) crash.

이러한 종류의 충돌을 보고하려면 링크 재현(LTCG(링크 타임 코드 생성)를 사용하는 경우) 또는 전처리 재현(LTCG를 사용하지 않는 경우)을 제공하세요.For this kind of crash please provide a Link Repro if you are using Link-Time Code Generation (LTCG) or a Preprocessed Repro if not. LTGC는 cl.exe에 대한 /GL 명령줄 인수를 통해 사용됩니다.LTGC is enabled by the /GL command-line argument to cl.exe.

보고서를 보내는 방법Ways to send your report

여러 가지 방법으로 보고서를 보낼 수 있습니다.There are several ways to get your report to us. Visual Studio의 기본 제공 문제 보고 도구를 사용하거나 Microsoft로 전자 메일을 보낼 수 있습니다.You can use Visual Studio's built-in Report a Problem Tool, or email us. 보고서에 적합한 선택 항목은 발생한 문제 종류, 보고서를 조사할 엔지니어와 상호 작용하려는 방법, 진행 상황을 추적하거나 보고서를 커뮤니티와 공유할지 여부에 따라 달라집니다.The best choice for your report depends on the kind of problem you've encountered, how you want to interact with the engineers who will investigate your report, and whether you'd like to track its progress or share your report with the community.

참고

보고서를 제출하는 방법에 관계없이 Microsoft는 사용자의 개인 정보를 보호합니다.Regardless of how you submit your report, Microsoft respects your privacy. Microsoft에서 사용자가 보낸 데이터를 처리하는 방법에 대한 자세한 내용은 Microsoft Visual Studio 제품군 개인정보처리방침을 참조하세요.For information about how we treat the data that you send us, see the Microsoft Visual Studio Product Family Privacy Statement.

전자 메일 보내기Send an Email

전자 메일은 Visual C++ 팀에게 직접 보고서를 보내는 또 다른 방법입니다. compilercrash@microsoft.com으로 전자 메일을 보내면 됩니다.Email is another way to send your report directly to the Visual C++ team; you can reach us at compilercrash@microsoft.com.

전자 메일을 통해 보고서를 보내는 경우 다음 템플릿을 전자 메일 메시지의 본문으로 사용할 수 있습니다.If you choose to send your report by email, you can use the following template as the body of your email message. 전자 메일 본문에 해당 정보를 포함하지 않는 경우 소스 코드나 다른 파일을 첨부하세요.Don't forget to attach source code or other files if you aren't including that information in the email body.

To: compilercrash@microsoft.com
Subject: Visual C++ Error Report
-----

Compiler version:

CL.EXE command line:

Problem description:

Source code and repro steps:

문제 보고 도구 사용Use the Report a Problem tool

Visual Studio의 문제 보고 도구는 Visual Studio 사용자가 마우스만 몇 번 클릭하여 다양한 문제를 보고할 수 있는 방법입니다.The Report a Problem tool in Visual Studio is a way for Visual Studio users to report a variety of problems with just a few clicks. IDE를 벗어나지 않고 발생한 문제에 대한 자세한 정보를 지정한 다음 보고서를 제출하는 데 사용할 수 있는 간단한 양식을 제공합니다.It provides a simple form that you can use to specify detailed information about the problem you've encountered and then submit your report without ever leaving the IDE.

이 문서에 설명된 종류의 도구 집합 문제에서는 문제 보고 도구를 통해 문제를 보고하는 경우가 드물지만 원하는 경우 선택할 수 있는 옵션입니다.Reporting your problem through the Report a Problem tool is unusual for the kinds of toolset problems discussed in this document; nevertheless, its an option you can choose if it suites your preferences.

Visual Studio에서 발생할 수 있고 도구 집합과 관련이 없는 다른 종류의 문제(예: UI 문제, 손상된 IDE 기능 또는 일반 충돌)에서는 스크린샷 기능과 발생한 문제를 초래하는 UI 작업 기록 기능 때문에 문제 보고 도구가 특히 유용할 수 있습니다.For other kinds of problems you might encounter in Visual Studio that are not related to the toolset (For example, UI issues, broken IDE functionality, or general crashes), the Report a Problem tool can be an especially good choice due to its screenshot capabilities and its ability to record UI actions that lead to the problem you've encountered. 이러한 다른 종류의 오류는 compilercrash@microsoft.com으로 전자 메일을 전송하여 보고하면 안 됩니다.You should never report these other kinds of errors by sending email to compilercrash@microsoft.com.

재현 생성Generate a repro

재현은 발생한 문제를 보여 주는 완전한 자체 포함된 코드 예제입니다.A repro is a complete, self-contained code example, that demonstrates the problem you're reporting. 재현은 코드 조각이 아닙니다. 보고하는 문제로 인해 생성되는 오류를 제외하고 빌드 및 실행되는 전체 예제여야 합니다.A repro is not a code snippet—it must be a complete example that builds and runs (or would, except for the errors produced by the problem you're reporting). 표준 헤더의 경우에도 필요한 모든 #include 지시문을 포함해야 합니다.It should contain all the necessary #include directives, even for the standard headers.

또한 좋은 재현은 다음과 같습니다.Furthermore, a good repro is

  • 최소.Minimal. 재현은 발생한 문제를 정확하게 보여 주는 동시에 최대한 작아야 합니다.Repros should be as small as possible while still demonstrating exactly the problem you encountered. 재현이 복잡하거나 현실적일 필요는 없으며 간단하고 명료한 재현이 더 좋습니다.Repros do not need to be complex or realistic—simple, to-the-point repros are better. 작동하는 반대 예제를 포함할 필요는 없지만 설명에 도움이 되는 경우 포함할 수 있습니다. 문제를 초래하는 예제 코드만 있으면 됩니다.They do not need to include counter-examples of code that works, but may if it is illustrative; only example code that causes the issue is necessary.

  • 자체 포함.Self-Contained. 재현에서 불필요한 종속성을 피해야 합니다.Repros should avoid unnecessary dependencies. 가능한 한, 타사 라이브러리 없이 문제를 재현할 수 있도록 합니다.If you can reproduce the problem without third-party libraries, please do so. 가능한 한, 라이브러리 코드 없이 문제를 재현할 수 있도록 합니다(std::out, printf()는 사용 가능).If you can reproduce the problem without any library code (std::out, printf() are ok), please do so. 가능한 문제 원인으로 고려해야 하는 코드 양을 줄이면 도움이 됩니다.Reducing the amount of code we have to consider as a possible contributor to the problem is enormously helpful to us.

  • 최신 컴파일러 버전 사용.Against the latest compiler version. 가능한 한, 재현에서 최신 버전의 도구 집합을 사용해야 합니다.Repros should use the latest version of the toolset whenever possible. 이전 버전의 도구 집합에서 발생할 수 있는 문제가 최신 버전에서는 수정된 경우가 많습니다.Problems you might still encounter in older versions of the toolset have very often been fixed in newer versions.

  • 관련된 경우 다른 컴파일러에서 확인.Checked against other compilers, if relevant. 포팅 가능한 C++ 코드를 포함하는 재현은 가능한 경우 다른 컴파일러에서 동작을 확인해야 합니다.Repros that involve portable C++ code should verify behavior against other compilers if possible.

    이 단계는 코드가 올바른지(MSVC와 Clang 및 GCC에서 나타나는 결과가 다른 경우) 또는 잘못되었는지(MSVC, Clang 및 GCC에서 모두, 코드에서 오류가 생성되는 경우) 확인하는 데 도움이 됩니다.This step helps to determine whether your code is correct, as when MSVC disagrees with Clang and GCC, or incorrect, as when MSVC, Clang, and GCC agree that your code produces the error.

다음은 각기 다른 종류의 문제를 보고하는 데 사용할 다양한 종류의 재현을 생성하기 위한 지침입니다.Below are instructions for generating the various kinds of repros you'll use to report different kinds of problems.

전처리 재현Preprocessed repros

전처리 재현은 문제를 보여 주고 원래 소스 파일을 처리하여 C 전처리기의 출력에서 생성된 단일 소스 파일입니다.A preprocessed repro is a single source file that demonstrates a problem and has been generated from the output of the C preprocessor by processing the original source file. 이 프로세스에서는 포함된 헤더를 인라인으로 처리하여 추가 소스 및 헤더 파일에 대한 종속성을 제거하며 매크로, #ifdef 및 로컬 환경에 종속될 수 있는 다른 전처리기 명령도 확인합니다.This process inlines included headers to remove dependencies on additional source and header files, and also resolves macros, #ifdefs, and other preprocessor commands that could depend your local environment.

참고

진행 중인 최신 구현을 대체하여 이미 문제가 해결되었는지 확인하는 경우가 많기 때문에, 전처리 재현은 표준 라이브러리 구현에 있는 버그의 결과로 나타날 수 있는 문제에는 적합하지 않습니다.Note that preprocessed repros are least convenient for problems that might be the result of bugs in our standard library implementation because we will often want to substitute our latest, in-progress implementation to see whether we've already fixed the problem. 이 경우 재현을 전처리하지 말고, 문제를 단일 소스 파일로 줄일 수 없는 경우 코드를 .zip 파일 등으로 패키징하거나 IDE 프로젝트 재현을 사용하는 것이 좋습니다(아래의 기타 재현 참조).In this case, don't preprocess the repro, and if you can't reduce the problem to a single source file, package your code into a .zip file or similar, or consider using an IDE project repro (see Other Repros below).

소스 코드 파일을 전처리하려면To preprocess a source code file

  1. 키보드에서 Windows 키를 누르고 Developer Command Prompt 입력을 시작합니다.Press the Windows key on your keyboard and begin typing Developer Command Prompt.

  2. 일치 항목 목록에 표시되는 경우 사용 중인 Visual Studio 버전과 일치하는 개발자 명령 프롬프트 버전을 선택합니다.Choose the Developer Command Prompt version that matches the version of Visual Studio you're using when it appears in the list of matches.

  3. 개발자 명령 프롬프트 콘솔 창에서 cl /P argumentsfilename.cpp 명령을 입력합니다.In the Developer Command Prompt console window, enter the command cl /P argumentsfilename.cpp.

전처리된 파일(filename.i)이 생성된 후 전처리된 파일에서도 문제가 재현되는지 확인하는 것이 좋습니다.After you have the preprocessed file (now filename.i), its a good idea to make sure that the problem still repros using the preprocessed file. /TP 명령줄 인수를 사용하여 cl.exe에 전처리기 단계를 건너뛰고 정상적으로 컴파일을 시도하도록 지시할 수 있습니다.You can use the /TP command line argument to tell cl.exe to skip the preprocessor step and attempt to compile as usual.

전처리된 파일에서도 오류가 재현되는지 확인하려면To confirm that the error still repros with the preprocessed file

  1. 키보드에서 Windows 키를 누르고 Developer Command Prompt 입력을 시작합니다.Press the Windows key on your keyboard and begin typing Developer Command Prompt.

  2. 일치 항목 목록에 표시되는 경우 사용 중인 Visual Studio 버전과 일치하는 개발자 명령 프롬프트 버전을 선택합니다.Choose the Developer Command Prompt version that matches the version of Visual Studio you're using when it appears in the list of matches.

  3. 개발자 명령 프롬프트 콘솔 창에서 cl arguments /TP filename.i 명령을 입력합니다.In the Developer Command Prompt console window, enter the command cl arguments /TP filename.i.

  4. 문제가 재현되는지 확인합니다.Confirm that the problem is reproduced.

마지막으로, 이 재현을 보고서를 첨부합니다.Finally, attach this repro to your report.

링크 재현은 링크 타임에 발생하는 문제(예: LTCG(링크 타임 코드 생성)와 관련된 백 엔드 충돌 또는 링커 충돌)를 총체적으로 보여 주는 빌드 아티팩트를 포함하는 단일 디렉터리입니다. 포함된 빌드 아티팩트는 문제를 재현할 수 있도록 링커 입력으로 필요한 항목입니다.A link repro is a single directory containing build artifacts that collectively demonstrate a problem that occurs at link time, such as a backend crash involving Link-Time Code Generation (LTCG), or a linker crash; the included build artifacts are those needed as linker input so that the problem can be reproduced. 링크 재현은 링커를 통해 제공되는 기능을 사용하여 쉽게 만들 수 있습니다.Link repros can be created easily by using facilities provided by the linker.

  1. 명령 프롬프트를 열고 mkdir directory 명령을 입력하여 링크 재현에 대한 디렉터리를 만듭니다.Open a command prompt and enter the command mkdir directory to create a directory for the link repro.

  2. link_repro 환경 변수를 방금 만든 디렉터리로 설정합니다. set link_repro=directory 명령을 입력합니다.Set the link_repro environment variable to the directory you just created; enter the command set link_repro=directory.

  3. Visual Studio 내에서 빌드를 수행하려는 경우 명령 프롬프트에서 devenv 명령을 입력하여 시작합니다.If you want to perform the build from inside Visual Studio, launch it from the command prompt by entering the command devenv. 이렇게 하면 link_repro 환경 변수의 값이 Visual Studio에 표시됩니다.This ensures that the value of the link_repro environment variable is visible to Visual Studio.

  4. 응용 프로그램을 빌드하고 예상한 문제가 발생하는지 확인합니다.Build your application, and confirm that the expected problem has occurred.

  5. 3단계에서 Visual Studio를 시작한 경우 이제 닫습니다.Close Visual Studio now if you launched it in step 3.

  6. link_repro 환경 변수를 지웁니다. set link_repro= 명령을 입력합니다.Clear the link_repro environment variable; enter the command set link_repro=

마지막으로, 전체 디렉터리를 .zip 파일 등으로 압축하여 재현을 패키징하고 보고서에 첨부합니다.Finally, package the repro by compressing the entire directory into a .zip file or similar and attach it to your report.

기타 재현Other repros

문제를 단일 소스 파일이나 전처리 재현으로 줄일 수 없고 문제에 링크 재현이 필요하지 않은 경우 IDE 프로젝트를 조사할 수 있습니다.If you can't reduce the problem to a single source file or preprocessed repro, and the problem does not require a link repro, we can investigate and IDE project. 프로젝트 내의 코드는 최소화해야 하며, 이 문서의 모든 지침도 적용됩니다.Code inside the project should still be minimal, and all the guidance from this document still applies.

재현을 최소 IDE 프로젝트로 만든 다음 전체 디렉터리 구조를 .zip 파일 등으로 압축하여 패키징하고 보고서에 첨부합니다.Create your repro as a minimal IDE project, then package it by compressing the entire directory structure into a .zip file or similar and attach it to your report.