node --debug[=port] NodeApp.js
node --debug-brk[=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는 초기화 모듈이 로딩된 이후에 설정하는 것이 좋습니다.
--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/");
이제 node 코드를 디버그 모드로 실행(node --debug test.js)하면 위와같이 debugger가 5858포트에 대기중이라는 것을 알 수 있습니다.
이제 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에 와보면 8번라인 Breakpoint에서 실행이 멎췄다는 것을 볼 수 있고 여기서 다시 list명령어를 실행하면 현재 ndb가 가리키고 있는 위치를 볼 수 있습니다.
ndb의 명령어인 next나 setp, setpout 같은 명령어를 사용하면 위 화면처럼 라인단위로 탐색을 하면서 디버깅을 할 수 있습니다. 현재 위치를 알려면 list명령어를 실행하면 됩니다.
디버깅을 하려면 값을 체크해봐야하기 때문에 평가명령어인 eval(혹은 e)를 사용하면 해당 변수들의 값을 확인해 볼 수 있습니다. 커맨드라인 툴이라서 아주 편한건 아니라 간단한 건 그냥 콘솔에 출력해서 하는게 더 편하긴 하는데 아주 간단하게 디버깅을 돌려 볼 수 있는 점은 좋네요.
npm install -g ndb로 인스톨했는데 안돼네요.
Error: require.paths is removed. Use node_modules folders, or the NODE_PATH environment variable instead.
at Function.Object.defineProperty.get (module.js:388:11)
at Object.<anonymous> (/usr/local/lib/node_modules/ndb/bin/ndb:4:8)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:901:3
Hong-Jun-Choiui-MacBook-Pro:Desktop teemo$
export NODE_PATH="/usr/local/lib/node_modules/"
이렇게도 수행해주었어요.
git clone http://github.com/smtlaissezfaire/ndb.git
로 복제한것도 같은증상이예요 ㅠㅠ
오류메시지에 나온대로 node.js버전이 올라가면서 require.path라는 메서드가 사라져서 그렇습니다. NODE_PATH로 ndb아래에 lib 폴더를 지정해 주시면 될것 같은데요...
ndb는 1년이상 커밋이 없어서 더이상 개발되지 않는것 같은데 node-inspector등을 더 추천드립니다.