VS Code에서 Node.js 디버깅
Visual Studio Code 편집기에는 Node.js 런타임에 대한 내장 디버깅 지원이 있으며, JavaScript, TypeScript 및 JavaScript로 변환되는 많은 다른 언어를 디버깅할 수 있습니다. Node.js 디버깅을 위한 프로젝트 설정은 VS Code가 적절한 시작 구성 기본값과 스니펫을 제공하므로 간단합니다.
VS Code에서 Node.js 프로그램을 디버깅하는 몇 가지 방법이 있습니다:
- VS Code의 통합 터미널에서 실행하는 프로세스를 디버깅하기 위해 자동 연결을 사용합니다.
- 통합 터미널을 사용하는 것과 유사한 JavaScript 디버그 터미널을 사용합니다.
- 프로그램을 시작하기 위해 시작 구성을 사용하거나, VS Code 외부에서 시작된 프로세스에 연결합니다.
자동 연결
자동 연결 기능이 활성화되면, Node 디버거는 VS Code의 통합 터미널에서 시작된 특정 Node.js 프로세스에 자동으로 연결됩니다. 이 기능을 활성화하려면, 명령 팔레트에서 자동 연결 전환 명령을 사용하거나(kb(workbench.action.showCommands)
), 이미 활성화된 경우 자동 연결 상태 표시줄 항목을 사용합니다.
자동 연결에는 세 가지 모드가 있으며, 결과로 나타나는 빠른 선택 메뉴와 debug.javascript.autoAttachFilter 설정을 통해 선택할 수 있습니다:
smart
-node_modules
폴더 외부에서 스크립트를 실행하거나 mocha 또는 ts-node와 같은 일반 '러너' 스크립트를 사용하는 경우, 해당 프로세스가 디버깅됩니다. 자동 연결 스마트 패턴 설정(debug.javascript.autoAttachSmartPattern
)을 사용하여 '러너' 스크립트 허용 목록을 구성할 수 있습니다.always
- 통합 터미널에서 시작된 모든 Node.js 프로세스가 디버깅됩니다.onlyWithFlag
---inspect
또는--inspect-brk
플래그로 시작된 프로세스만 디버깅됩니다.
자동 연결을 활성화한 후, 터미널의 오른쪽 상단에 있는 ⚠ 아이콘을 클릭하거나 새 터미널을 생성하여 터미널을 다시 시작해야 합니다. 그러면 디버거가 프로그램에 1초 이내에 연결됩니다:
자동 연결이 활성화되면, VS Code 창 하단의 상태 표시줄에 자동 연결
항목이 나타납니다. 이를 클릭하면 자동 연결 모드를 변경하거나 일시적으로 끌 수 있습니다. 일시적으로 자동 연결을 끄는 것은 디버깅이 필요 없는 일회성 프로그램을 실행할 때 유용하지만, 기능을 완전히 비활성화하고 싶지는 않을 때 유용합니다.
추가 구성
기타 시작 구성 속성
자동 연결에 launch.json에서 일반적으로 발견되는 기타 속성을 debug.javascript.terminalOptions 설정에 적용할 수 있습니다. 예를 들어, skipFiles에 Node 내부를 추가하려면 사용자 또는 작업 공간 설정에 다음을 추가할 수 있습니다:
"debug.javascript.terminalOptions": {
"skipFiles": [
"<node_internals>/**"
]
},
자동 연결 스마트 패턴
smart
자동 연결 모드에서 VS Code는 코드에 연결을 시도하며, 디버깅에 관심이 없는 빌드 도구에는 연결하지 않습니다. 이는 주요 스크립트를 글 로브 패턴 목록과 일치시켜 수행됩니다. 글로브 패턴은 debug.javascript.autoAttachSmartPattern 설정에서 구성할 수 있으며, 기본값은 다음과 같습니다:
[
"!**/node_modules/**", // node_modules 폴더의 스크립트 제외
"**/$KNOWN_TOOLS$/**", // 그러나 일부 일반 도구 포함
];
$KNOWN_TOOLS$
는 ts-node
, mocha
, ava
등과 같은 일반 '코드 러너' 목록으로 대체됩니다. 이러한 설정이 작동하지 않는 경우 이 목록을 수정할 수 있습니다. 예를 들어, mocha
를 제외하고 my-cool-test-runner
를 포함하려면 두 줄을 추가할 수 있습니다:
[
"!**/node_modules/**",
"**/$KNOWN_TOOLS$/**",
"!**/node_modules/mocha/**", // "!"를 사용하여 "mocha" node 모듈의 모든 스크립트 제외
"**/node_modules/my-cool-test-runner/**", // 사용자 정의 테스트 러너의 스크립트 포함
];
JavaScript 디버그 터미널
자동 연결과 유사하게, JavaScript 디버그 터미널은 그 안에서 실행하는 모든 Node.js 프로세스를 자동으로 디버깅합니다. Debug: Create JavaScript Debug Terminal 명령을 명령 팔레트에서 실행(kbs(workbench.action.showCommands)
)하거나 터미널 전환 드롭다운에서 JavaScript 디버그 터미널 생성을 선택하여 디버그 터미널을 생성할 수 있습니다.
추가 구성
기타 시작 구성 속성
디버그 터미널에 launch.json에서 일반적으로 발견되는 기타 속성을 debug.javascript.terminalOptions 설정에 적용할 수 있습니다. 예를 들어, skipFiles에 Node 내부를 추가하려면 사용자 또는 작업 공간 설정에 다음을 추가할 수 있습니다:
"debug.javascript.terminalOptions": {
"skipFiles": [
"<node_internals>/**"
]
},
시작 구성
시작 구성은 VS Code에서 디버깅을 설정하는 전통적인 방법이며, 복잡한 애플리케이션을 실행하기 위한 가장 많은 구성 옵션을 제공합니다.
이 섹션에서는 더 고급 디버깅 시나리오를 위한 구성 및 기능에 대해 자세히 설명합니다. 소스 맵, 외부 코드 건너뛰기, 원격 디버깅 등으로 디버깅하는 방법에 대한 지침을 찾을 수 있습니다.
소개 비디오를 보고 싶다면 VS Code에서 디버깅 시작하기를 참조하세요.
참고: VS Code를 처음 사용하는 경우, 디버깅 주제에서 일반적인 디버깅 기능과
launch.json
구성 파일 생성에 대해 배울 수 있습니다.
시작 구성 속성
디버깅 구성은 작업 공간의 .vscode
폴더에 위치한 launch.json
파일에 저장됩니다. 디버깅 구성 파일의 생성 및 사용에 대한 소개는 일반 디버깅 기사에서 확인할 수 있습니다.
아래는 Node.js 디버거에 특정한 일반 launch.json
속성의 참조입니다. 전체 옵션 세트는 vscode-js-debug 옵션 문서에서 확인할 수 있습니다.
다음 속성은 launch
및 attach
유형의 시작 구성에서 지원됩니다:
outFiles
- 생성된 JavaScript 파일을 찾기 위한 글로브 패턴 배열입니다. 소스 맵 섹션을 참조하세요.resolveSourceMapLocations
- 소스 맵이 파싱되어야 하는 위치에 대한 글로브 패턴 배열입니다. 소스 맵 섹션을 참조하세요.timeout
- 세션을 재시작할 때, 이 밀리초 수 후에 포기합니다. Node.js에 연결 섹션을 참조하세요.stopOnEntry
- 프로그램이 시작될 때 즉시 중단합니다.localRoot
- VS Code의 루트 디렉터리입니다. 아래 원격 디버깅 섹션을 참조하세요.remoteRoot
- Node의 루트 디렉터리입니다. 아래 원격 디버깅 섹션을 참조하세요.smartStep
- 소스 파일에 매핑되지 않는 코드를 자동으로 건너뛰도록 시도합니다. 아래 스마트 스텝 섹션을 참조하세요.skipFiles
- 이러한 글로브 패턴으로 덮인 파일을 자동으로 건너뜁니다. 아래 흥미롭지 않은 코드 건너뛰기 섹션을 참조하세요.trace
- 진단 출력을 활성화합니다.
이 속성은 요청 유형이 launch
인 시작 구성에서만 사용할 수 있습니다:
program
- 디버깅할 Node.js 프로그램의 절대 경로입니다.args
- 디버깅할 프로그램에 전달되는 인수입니다. 이 속성은 배열 유형이며 개별 인수를 배열 요소로 기대합니다.cwd
- 디버깅할 프로그램을 이 디렉터리에서 시작합니다.runtimeExecutable
- 사용할 런타임 실행 파일의 절대 경로입니다. 기본값은node
입니다. npm 및 기타 도구에 대한 시작 구성 지원 섹션을 참조하세요.runtimeArgs
- 런타임 실행 파일에 전달되는 선택적 인수입니다.runtimeVersion
- "nvm" (또는 "nvm-windows") 또는 "nvs"를 사용하여 Node.js 버전을 관리하는 경우, 이 속성을 사용하여 특정 Node.js 버전을 선택할 수 있습니다. 아래 다중 버전 지원 섹션을 참조하세요.env
- 선택적 환경 변수입니다. 이 속성은 문자열 유형의 키/값 쌍 목록으로 환경 변수를 기대합니다.envFile
- 환경 변수 정의가 포함된 파일의 선택적 경로입니다. 아래 외부 파일에서 환경 변수 로드 섹션을 참조하세요.console
- 프로그램을 실행할 콘솔(internalConsole
,integratedTerminal
,externalTerminal
). 아래 Node 콘솔 섹션을 참조하세요.outputCapture
-std
로 설정하면, 프로세스 stdout/stderr의 출력이 디버그 콘솔에 표시되며, 디버그 포트를 통해 출력을 수신하지 않습니다. 이는console.*
API를 사용하지 않고 stdout/stderr 스트림에 직접 쓰는 프로그램이나 로그 라이브러리에 유용합니다.
이 속성은 요청 유형이 attach
인 시작 구성에서만 사용할 수 있습니다:
restart
- 종료 시 연결을 재시작합니다. 아래 소스가 편 집될 때 디버그 세션 자동 재시작 섹션을 참조하세요.port
- 사용할 디버그 포트입니다. 아래 Node.js에 연결 및 원격 디버깅 섹션을 참조하세요.address
- 디버그 포트의 TCP/IP 주소입니다. 아래 Node.js에 연결 및 원격 디버깅 섹션을 참조하세요.processId
- 디버거는 USR1 신호를 보낸 후 이 프로세스에 연결하려고 시도합니다. 이 설정을 사용하면 디버그 모드로 시작되지 않은 이미 실행 중인 프로세스에 디버거가 연결할 수 있습니다.processId
속성을 사용할 때, 디버그 포트는 Node.js 버전(및 사용된 프로토콜)에 따라 자동으로 결정되며 명시적으로 구성할 수 없습니다. 따라서port
속성을 지정하지 마십시오.continueOnAttach
- 연결할 때 프로세스가 일시 중지된 경우 계속할지 여부입니다. 이 옵션은--inspect-brk
로 프로그램을 실행하는 경우 유용합니다.
일반 시나리오를 위한 시작 구성
launch.json
파일에서 IntelliSense(kb(editor.action.triggerSuggest)
)를 트리거하여 일반적으로 사용되는 Node.js 디버깅 시나리오에 대한 시작 구성 스니펫을 볼 수 있습니다.
또한 launch.json
편집기 창의 오른쪽 하단에 있는 구성 추가... 버튼을 클릭하여 스니펫을 가져올 수 있습니다.
다음 스니펫을 사용할 수 있습니다:
- 프로그램 시작: 디버그 모드에서 Node.js 프로그램을 시작합니다.
- npm을 통한 시작: npm 'debug' 스크립트를 통해 Node.js 프로그램을 시작합니다.
package.json
에 정의된 npm 디버그 스크립트를 시작 구성에서 사용할 수 있습니다. npm 스크립트에서 사용하는 디버그 포트는 스니펫에 지정된 포트와 일치해야 합니다. - 연결: 로컬에서 실행 중인 Node.js 프로그램의 디버그 포트에 연결합니다. 디버깅할 Node.js 프로그램이 디버그 모드에서 시작되었는지 확인하고, 사용되는 디버그 포트가 스니펫에 지정된 것과 동일한지 확인합니다.
- 원격 프로그램에 연결:
address
속성으로 지정된 호스트에서 실행 중인 Node.js 프로그램의 디버그 포트에 연결합니다. 디버깅할 Node.js 프로그램이 디버그 모드에서 시작되었는지 확인하고, 사용되는 디버그 포트가 스니펫에 지정된 것과 동일한지 확인합니다. VS Code가 작업 공간과 원격 호스트의 파일 시스템 간에 소스 파일을 매핑할 수 있도록 하려면localRoot
및remoteRoot
속성에 대한 올바른 경로를 지정해야 합니다. - 프로세스 ID로 연결: 디버깅을 위해 노드 또는 gulp 프로세스를 선택할 수 있는 프로세스 선택기를 엽니다. 이 시작 구성으로 디버그 모드에서 시작되지 않은 노드 또는 gulp 프로세스에 연결할 수도 있습니다.
- Nodemon 설정: JavaScript 소스가 변경될 때마다 디버그 세션을 자동으로 다시 시작하기 위해 nodemon을 사용합니다. nodemon이 전역적으로 설치되어 있는지 확인하세요. 디버그 세션을 종료하면 디버깅할 프로그램만 종료되며, nodemon 자체는 종료되지 않습니다. nodemon을 종료하려면 통합 터미널에서
kbstyle(Ctrl+C)
를 누르세요. - Mocha 테스트: 프로젝트의
test
폴더에서 mocha 테스트를 디버깅합니다. 프로젝트의node_modules
폴더에 'mocha'가 설치되어 있는지 확인하세요. - Yeoman 생성기: yeoman 생성기를 디버깅합니다. 스니펫에서 생성기 이름을 지정하라는 메시지가 표시됩니다. 프로젝트의
node_modules
폴더에 'yo'가 설치되어 있고, 생성된 프로젝트가 디버깅을 위해npm link
를 실행하여 설치되었는지 확인하세요. - Gulp 작업: gulp 작업을 디버깅합니다. 프로젝트의
node_modules
폴더에 'gulp'가 설치되어 있는지 확인하세요. - Electron 메인: Electron 애플리케이션의 주요 Node.js 프로세스를 디버깅합니다. 스니펫은 Electron 실행 파일이 작업 공간의
node_modules/.bin
디렉터리에 설치되어 있다고 가정합니다.
Node 콘솔
기본적으로 Node.js 디버그 세션은 대상을 내부 VS Code 디버그 콘솔에서 시작합니다. 디버그 콘솔은 콘솔에서 입력을 읽어야 하는 프로그램을 지원하지 않으므로, console
속성을 externalTerminal
또는 integratedTerminal
로 설정하여 외부 터미널을 활성화하거나 VS Code 통합 터미널을 사용할 수 있습니다. 기본값은 internalConsole
입니다.
외부 터미널에서는 terminal.external.windowsExec
, terminal.external.osxExec
, 및 terminal.external.linuxExec
설정을 통해 사용할 터미널 프로그램을 구성할 수 있습니다.
npm 및 기타 도구에 대한 시작 구성 지원
Node.js 프로그램을 node로 직접 실행하는 대신, 시작 구성에서 'npm' 스크립트나 기타 작업 실행 도구를 직접 사용할 수 있습니다:
runtimeExecutable
속성에 대해 PATH에서 사용할 수 있는 모든 프로그램(예: 'npm', 'mocha', 'gulp' 등)을 사용할 수 있으며, 인수는runtimeArgs
를 통해 전달할 수 있습니다.- npm 스크립트나 기타 도구가 암묵적으로 시작할 프로그램을 지정하는 경우
program
속성을 설정할 필요가 없습니다.
'npm' 예제를 살펴보겠습니다. package.json
에 'debug' 스크립트가 있는 경우, 예를 들어:
"scripts": {
"debug": "node myProgram.js"
},
해당하는 시작 구성은 다음과 같이 보일 것입니다:
{
"name": "npm을 통한 시작",
"type": "node",
"request": "launch",
"cwd": "$\{workspaceFolder\}
",
"runtimeExecutable": "npm",
"runtimeArgs": [
"run-script", "debug"
],
}
다중 버전 지원
'nvm' (또는 'nvm-windows')를 사용하여 Node.js 버전을 관리하는 경우, 특정 Node.js 버전을 선택하기 위해 시작 구성에서 runtimeVersion
속성을 지정할 수 있습니다:
{
"type": "node",
"request": "launch",
"name": "테스트 시작",
"runtimeVersion": "14",
"program": "$\{workspaceFolder\}
/test.js"
}
'nvs'를 사용하여 Node.js 버전을 관리하는 경우, runtimeVersion
속성을 사용하여 특정 버전, 아키텍처 및 Node.js의 맛을 선택할 수 있습니다. 예를 들어:
{
"type": "node",
"request": "launch",
"name": "테스트 시작",
"runtimeVersion": "chackracore/8.9.4/x64",
"program": "$\{workspaceFolder\}
/test.js"
}
runtimeVersion
속성과 함께 사용할 Node.js 버전을 설치해야 하며, 이 기능은 버전을 자동으로 다운로드하고 설치하지 않습니다. 예를 들어, "runtimeVersion": "7.10.1"
을 시작 구성에 추가할 계획이라면 통합 터미널에서 nvm install 7.10.1
또는 nvs add 7.10.1
과 같은 명령을 실행해야 합니다.
마이너 및 패치 버전을 생략하고 예를 들어 "runtimeVersion": "14"
로 설정하면, 시스템에 설치된 가장 최근의 14.x.y
버전이 사용됩니다.
외부 파일에서 환경 변수 로드
VS Code Node 디버거는 파일에서 환경 변수를 로드하고 이를 Node.js 런타임에 전달하는 것을 지원합니다. 이 기능을 사용하려면, 시작 구성에 envFile
속성을 추가하고 환경 변수가 포함된 파일의 절대 경로를 지정합니다:
//...
"envFile": "$\{workspaceFolder\}
/.env",
"env": { "USER": "john doe" }
//...
env
사전에서 지정된 모든 환경 변수는 파일에서 로드된 변수를 덮어씁니다.
다음은 .env
파일의 예입니다:
USER=doe
PASSWORD=abc123
# 주석 \{#a-comment}
# 빈 값: \{#an-empty-value}
empty=
# 따옴표로 묶인 문자열에서 확장된 새 줄: \{#new-lines-expanded-in-quoted-strings}
lines="foo\nbar"
Node.js에 연결
VS Code 디버거를 외부 Node.js 프로그램에 연결하려면, Node.js를 다음과 같이 실행합니다:
node --inspect program.js
또는 프로그램이 실행되지 않고 디버거가 연결될 때까지 기다려야 하는 경우:
node --inspect-brk program.js
디버거를 프로그램에 연결하는 옵션:
- 모든 잠재적 후보 프로세스를 나열하는 "프로세스 선택기"를 열고 하나를 선택하거나
- 모든 구성 옵션을 명시적으로 지정하는 "연결" 구성을 생성한 후 F5를 누릅니다.
이 옵션들을 자세히 살펴보겠습니다: