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:
-
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
You need to send kill -s USR1 on process2
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:
- open /usr/lib/meteor/app/meteor/run.js
-
before
nodeOptions.push(path.join(options.bundlePath, 'main.js'));
add
nodeOptions.push('--debug');
Here are additional practical steps for your to attach debugger eclipse:
- use '--debug-brk' instead of '--debug' here, because it's easier for me to attach node.js using eclipse as debugger.
- add 'debugger;' in the code where you want to debug.(I prefer this way personally)
- run meteor in console
- attach to node.js in eclipse(V8 tools, attach to localhost:5858)
- 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.