Meteor: Debug on server side

Does anyone know a good method to debug server side code? I tried enable Node.js debug then use node-inspector but it does not show any of my code.

I end up using console.log but this is very inefficient.

Update: I found the following procedure works on my Linux machine:

  1. When you run Meteor, it will spawn two processes

    process1: /usr/lib/meteor/bin/node /usr/lib/meteor/app/meteor/meteor.js

    process2: /usr/lib/meteor/bin/node /home/paul/codes/bbtest_code/bbtest02/.meteor/local/build/main.js --keepalive

  2. You need to send kill -s USR1 on process2

  3. Run node-inspector and you can see your server code

On my first try, I modify the last line on meteor startup script in /usr/lib/meteor/bin/meteor to

exec "$DEV_BUNDLE/bin/node" $NODE_DEBUG "$METEOR" "$@"

and run NODE_DEBUG=--debug meteor on command prompt. This only put --debug flag on process1 so I only see meteor files on node-inspector and could not find my code.

Can someone check this on Windows and Mac machine?


In Meteor 0.5.4 this has become a lot easier:

First run the following commands from the terminal:

npm install -g node-inspector
node-inspector &
export NODE_OPTIONS='--debug-brk'
meteor

And then open http://localhost:8080 in your browser to view the node-inspector console.

Update

Since Meteor 1.0 you can just type

meteor debug

which is essentially a shortcut for the above commands, and then launch node inspector in your browser as mentioned.

Update

In Meteor 1.0.2 a console or shell has been added. It may come in handy to output variables and run commands on the server:

meteor shell

Meteor apps are Node.js apps. When running a Meteor app with the meteor [run] command, you can configure the NODE_OPTIONS environment variable to start node in debug mode.

Examples of NODE_OPTIONS environment variable values:

  • --debug
  • --debug=47977 - specify a port
  • --debug-brk - break on the first statement
  • --debug-brk=5858 - specify a port and break on the first statement

If you export NODE_OPTIONS=--debug, all meteor command run from the same shell will inherit the environment variable. Alternatively, you can enable debugging just for one run, with NODE_OPTIONS="--debug=47977" meteor.

To debug, run node-inspector in a different shell, then go to http://localhost:8080/debug?port=<the port you specified in NODE_OPTIONS>, regardless of what node-inspector tells you to run.


To start node.js in debug mode, I did it this way:

  1. open /usr/lib/meteor/app/meteor/run.js
  2. before

    nodeOptions.push(path.join(options.bundlePath, 'main.js')); 
    

    add

    nodeOptions.push('--debug');
    

Here are additional practical steps for your to attach debugger eclipse:

  1. use '--debug-brk' instead of '--debug' here, because it's easier for me to attach node.js using eclipse as debugger.
  2. add 'debugger;' in the code where you want to debug.(I prefer this way personally)
  3. run meteor in console
  4. attach to node.js in eclipse(V8 tools, attach to localhost:5858)
  5. run, wait for debugger to be hit

when you start meteor in your meteor app folder, you'll see that "debugger listening on port 5858" in console.