C# 디버깅 구성
Visual Studio Code에서 C# 디버거를 `launch.json`, `launchSettings.json` 또는 사용자 `settings.json` 파일로 구성할 수 있습니다.
설명: 명령줄 인수 설정
가능한 모든 옵션의 세부 정보로 들어가기 전에, 기본 시나리오를 살펴보겠습니다: 프로그램에 명령줄 인수를 설정하는 것입니다. 이 단계는 환경 변수 또는 현재 작업 디렉토리와 같은 다른 기본 옵션을 업데이트하는 데도 작동합니다.
접근 방식 1: `launchSettings.json`
C# Dev Kit의 경우, 디버깅하는 권장 방법은 C# Dev Kit가 프로젝트 파일의 설정을 자동으로 파악하도록 하는 것입니다. 이는 `
이 경우 명령줄 인수를 설정하는 단계는 다음과 같습니다.
- 작업 영역 탐색기 보기에서 시작하려는 프로젝트(.csproj 파일)의 디렉토리로 이동합니다.
- 아직 `Properties` 디렉토리가 없다면 생성합니다.
- 아직 `launchSettings.json` 파일이 없다면 생성합니다. 아래 텍스트를 예로 사용할 수 있습니다.
- `commandLineArgs` 속성을 원하는 명령줄 인수 값으로 변경합니다.
예제 `launchSettings.json` 파일:
{
"profiles": {
"MyLaunchProfileName": {
"commandName": "Project",
"commandLineArgs": "MyFirstArgument MySecondArgument"
}
}
}
접근 방식 2: `launch.json`
VS Code에서 `coreclr` 또는 `clr` 디버그 어댑터 유형을 사용하는 경우, 명령줄 인수는 `
- `
/.vscode/launch.json`을 엽니다. - 시작하려는 `coreclr` 또는 `clr` 시작 구성을 찾습니다.
- `args` 속성을 편집합니다. 이 값은 문자열 또는 문자열 배열이 될 수 있습니다.
launchSettings.json 구성
C# Dev Kit를 사용하면 Visual Studio의 `launchSettings.json`을 Visual Studio Code와 함께 사용할 수 있습니다.
예
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "https://:59481",
"sslPort": 44308
}
},
"profiles": {
"EnvironmentsSample": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://:7152;https://:5105",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"EnvironmentsSample-Staging": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://:7152;https://:5105",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Staging",
"ASPNETCORE_DETAILEDERRORS": "1",
"ASPNETCORE_SHUTDOWNTIMEOUTSECONDS": "3"
}
},
"EnvironmentsSample-Production": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://:7152;https://:5105",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
프로필 속성
- `commandLineArgs` - 실행 중인 대상에 전달할 인수입니다.
- `executablePath` - 실행 파일의 절대 또는 상대 경로입니다.
- `workingDirectory` - 명령의 작업 디렉토리를 설정합니다.
- `launchBrowser` - 브라우저를 시작해야 하는 경우 `true`로 설정합니다.
- `applicationUrl` - 웹 서버에 구성할 URL 목록을 세미콜론으로 구분합니다.
- `sslPort` - 웹 사이트에 사용할 SSL 포트입니다.
- `httpPort` - 웹 사이트에 사용할 HTTP 포트입니다.
구성 가능한 옵션 목록
다음은 디버깅 중에 변경하려는 일반적인 옵션입니다.
PreLaunchTask
`preLaunchTask` 필드는 프로그램을 디버깅하기 전에 `tasks.json`에서 해당 `taskName`을 실행합니다. VS Code 명령 팔레트에서 **Tasks: Configure Tasks Runner** 명령을 실행하여 기본 빌드 사전 실행 작업을 얻을 수 있습니다.
이것은 `dotnet build`를 실행하는 작업을 생성합니다. VS Code Tasks 문서에서 더 많은 내용을 읽을 수 있습니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ❌
Program
program 필드는 시작할 애플리케이션 dll 또는 .NET Core 호스트 실행 파일의 경로로 설정됩니다.
이 속성은 일반적으로 "${workspaceFolder}/bin/Debug/
예: `"${workspaceFolder}/bin/Debug/netcoreapp1.1/MyProject.dll"`
여기서
는 디버깅 중인 프로젝트가 빌드되는 대상 프레임워크입니다. 일반적으로 프로젝트 파일에서 'TargetFramework' 속성으로 찾을 수 있습니다. 는 디버깅 중인 프로젝트의 빌드 출력 dll 이름입니다. 일반적으로 프로젝트 파일 이름과 같지만 '.dll' 확장자가 붙습니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ✔️ `executablePath`로
Cwd
대상 프로세스의 작업 디렉토리입니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ✔️ `workingDirectory`로
Args
이것은 프로그램에 전달될 인수입니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ✔️ `commandLineArgs`로
Stop at Entry
대상 진입점에서 중지해야 하는 경우 `stopAtEntry`를 "true"로 설정할 수 있습니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ✔️ `csharp.debug.stopAtEntry`로
- `launchSettings.json` ❌
웹 브라우저 시작
ASP.NET Core 프로젝트의 기본 `launch.json` 템플릿 (C# 확장 v1.20.0 기준)은 ASP.NET이 시작될 때 VS Code가 웹 브라우저를 시작하도록 구성하는 데 다음과 같이 사용합니다.
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
}
이에 대한 참고 사항
-
브라우저가 자동으로 시작되는 것을 원하지 **않으면** 이 요소를 삭제하면 됩니다 (`launch.json`에 대신 `launchBrowser` 요소가 있는 경우에도).
-
이 패턴은 ASP.NET Core가 콘솔에 쓰는 URL을 사용하여 웹 브라우저를 시작합니다. URL을 수정하려면 브라우저 URL 지정을 참조하세요. 대상 애플리케이션이 다른 컴퓨터나 컨테이너에서 실행 중이거나 `applicationUrl`에 특수 호스트 이름이 있는 경우(예: `"applicationUrl": "http://*:1234/"`) 유용할 수 있습니다.
-
`serverReadyAction`은 VS Code의 새로운 기능입니다. C# 확장의 디버거에 내장된 이전 `launchBrowser` 기능보다 권장되는 이유는 C# 확장이 원격 컴퓨터에서 실행될 때 작동할 수 있고, VS Code에 구성된 기본 브라우저를 사용하며, 스크립트 디버거도 사용할 수 있기 때문입니다. 이러한 기능이 중요하지 않다면 이전 `launchBrowser`를 계속 사용할 수 있습니다. 또한 특정 프로그램을 실행하는 대신 기본 브라우저를 시작하려는 경우에도 `launchBrowser`를 계속 사용할 수 있습니다.
-
`serverReadyAction`에 대한 자세한 내용은 Visual Studio Code 2019년 2월 릴리스 정보에서 찾을 수 있습니다.
-
작동 방식은 VS Code가 콘솔에 설정된 출력 내용을 긁어오는 것입니다. 한 줄이 패턴과 일치하면 캡처된 URL에 대한 브라우저를 시작합니다.
패턴이 하는 일에 대한 설명은 다음과 같습니다.
- `\\b` : 단어 경계에서 일치합니다. `\b`는 단어 경계를 나타내지만, 이것은 json 문자열 안에 있으므로 `\`는 이스케이프되어야 하므로 `\\b`입니다.
- `Now listening on:` : 문자열 리터럴로, 다음 텍스트가 `Now listening on:`이어야 함을 의미합니다.
- `\\s+` : 하나 이상의 공백 문자와 일치합니다.
- `(` : '캡처 그룹'의 시작입니다. 브라우저를 시작하는 데 사용될 텍스트 영역을 저장함을 나타냅니다.
- `http` : 문자열 리터럴.
- `s?` : 문자 `s` 또는 아무것도 아님.
- `://` : 문자열 리터럴.
- `\\S+` : 하나 이상의 공백이 아닌 문자.
- `)` : 캡처 그룹의 끝입니다.
-
두 가지 브라우저 시작 형식 모두 `"console": "internalConsole"`이 필요합니다. 브라우저 실행기는 웹 서버가 자체를 초기화했는지 알기 위해 대상 프로세스의 표준 출력을 긁어옵니다.
브라우저 URL 지정
콘솔 출력에서 URL을 무시하려면 패턴에서 `(` 및 `)`를 제거하고 `uriFormat`을 시작하려는 값으로 설정할 수 있습니다.
예
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+https?://\\S",
"uriFormat": "https://:1234"
}
콘솔 출력에서 포트 번호는 사용하지만 호스트 이름은 사용하지 않으려면 다음과 같이 할 수도 있습니다.
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+http://\\S+:([0-9]+)",
"uriFormat": "https://:%s"
}
사실 거의 모든 URL을 열 수 있습니다. 예를 들어 다음과 같이 기본 swagger UI를 열 수 있습니다.
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+http://\\S+:([0-9]+)",
"uriFormat": "https://:%s/swagger/index.html"
}
**참고** 이를 위해 프로젝트에 swaggerui가 설정되어 있는지 확인해야 합니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ✔️ `launchBrowser` 및 `applicationUrl` 사용
환경 변수
환경 변수는 이 스키마를 사용하여 프로그램에 전달될 수 있습니다.
"env": {
"myVariableName":"theValueGoesHere"
}
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ✔️ `environmentVariables`로
콘솔 (터미널) 창
`"console"` 설정은 대상 앱이 시작되는 콘솔(터미널) 창을 제어합니다. 다음 값 중 하나로 설정할 수 있습니다 --
- `"internalConsole"` (기본값): 대상 프로세스의 콘솔 입력(stdin) 및 출력(stdout/stderr)은 VS Code 디버그 콘솔을 통해 라우팅됩니다. 이 모드의 장점은 디버거와 대상 프로그램의 메시지를 한 곳에서 볼 수 있어 중요한 메시지를 놓치거나 앞뒤로 전환할 필요가 없다는 것입니다. 간단한 콘솔 상호 작용이 있는 프로그램(예: `Console.WriteLine` 및/또는 `Console.ReadLine` 사용)에 유용합니다. 커서 위치를 변경하거나, 입력을 위해 `Console.ReadKey`를 사용하는 등 콘솔에 대한 전체 제어가 필요한 대상 프로그램에는 사용하면 안 됩니다. 콘솔에 입력하는 지침은 아래를 참조하세요.
- `"integratedTerminal"`: 대상 프로세스는 VS Code의 통합 터미널 내에서 실행됩니다. 애플리케이션과 상호 작용하려면 편집기 아래 탭 그룹의 **Terminal** 탭을 선택합니다. 이 모드를 사용할 때 기본적으로 디버깅을 시작할 때 디버그 콘솔이 표시되지 않습니다. `launch.json`을 사용하는 경우 `internalConsoleOptions`로 구성할 수 있습니다.
- `"externalTerminal"`: 대상 프로세스는 자체 외부 터미널 내에서 실행됩니다. 이 모드를 사용할 때는 Visual Studio Code와 외부 터미널 창 간에 포커스를 전환해야 합니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ✔️ `csharp.debug.console`로
- `launchSettings.json` ❌
**참고**: `csharp.debug.console` 설정은 `dotnet` 디버그 구성 유형으로 시작된 콘솔 프로젝트에만 사용됩니다.
internalConsole을 사용할 때 대상 프로세스에 텍스트 입력
`internalConsole`을 사용할 때 Visual Studio Code에 텍스트를 입력하여 `Console.ReadLine` 및 `stdin`에서 읽는 유사한 API에서 반환받을 수 있습니다. 그렇게 하려면 프로그램이 실행되는 동안 디버그 콘솔 하단의 입력 상자에 텍스트를 입력합니다. Enter를 누르면 텍스트가 대상 프로세스로 전송됩니다. 프로그램이 디버거 아래에 중지되어 있는 동안 이 상자에 텍스트를 입력하면 이 텍스트는 C# 식별자로 평가되며 대상 프로세스로 전송되지 않습니다.
예

`launchSettingsProfile` 및 `launchSettingsFilePath`
`launchSettings.json`에 대한 전체 지원은 `"type": "dotnet"`을 사용하는 시작 구성이 필요하지만, `coreclr` 및 `clr` 디버거 유형은 `launchSettings.json` 기능의 제한된 하위 집합도 지원합니다. 이는 Visual Studio Code와 전체 Visual Studio 모두에서 동일한 설정을 사용하려는 사용자에게 유용합니다.
사용할 `launchSettings.json` 프로필을 구성하거나 (또는 사용하지 않도록) `launchSettingsProfile` 옵션을 설정합니다.
"launchSettingsProfile": "ProfileNameGoesHere"
이렇게 하면 예를 들어 이 예제 `launchSettings.json` 파일의 `myVariableName`을 사용할 수 있습니다.
{
"profiles": {
"ProfileNameGoesHere": {
"commandName": "Project",
"environmentVariables": {
"myVariableName": "theValueGoesHere"
}
}
}
}
`launchSettingsProfile`이 지정되지 않은 경우 `"commandName": "Project"`인 첫 번째 프로필이 사용됩니다.
`launchSettingsProfile`이 null 또는 빈 문자열로 설정되면 `Properties/launchSettings.json`은 무시됩니다.
기본적으로 디버거는 `{cwd}/Properties/launchSettings.json`에서 `launchSettings.json`을 검색합니다. 이 경로를 사용자 정의하려면 `launchSettingsFilePath`를 설정합니다.
"launchSettingsFilePath": "${workspaceFolder}/<Relative-Path-To-Project-Directory/Properties/launchSettings.json"
제한 사항
- `"commandName": "Project"`인 프로필만 지원됩니다.
- `environmentVariables`, `applicationUrl` 및 `commandLineArgs` 속성만 지원됩니다.
- `launch.json`의 설정은 `launchSettings.json`의 설정보다 우선 적용됩니다. 따라서 예를 들어 `launch.json`에 `args`가 이미 비어 있지 않은 문자열/배열이 아닌 값으로 설정되어 있다면 `launchSettings.json`의 내용은 무시됩니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ❌
Source File Map
이 형식을 사용하여 맵을 제공함으로써 소스 파일이 열리는 방식을 선택적으로 구성할 수 있습니다.
"sourceFileMap": {
"C:\\foo":"/home/me/foo"
}
이 예에서
- `C:\foo`는 모듈(예: MyCode.dll)이 컴파일될 때 하나 이상의 소스 파일(예: `program.cs`)의 원본 위치입니다. 소스 파일이 있는 디렉토리이거나 소스 파일의 전체 경로(예: `c:\foo\program.cs`)일 수 있습니다. Visual Studio Code를 실행하는 컴퓨터에 존재하거나 원격 디버깅 중인 경우 원격 컴퓨터에 존재할 필요는 없습니다. 디버거는 `.pdb` (심볼) 파일에서 소스 파일의 경로를 읽고 이 맵을 사용하여 경로를 변환합니다.
- `/home/me/foo`는 Visual Studio Code에서 소스 파일을 찾을 수 있는 경로입니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ✔️ `csharp.debug.sourceFileMap`으로
- `launchSettings.json` ❌
Just My Code
`justMyCode`를 "false"로 설정하여 선택적으로 비활성화할 수 있습니다. 심볼이 없거나 최적화된 라이브러리를 디버깅하려는 경우 Just My Code를 비활성화해야 합니다.
"justMyCode":false
Just My Code는 사용 중인 최적화된 라이브러리의 일부 세부 정보(.NET Framework 자체 등)를 숨겨 디버깅에 집중할 수 있도록 하는 기능 세트입니다. 이 기능의 가장 중요한 하위 부분은 다음과 같습니다.
- 사용자가 처리하지 않은 예외: 프레임워크가 예외를 잡기 직전에 디버거를 자동으로 중지합니다.
- Just My Code 스텝핑: 스텝핑할 때 프레임워크 코드가 사용자 코드로 다시 호출하면 자동으로 중지됩니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ✔️ `csharp.debug.justMyCode`로
- `launchSettings.json` ❌
Require exact source
디버거는 pdb와 소스 코드가 정확히 동일해야 합니다. 이를 변경하고 소스가 동일함을 비활성화하려면 다음을 추가합니다.
"requireExactSource": false
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ✔️ `csharp.debug.requireExactSource`로
- `launchSettings.json` ❌
속성 및 연산자 단계별 실행
디버거는 기본적으로 관리 코드의 속성 및 연산자를 건너뜁니다. 대부분의 경우 더 나은 디버깅 경험을 제공합니다. 이를 변경하고 속성 또는 연산자로 들어가려면 다음을 추가합니다.
"enableStepFiltering": false
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ✔️ `csharp.debug.enableStepFiltering`으로
- `launchSettings.json` ❌
로깅
출력 창에 로깅될 메시지를 선택적으로 활성화 또는 비활성화할 수 있습니다. 로깅 필드의 플래그는 'exceptions', 'moduleLoad', 'programOutput', 'browserStdOut', 'consoleUsageMessage'입니다.
디버거 문제를 진단하기 위한 'logging.diagnosticsLog' 아래의 고급 옵션도 있습니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ✔️ `csharp.debug.logging` 아래
- `launchSettings.json` ❌
PipeTransport
디버거가 .NET Core 디버거 백엔드(vsdbg)와 VS Code 간에 표준 입력 및 출력을 릴레이하는 다른 실행 파일을 사용하여 원격 컴퓨터에 연결해야 하는 경우, pipeTransport 필드를 다음 스키마에 따라 추가합니다.
"pipeTransport": {
"pipeProgram": "ssh",
"pipeArgs": [ "-T", "ExampleAccount@ExampleTargetComputer" ],
"debuggerPath": "~/vsdbg/vsdbg",
"pipeCwd": "${workspaceFolder}",
"quoteArgs": true
}
파이프 전송에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
Windows Subsystem for Linux (WSL) 여기의 파이프 전송 구성에 대한 정보는 여기에서 찾을 수 있습니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ❌
운영 체제별 구성
운영 체제별로 변경해야 하는 특정 명령이 있는 경우 'windows', 'osx' 또는 'linux' 필드를 사용할 수 있습니다. 위에 언급된 필드 중 일부를 특정 운영 체제에 맞게 대체할 수 있습니다.
Suppress JIT Optimizations
.NET 디버거는 다음 옵션을 지원합니다. `true`이면 최적화된 모듈(릴리스 구성으로 컴파일된 .dll)이 대상 프로세스에 로드될 때 디버거는 Just-In-Time 컴파일러에게 최적화가 비활성화된 코드를 생성하도록 요청합니다. 이 옵션의 기본값은 `false`입니다.
"suppressJITOptimizations": true
**.NET에서 최적화가 작동하는 방식**: 코드를 디버깅하려는 경우 해당 코드가 **최적화되지 않은** 것이 더 쉽습니다. 코드가 최적화될 때 컴파일러와 런타임은 CPU 코드를 더 빠르게 실행하기 위해 코드를 변경하지만 원본 소스 코드와의 매핑이 덜 직접적입니다. 이는 디버거가 로컬 변수의 값을 알려주지 못하고 코드 스텝핑 및 중단점이 예상대로 작동하지 않을 수 있음을 의미합니다.
일반적으로 릴리스 빌드 구성은 최적화된 코드를 생성하고 디버그 빌드 구성은 그렇지 않습니다. `Optimize` MSBuild 속성은 컴파일러가 코드 최적화를 지시하도록 제어합니다.
.NET 생태계에서 코드는 소스에서 CPU 명령으로 두 단계 프로세스로 변환됩니다. 첫째, C# 컴파일러는 입력한 텍스트를 MSIL이라는 중간 바이너리 형식으로 변환하고 이를 .dll 파일로 작성합니다. 나중에 .NET 런타임은 이 MSIL을 CPU 명령으로 변환합니다. 두 단계 모두 어느 정도 최적화할 수 있지만, .NET 런타임이 수행하는 두 번째 단계에서 더 중요한 최적화가 이루어집니다.
**옵션의 작동 방식**: 이 옵션은 최적화가 활성화된 상태로 컴파일된 DLL이 대상 프로세스에 로드될 때 발생하는 일을 제어합니다. 옵션이 `false`(기본값)이면 .NET 런타임이 MSIL 코드를 CPU 코드로 컴파일할 때 최적화를 활성화된 상태로 둡니다. 옵션이 `true`이면 디버거는 최적화를 비활성화하도록 요청합니다.
**이 옵션을 사용해야 하는 시기**: 이 옵션은 다른 소스(예: NuGet 패키지)에서 다운로드한 DLL을 가지고 해당 DLL의 코드를 디버깅하려는 경우 사용해야 합니다. 이를 위해서는 해당 DLL의 심볼(.pdb) 파일도 찾아야 합니다.
로컬에서 빌드하는 코드만 디버깅하는 데 관심이 있다면 이 옵션을 `false`로 두는 것이 가장 좋습니다. 경우에 따라 이 옵션을 활성화하면 디버깅 속도가 크게 느려질 수 있습니다. 느려지는 두 가지 이유는 다음과 같습니다.
- 최적화된 코드가 더 빠르게 실행됩니다. 많은 코드에 대해 최적화를 비활성화하는 경우 시간이 더 많이 걸릴 수 있습니다.
- Just My Code가 활성화된 경우 디버거는 최적화된 DLL에 대한 심볼을 로드하려고 시도조차 하지 않습니다. 심볼을 찾는 데 시간이 오래 걸릴 수 있습니다.
**이 옵션의 제한 사항**: 이 옵션이 **작동하지 않는** 두 가지 상황이 있습니다.
1: 이미 실행 중인 프로세스에 디버거를 연결하는 상황에서는 디버거가 연결될 때 이미 로드된 모듈에 이 옵션이 영향을 미치지 않습니다.
2: 이 옵션은 사전 컴파일된(ngen'ed) 네이티브 코드로 컴파일된 dll에는 영향을 미치지 않습니다. 그러나 환경 변수 `COMPlus_ReadyToRun`을 `0`으로 설정하여 프로세스를 시작하여 사전 컴파일된 코드 사용을 비활성화할 수 있습니다. .NET Core (2.x)의 이전 버전을 대상으로 하는 경우 `COMPlus_ZapDisable`도 '1'로 설정하십시오. 디버거 아래에서 시작하는 경우 `launch.json`에 이 설정을 추가하여 이 구성을 설정할 수 있습니다.
"env": {
"COMPlus_ZapDisable": "1",
"COMPlus_ReadyToRun": "0"
}
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ✔️ `csharp.debug.suppressJITOptimizations`로
- `launchSettings.json` ❌
Symbol Options
`symbolOptions` 요소는 디버거가 심볼을 검색하는 방식을 사용자 정의할 수 있게 합니다. 예:
"symbolOptions": {
"searchPaths": [
"~/src/MyOtherProject/bin/debug",
"https://my-companies-symbols-server"
],
"searchMicrosoftSymbolServer": true,
"searchNuGetOrgSymbolServer": true,
"cachePath": "/symcache",
"moduleFilter": {
"mode": "loadAllButExcluded",
"excludedModules": [ "DoNotLookForThisOne*.dll" ]
}
}
속성
**searchPaths**: 심볼 서버 URL (예: `https://msdl.microsoft.com/download/symbols`) 또는 `.pdb` 파일을 검색할 디렉토리 (예: /build/symbols) 배열입니다. 이 디렉토리는 모듈 옆과 `.pdb`가 원래 드롭된 경로의 기본 위치 외에 추가로 검색됩니다.
**searchMicrosoftSymbolServer**: `true`이면 Microsoft Symbol server (https://msdl.microsoft.com/download/symbols)가 심볼 검색 경로에 추가됩니다. 지정하지 않은 경우 이 옵션은 `false`로 기본 설정됩니다.
**searchNuGetOrgSymbolServer**: `true`이면 Nuget.org Symbol server (https://symbols.nuget.org/download/symbols)가 심볼 검색 경로에 추가됩니다. 지정하지 않은 경우 이 옵션은 `false`로 기본 설정됩니다.
**cachePath**: 심볼 서버에서 다운로드한 심볼을 캐시할 디렉토리입니다. 지정하지 않은 경우 Windows에서는 디버거가 `%TEMP%\SymbolCache`로 기본 설정되고, Linux 및 macOS에서는 디버거가 `~/.dotnet/symbolcache`로 기본 설정됩니다.
**moduleFilter.mode**: 이 값은 `"loadAllButExcluded"` 또는 `"loadOnlyIncluded"`입니다. `"loadAllButExcluded"` 모드에서는 모듈이 'excludedModules' 배열에 없는 한 디버거는 모든 모듈에 대한 심볼을 로드합니다. `"loadOnlyIncluded"` 모드에서는 'includedModules' 배열에 있거나 'includeSymbolsNextToModules' 설정을 통해 포함되는 경우가 아니면 디버거는 어떤 모듈에 대해서도 심볼을 로드하려고 시도하지 않습니다.
loadAllButExcluded 모드에 대한 속성
**moduleFilter.excludedModules**: 디버거가 심볼을 로드해서는 안 되는 모듈 배열입니다. 와일드카드(예: MyCompany.*.dll)가 지원됩니다.
loadOnlyIncluded 모드에 대한 속성
**moduleFilter.includedModules**: 디버거가 심볼을 로드해야 하는 모듈 배열입니다. 와일드카드(예: MyCompany.*.dll)가 지원됩니다.
**moduleFilter.includeSymbolsNextToModules**: `true`이면 'includedModules' 배열에 없는 모듈에 대해 디버거는 모듈 자체와 시작 실행 파일 옆을 계속 확인하지만, 심볼 검색 목록의 경로는 확인하지 않습니다. 이 옵션은 `true`로 기본 설정됩니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ✔️ `csharp.debug.symbolOptions` 아래
- `launchSettings.json` ❌
Source Link 옵션
Source Link는 다른 컴퓨터에서 빌드된 코드(예: NuGet 패키지에서 가져온 코드)를 디버깅할 때 디버거가 웹에서 다운로드하여 일치하는 소스 코드를 자동으로 가져올 수 있도록 하는 기능입니다. 이를 작동시키려면 디버깅 중인 코드의 .pdb 파일에는 DLL의 소스 파일을 디버거가 다운로드할 수 있는 URL에 매핑하는 데이터가 포함되어 있습니다. Source Link에 대한 자세한 내용은 https://aka.ms/SourceLinkSpec에서 확인할 수 있습니다.
`launch.json`의 `sourceLinkOptions` 요소는 URL별로 Source Link 동작을 사용자 정의할 수 있게 합니다. URL별 Source Link 옵션의 맵입니다. URL 이름에 와일드카드가 지원됩니다. 현재 유일한 사용자 정의는 해당 URL에 대해 Source Link가 활성화되었는지 여부이지만, 향후 더 많은 옵션이 추가될 수 있습니다.
예
"sourceLinkOptions": {
"https://raw.githubusercontent.com/*": { "enabled": true },
"*": { "enabled": false }
}
이 예는 GitHub URL에 대해 Source Link를 활성화하고 다른 모든 URL에 대해 Source Link를 비활성화합니다.
이 옵션의 기본값은 모든 URL에 대해 Source Link를 활성화하는 것입니다. 마찬가지로, `sourceLinkOptions` 맵에 규칙이 없는 URL의 경우 Source Link가 활성화됩니다.
모든 URL에 대해 Source Link를 비활성화하려면 `"sourceLinkOptions": { "*": { "enabled": false } }`를 사용합니다.
여러 항목이 동일한 URL을 다루는 경우 더 구체적인 항목(더 긴 문자열 길이를 가진 항목)이 사용됩니다.
현재 Source Link는 인증 없이 액세스할 수 있는 소스 파일에만 작동합니다. 따라서 예를 들어 디버거는 GitHub의 오픈 소스 프로젝트에서 소스 파일을 다운로드할 수 있지만, 개인 GitHub 리포지토리나 Visual Studio Team Services에서는 다운로드할 수 없습니다.
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ❌
대상 아키텍처 옵션 (macOS M1)
.NET on Apple M1은 x86_64 및 ARM64를 모두 지원합니다. 디버깅할 때 디버거가 연결하는 프로세스의 아키텍처와 디버거 아키텍처가 일치해야 합니다. 일치하지 않으면 `Unknown Error: 0x80131c3c`가 발생할 수 있습니다.
확장은 PATH의 `dotnet --info` 출력에 기반하여 `targetArchitecture`를 해결하려고 시도합니다. 그렇지 않으면 VS Code와 동일한 아키텍처를 사용하려고 시도합니다.
`launch.json`에서 `targetArchitecture`를 설정하여 이 동작을 재정의할 수 있습니다.
예
"targetArchitecture": "arm64"
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ❌
DevCert 확인
이 옵션은 시작 시 디버거가 HTTPS 엔드포인트에서 실행되는 웹 프로젝트를 개발하는 데 사용되는 자체 서명된 HTTPS 인증서가 컴퓨터에 있는지 확인해야 하는지 여부를 제어합니다. 이를 위해 `dotnet dev-certs https --check --trust`를 실행하려고 시도합니다. 인증서가 발견되지 않으면 사용자에게 하나를 생성하도록 제안하는 메시지가 표시됩니다. 사용자가 승인하면 확장 프로그램은 `dotnet dev-certs https --trust`를 실행하여 신뢰할 수 있는 자체 서명 인증서를 생성합니다.
지정되지 않은 경우, `serverReadyAction`이 설정된 경우 `true`로 기본 설정됩니다. 이 옵션은 Linux, VS Code 원격 및 VS Code for the Web 시나리오에서는 아무런 역할도 하지 않습니다.
`launch.json`에서 `checkForDevCert`를 `false`로 설정하여 이 동작을 재정의할 수 있습니다.
예
"checkForDevCert": "false"
사용 가능 여부
- `launch.json` ✔️
- `settings.json` ❌
- `launchSettings.json` ✔️ `useSSL`로