I'm working on a node project that I need to debug, but I didn't start it with the --inspect flag. Moreover, I'm using nodemon to restart node (which makes this process a little trickier).

UK EVENTAttend ffconf.org 2024

The conference for people who are passionate about the web. 8 amazing speakers with real human interaction and content you can't just read in a blog post or watch on a tiktok!

Finding the node process id

The first task is to find the node process id (aka PID). The way I do this when running with nodemon is to:

$ ps | grep nodemon | grep -v grep
 4359 ttys001    0:00.49 node /…/bin/nodemon
18357 ttys002    0:01.40 node /…/bin/nodemon --ignore public -i views

This command is doing three things:

  1. Listing all the processes running that I've started/own
  2. I'm grepping to filter only the lines that match "nodemon"
  3. Since the grep for nodemon was running, I need to filter out the word "grep" (using grep -v …)

There's other tools that you can install like pgrep and pidof - but I tend to find this is the friendliest method to finding the PID.

Now I know the PID (18357 for nodemon (in my case I have two different instances of nodemon, so I need to be savvy to work out exactly which I'm working with), I need to look at the process tree to find the PID of the child node process (this is because nodemon will spawn your node process, and I want to debug the child process, rather than nodemon itself).

$ ps -g 18357
  PID TTY           TIME CMD
18357 ttys002    0:01.40 node /…/bin/nodemon --ignore public -i views
67827 ttys002    0:02.41 /…/bin/node lib/index.js

The -g flag on ps asks for the group of subprocesses that my main nodemon process is responsible for. So now I can see the PID of my child node process (67827) and I'm ready to enable the debugger.

Turning on the debugger on a running node process

There's two ways to switch a node process into debugging mode. Using a small node script (and this should be cross compatible for all platforms). The process object in node has a _debugProcess(PID) method (which I think is undocumented though it's been around since at least mid-2014).

I'm running the node script as an inline eval'ed script:

$ node -e 'process._debugProcess(67827)'

Now my nodemon process emits the following log:

[nodemon] restarting due to changes...
[nodemon] starting `node lib/index.js`
listening on http://localhost:3009 @ 2018-03-03T12:29:58.675Z
Debugger listening on ws://127.0.0.1:9229/08eddfe1-9e9f-48bd-8d39-8225383ec206
For help see https://nodejs.org/en/docs/inspector
Debugger attached.

Turning now to Chrome devtools, I will find the green node debugging icon, then clicking on that will take me to devtools for the node process:

Node debugging icon

Alternative method

Another method to triggering the debugger is to send a SIGUSR1 signal to the PID (though I'm not entirely sure how to do this on Windows). This is done using the kill command as so:

$ kill -SIGUSR1 67827

I like this method just because it's just a little more succinct.