Skip to content

디버거

[안정적: 2 - 안정적]

안정적: 2 안정성: 2 - 안정적

Node.js에는 명령줄 디버깅 유틸리티가 포함되어 있습니다. Node.js 디버거 클라이언트는 모든 기능을 갖춘 디버거는 아니지만, 간단한 단계별 실행 및 검사는 가능합니다.

사용하려면 inspect 인수와 함께 디버깅할 스크립트의 경로를 지정하여 Node.js를 시작합니다.

bash
$ node inspect myscript.js
< Debugger listening on ws://127.0.0.1:9229/621111f9-ffcb-4e82-b718-48a145fa5db8
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
<
 ok
Break on start in myscript.js:2
  1 // myscript.js
> 2 global.x = 5;
  3 setTimeout(() => {
  4   debugger;
debug>

디버거는 첫 번째 실행 가능한 줄에서 자동으로 중단됩니다. 대신 첫 번째 중단점( debugger 문으로 지정)까지 실행하려면 NODE_INSPECT_RESUME_ON_START 환경 변수를 1로 설정합니다.

bash
$ cat myscript.js
// myscript.js
global.x = 5;
setTimeout(() => {
  debugger;
  console.log('world');
}, 1000);
console.log('hello');
$ NODE_INSPECT_RESUME_ON_START=1 node inspect myscript.js
< Debugger listening on ws://127.0.0.1:9229/f1ed133e-7876-495b-83ae-c32c6fc319c2
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
<
< hello
<
break in myscript.js:4
  2 global.x = 5;
  3 setTimeout(() => {
> 4   debugger;
  5   console.log('world');
  6 }, 1000);
debug> next
break in myscript.js:5
  3 setTimeout(() => {
  4   debugger;
> 5   console.log('world');
  6 }, 1000);
  7 console.log('hello');
debug> repl
Press Ctrl+C to leave debug repl
> x
5
> 2 + 2
4
debug> next
< world
<
break in myscript.js:6
  4   debugger;
  5   console.log('world');
> 6 }, 1000);
  7 console.log('hello');
  8
debug> .exit
$

repl 명령어를 사용하면 코드를 원격으로 평가할 수 있습니다. next 명령어는 다음 줄로 이동합니다. 사용 가능한 다른 명령어를 보려면 help를 입력하십시오.

명령어를 입력하지 않고 Enter 키를 누르면 이전 디버거 명령어가 반복됩니다.

감시자

디버깅 중에 표현식 및 변수 값을 감시할 수 있습니다. 각 중단점에서 감시자 목록의 각 표현식은 현재 컨텍스트에서 평가되고 중단점의 소스 코드 목록 바로 앞에 표시됩니다.

표현식 감시를 시작하려면 watch('my_expression')을 입력합니다. watchers 명령은 활성 감시자를 출력합니다. 감시자를 제거하려면 unwatch('my_expression')을 입력합니다.

명령 참조

단계별 실행

  • cont, c: 실행 계속
  • next, n: 다음 단계
  • step, s: 안으로 단계 진입
  • out, o: 밖으로 단계 진입
  • pause: 실행 중인 코드 일시 중지 (개발자 도구의 일시 중지 버튼과 같음)

중단점

  • setBreakpoint(), sb(): 현재 줄에 중단점 설정
  • setBreakpoint(line), sb(line): 특정 줄에 중단점 설정
  • setBreakpoint('fn()'), sb(...): 함수 본문의 첫 번째 문장에 중단점 설정
  • setBreakpoint('script.js', 1), sb(...): script.js의 첫 번째 줄에 중단점 설정
  • setBreakpoint('script.js', 1, 'num < 4'), sb(...): num < 4true로 평가될 때만 중단되는 script.js의 첫 번째 줄에 조건부 중단점 설정
  • clearBreakpoint('script.js', 1), cb(...): script.js의 1번 줄에 있는 중단점 삭제

아직 로드되지 않은 파일(모듈)에 중단점을 설정하는 것도 가능합니다.

bash
$ node inspect main.js
< Debugger listening on ws://127.0.0.1:9229/48a5b28a-550c-471b-b5e1-d13dd7165df9
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
<
Break on start in main.js:1
> 1 const mod = require('./mod.js');
  2 mod.hello();
  3 mod.hello();
debug> setBreakpoint('mod.js', 22)
Warning: script 'mod.js' was not loaded yet.
debug> c
break in mod.js:22
 20 // USE OR OTHER DEALINGS IN THE SOFTWARE.
 21
>22 exports.hello = function() {
 23   return 'hello from module';
 24 };
debug>

주어진 표현식이 true로 평가될 때만 중단되는 조건부 중단점을 설정하는 것도 가능합니다.

bash
$ node inspect main.js
< Debugger listening on ws://127.0.0.1:9229/ce24daa8-3816-44d4-b8ab-8273c8a66d35
< For help, see: https://nodejs.org/en/docs/inspector
<
connecting to 127.0.0.1:9229 ... ok
< Debugger attached.
Break on start in main.js:7
  5 }
  6
> 7 addOne(10);
  8 addOne(-1);
  9
debug> setBreakpoint('main.js', 4, 'num < 0')
  1 'use strict';
  2
  3 function addOne(num) {
> 4   return num + 1;
  5 }
  6
  7 addOne(10);
  8 addOne(-1);
  9
debug> cont
break in main.js:4
  2
  3 function addOne(num) {
> 4   return num + 1;
  5 }
  6
debug> exec('num')
-1
debug>

정보

  • backtrace, bt: 현재 실행 프레임의 백트레이스 출력
  • list(5): 5줄의 컨텍스트(앞뒤 5줄)를 포함하여 스크립트 소스 코드 목록 표시
  • watch(expr): 감시 목록에 표현식 추가
  • unwatch(expr): 감시 목록에서 표현식 제거
  • unwatch(index): 특정 인덱스의 표현식을 감시 목록에서 제거
  • watchers: 모든 감시자와 해당 값 목록(각 중단점에서 자동으로 목록 표시)
  • repl: 디버깅 스크립트의 컨텍스트에서 평가를 위한 디버거의 repl 열기
  • exec expr, p expr: 디버깅 스크립트의 컨텍스트에서 표현식을 실행하고 값을 출력
  • profile: CPU 프로파일링 세션 시작
  • profileEnd: 현재 CPU 프로파일링 세션 중지
  • profiles: 완료된 모든 CPU 프로파일링 세션 목록
  • profiles[n].save(filepath = 'node.cpuprofile'): CPU 프로파일링 세션을 JSON으로 디스크에 저장
  • takeHeapSnapshot(filepath = 'node.heapsnapshot'): 힙 스냅샷을 찍어 JSON으로 디스크에 저장

실행 제어

  • run: 스크립트 실행(디버거 시작 시 자동 실행)
  • restart: 스크립트 다시 시작
  • kill: 스크립트 종료

기타

  • scripts: 로드된 모든 스크립트 목록
  • version: V8 버전 표시

고급 사용법

Node.js를 위한 V8 인스펙터 통합

V8 인스펙터 통합을 통해 디버깅 및 프로파일링을 위해 Chrome 개발자 도구를 Node.js 인스턴스에 연결할 수 있습니다. Chrome 개발자 도구 프로토콜을 사용합니다.

V8 인스펙터는 Node.js 애플리케이션을 시작할 때 --inspect 플래그를 전달하여 활성화할 수 있습니다. 이 플래그를 사용하여 사용자 지정 포트를 지정할 수도 있습니다. 예를 들어 --inspect=9222는 9222번 포트에서 DevTools 연결을 허용합니다.

--inspect 플래그를 사용하면 디버거가 연결되기 전에 코드가 즉시 실행됩니다. 즉, 디버깅을 시작하기 전에 코드가 실행되기 시작하므로 처음부터 디버깅하려는 경우 이상적이지 않을 수 있습니다.

이러한 경우 두 가지 대안이 있습니다.

따라서 --inspect, --inspect-wait, --inspect-brk 중에서 선택할 때 코드를 즉시 실행할지, 실행 전에 디버거가 연결될 때까지 기다릴지, 아니면 단계별 디버깅을 위해 첫 번째 줄에서 중단할지를 고려해야 합니다.

bash
$ node --inspect index.js
Debugger listening on ws://127.0.0.1:9229/dc9010dd-f8b8-4ac5-a510-c1a114ec7d29
For help, see: https://nodejs.org/en/docs/inspector

(위 예에서 URL 끝의 UUID dc9010dd-f8b8-4ac5-a510-c1a114ec7d29는 동적으로 생성되며, 다른 디버깅 세션에서는 다릅니다.)

Chrome 브라우저 버전이 66.0.3345.0보다 오래된 경우 위 URL에서 js_app.html 대신 inspector.html을 사용하십시오.

Chrome 개발자 도구는 아직 워커 스레드 디버깅을 지원하지 않습니다. ndb를 사용하여 디버깅할 수 있습니다.