Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

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