Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

node.js 디버깅에 ndb 사용하기

Scott Taylor가 만든 커맨드라인 node debugger인 ndb라는 프로젝트가 있습니다. 약간 사용해 보았는데 앞에 포스팅한 console로 디버깅할 때 아쉬운 부분은 비교적 간단하게 채워줄 수 있는것 같습니다.(물론 그외에도 많은 디버깅 도구들이 나와있는데 저도 하나씩 만져보는 지라 일단 ndb부터 포스팅합니다.)

node --debug[=port] NodeApp.js
node --debug-brk[=port] NodeApp.js

node.js에는 위와같은 디버그모드로 실행할 수 있는 옵션이 존재하고 있습니다. 이는 V8엔진에서 제공하는 디버깅으로 TCP포트로(기본은 5858입니다.) 원격디버거를 사용할 수 있도록 해줍니다.

--debug 옵션은 주어진 포스로 원격디버거 연결을 허용하고 정상적으로 애플리케이션을 시작합니다. 디버거가 Node 인스턴스에 연결되었을 때 스크립트는 Suspend 명령어를 만날때까지 실행됩니다.

--debug-brk 옵션은 스크립트가 디버거를 연결할 시간이 없을정도로 짧게 실행되거나 Node 애플리케이션의 실행을 시작부터 옵져빙할 필요가 있을때 상요합니다. 이 옵션은 강제적으로 메인스크립트의 첫줄에서 멈주고 디버거가 연결되기를 기다립니다. V8 엔진디비거는 require()메서드로 step over나 step into를 할때 그다지 좋은 수행을 하지 않는다고 표시되어있습니다.(아마 충돌이 발생할것입니다.) 그러므로 첫 breakpoint는 초기화 모듈이 로딩된 이후에 설정하는 것이 좋습니다.

ndb의 사용법은 아주 간단합니다. git clone http://github.com/smtlaissezfaire/ndb.git 명령어를 통해서 ndb의 소스코드를 내려받으면 ndb를 사용하기 위한 준비는 끝입니다. 예제 노드 코드는 아래와 같습니다.

var http = require("http"),
sys = require("sys"),
port = 8124,
host = "127.0.0.1",
arr = new Array("Outsider", "node.js");

http.createServer(function(req, res) {
    debugger; 
    res.writeHead(200, {"Content-Type": "text/plain"});
    res.end("Hello World\n");
}).listen(port, host);

console.log("Server running at http://127.0.0.1:8124/");

터미널에서 --debug모드로 노드앱을 실행한 화면

이제 node 코드를 디버그 모드로 실행(node --debug test.js)하면 위와같이 debugger가 5858포트에 대기중이라는 것을 알 수 있습니다.

ndb를 실행하여 명령어를 출력해 본 화면

이제 ndb를 내려받은 폴더로 이동해서 bin폴더 안에 있는 ndb를 실행( ./bin/ndb)하면 node debugger가 실행되고 연결이 됩니다. 실행되어 있는 디버깅모드의 노드인스턴스가 존재하지 않으면 디버거 연결에 실패합니다. ndb> REPL이 나타나면 정상적으로 연결이 된 것입니다. 잘못된 명령어를 실행하면 위와같이 사용할 수 있는 명령어 목록이 나타납니다. l(또는 list)를 실행하면 현재 디버거가 가리키는 위치가 나타나는데 위 화면에서는 아직 디버거가 어떤 breakpoint도 가르키지 않았으므로 위와같은 코드가 나타납니다.

위의 예제코드를 보면 8번라인에 debugger; 라는 코드를 볼 수 있습니다. 이부분이 breakpoint이고 이 코드부분은 웹브라우저에서 접속을 했을때만 실행되기 때문에 해당 URL에 접속을 하면 페이지가 완료되지 않고 breakpoint에서 멈추게 됩니다.(debugger;코드가 있다고 하더라도 ndb가 연결되어 있지 않으면 실행이 멈추지 않습니다. 아직 node.js에 대해서 많이 알지 못해서 debugger;라는 코드가 node.js에서 제공하는 것인지 ndb에서 제공하는 것인지는 모르겠습니다.)

ndb에서 debugger에 breakpoint가 멈춘 화면

이제 다시 ndb에 와보면 8번라인 Breakpoint에서 실행이 멎췄다는 것을 볼 수 있고 여기서 다시 list명령어를 실행하면 현재 ndb가 가리키고 있는 위치를 볼 수 있습니다.

next, step, stepout으로 디버깅하는 화면

ndb의 명령어인 next나 setp, setpout 같은 명령어를 사용하면 위 화면처럼 라인단위로 탐색을 하면서 디버깅을 할 수 있습니다. 현재 위치를 알려면 list명령어를 실행하면 됩니다.

eval 명령어를 이용해 변수를 출력해 보는 화면

디버깅을 하려면 값을 체크해봐야하기 때문에 평가명령어인 eval(혹은 e)를 사용하면 해당 변수들의 값을 확인해 볼 수 있습니다. 커맨드라인 툴이라서 아주 편한건 아니라 간단한 건 그냥 콘솔에 출력해서 하는게 더 편하긴 하는데 아주 간단하게 디버깅을 돌려 볼 수 있는 점은 좋네요.
2010/10/14 14:02 2010/10/14 14:02