Using Node Inspector with multiple node processes - node.js

I started using Node Inspector to debug some of my Node applications. However, one thing i am not sure how to do is, once Node-inspector is attached to one Node app, how to detach and attach it to another Node app running on same box?
How can I debug multiple processes at the same time?

Update:
If you are reading this in 2019, the below answer is out of date. You'd probably want to check out the current documentation or follow gtzilla answer:
https://nodejs.org/en/docs/guides/debugging-getting-started/
First, start your node programs with different debug ports like so:
$ node script1.js --debug==5858
$ node script2.js --debug==5859
Then start node-inspector
$ node-inspector &
and open the web console in two tabs with
http://localhost:8080/debug?port=5858
http://localhost:8080/debug?port=5859

As mentionned https://stackoverflow.com/a/18911247/1301197 you can specify a port with
node --inspect=7000 --inspect-brk app1.js
Then of course you just to specify a different port for each node server
node --inspect=7001 --inspect-brk app2.js

Attach the debugger
Either by port or by process id. For ports, use a different port for each process. On the command line:
node --inspect 8085 some_script_1.js
node --inspect 8086 some_script_2.js
node --inspect 9012 some_script_3.js
In a separate terminal window, you can attach to any of these processes with node inspect <host>:<port>. For example to attach to some_script_2.js on port 8086
node inspect 127.0.0.1:8086
Attaching to different processes is matter of changing the port, for example 9012 you would run
node inspect 127.0.0.1:9012
If you didn't start node on a separate, known port, you can also use the -p flag to attach directly to an existing process
node inspect -p <node_script_process_id>
On Linux and Mac OS use ps -A | grep node to find node process ids. Once a process is started, you can also attach the inspector by sending signal to the node process SIGUSR1 Reference
The node-inspect program (source) is separate from core node. Though it is bundled with nodejs. Node inspect reimplements node debug to address a limitation
For Chrome inspector protocol, there's only one: node --inspect ... This project tries to provide the missing second option by re-implementing node debug against the new protocol.
Debugger API documenation
Additional Ways to Attach Debugger
https://nodejs.org/en/docs/guides/debugging-getting-started/
You can view an interact with the debugger in Chrome. Just add additional connections under the Connections tab of the dedicated NodeJS DevTools window.
Similar, but Separate, Projects
Worth noting there is a similar project, now deprecated, that is called node-inspector, which is separate from node-inspect Tested October, 2018 with node v10.11.0

If you use Chrome, then you can also use devtools directly with url like:
devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/0cc79945-8386-4082-aabb-328341bfc953
*where 9229/0cc79945-8386-4082-aabb-328341bfc953 - part can be taken from node's output
For example, run first app with:
$ node --inspect-brk=7777 app.js
Debugger listening on ws://127.0.0.1:7777/2df21a01-44ff-40c4-b6ff-1f839f81f9d6
and so the result url will be:
devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:7777/2df21a01-44ff-40c4-b6ff-1f839f81f9d6
then run second app instance with:
$ node --inspect-brk=7778 app.js
Debugger listening on ws://127.0.0.1:7778/d4e8d8ce-abe9-46c6-89b1-ad0616bdf237
and open it with:
devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:7778/d4e8d8ce-abe9-46c6-89b1-ad0616bdf237

Related

How do I use the `node inspect` debugger on an application that uses standard input?

I'm trying to track down the source of an error in a Node application that doesn't come with a stack trace.
The node inspect debugger supports a breakOnException command that I think will help me.
But my application needs to take input from standard input before it produces the error I am looking for, and node inspect seems to leave my standard input going to a persistent debug> prompt even afrer I continue, when the application being debugged is running and not paused. This is unlike gdb, where when you continue the debugger prompt goes away and you need to pause the application with Ctrl+C to get it back.
How do I make node inspect's prompt go away so I can type input into the application being debugged? Alternately, if I run the application under node --inspect for remote debugging, how can I connect to a remote debugging session on the command line?
I know that a browser or an IDE like VSCode can connect to a remote NodeJS inspection session, but I can't seem to find a way to connect with the command-line debugger that is built in to node.
node inspect --help doesn't document this at all, but if you launch one Node process with node --inspect, you can attach the built-in CLI debugger using the secret -p <PID> option. Someone on Medium figured this out, and did not give a source. It's also mentioned in this answer about debugging servers.
So, start your app:
$ node --inspect whatever.js arg arg arg
Debugger listening on ws://127.0.0.1:9229/47219dfa-1b9b-40f8-92a9-0fc670bb2e0b
...
Then work out its PID:
$ pgrep -f "node --inspect"
12345
And then attach:
$ node inspect -p 12345
connecting to 127.0.0.1:9229 ... ok
debug>

Chrome does not detect debugger if attached after process start

When I start an Express server with the --inspect option, I can navigate to chrome://inspect/#devices and launch a debug console for the appropriate Remote Target. But, when I start the process without the --inspect option, then try to initiate the inspector with kill -10 $PID, Chrome does not detect the Remote Target, even though the server indicates that the debugger was started. Is there anything I can do to connect to this process by Chrome or some other means?
This is the output from the server after running kill -10 $PID:
Attaching to nodejs
nodejs | Running version 3 on http://0.0.0.0:5000
nodejs | Debugger listening on ws://127.0.0.1:9229/c948d085-0491-4cd9-9832-a0f0cf120e11
nodejs | For help, see: https://nodejs.org/en/docs/inspector
Another note: I am running this app in a container with a Docker bridge network, but I don't see why that should make a difference because the --inspect option registers the same output when I start the server with it.
Versions:
Docker version 19.03.13, build 4484c46d9d
Node v12.22.1
express#4.17.1
Additional note: the procedure I'm describing (starting debug session after server start) is described here: nodejs.org/en/docs/guides/debugging-getting-started
But, when I start the process without the --inspect option, Chrome does not detect the Remote Target
If you started a process without --inspect it is expected that you won't be able to debug your code. Make sure that that logs you are talking about are the latest and some junk from past runs before you removed --inspect flag

How to debug two node applications at same time using node's built-in debugger?

I debug my node applications by executing node debug app in my application folder.However if i want to use the same with other application at same time it shows me error.
How can i use debug with the other application too?
Node's default debug port is being used by the first process. Start your second app specifying another port using the --debug-brk or the --debug flag like this:
node --debug-brk=5859 app.js
Then open another terminal window and connect to the second process's debugging port using:
node debug localhost:5859

Node-Inspector Failed to open socket

I am following the directions here: https://github.com/node-inspector/node-inspector
Pretty simple. npm install node-inspector. In one shell run node-inspector and in another run node --debug app.js. Shell spits out an localhost address with specific port for the debugger. Open that address in a browser — it loads your code. From there add breakpoints, debug network, etc..
But this does not work.
The following message endlessly logs in my shell:
Failed to open socket on port 5858, waiting 1000 ms before retrying
..and no connection is made.
So my question is has anyone had this problem and successfully found a solution. Would love to get this working, would be super useful. My only experience in server-side debuggers is Ruby's Byebug which was a piece of cake to set up.
The message you see is printed because there is another process listening on port 5858. Either a different application, or simply another instance of a node process under the debugger.
An update based on comments below this answer
If your application is running in a cluster mode via Node.js core module "cluster", then you end up with multiple worker processes, where each of them is trying to listen on port 5858.
Node Inspector cannot debug multiple worker processes at the same time. You have to pick one process and enable the debugger in that process only. When you start the app via node --debug, all processes try to enable the debugger, therefore you cannot use this command.
Instead, you have to:
Start your app without the debugger enabled.
Then you need to find the pid (process id) of the worker process you would like to debug.
Once you have the PID, you need to enable the debugger in the target process. You can run kill -1 <pid> on UNIX, or use node debug -p <pid> that works on all platforms. Don't forget to exit node debug before proceeding further.
Once the target process has debugger listening on 5858, you can start Node Inspector the usual way.
My answer is based on the following blog post: https://strongloop.com/strongblog/whats-new-nodejs-v0-12-debugging-clusters/, check it out for more details.

debugging node.js with node-inspector

I'm trying to debug my nodejs app using node-inspector. But Google Chrome doesn't show the code.
I'm using the following,
Node.js : v0.10.26
Express : 4.0.0
Node Inspector : v0.7.3
Google Chrome version : 34.0.1847.131
This is what I'm doing to start the debugger..
$ node-inspector
Node Inspector v0.7.3
Visit http://127.0.0.1:8080/debug?port=5858 to start debugging.
In another console,
$ node --debug app.js
debugger listening on port 5858
$
Then started Google Chrome and went to
http://127.0.0.1:8080/debug?port=5858
It opens up node-inspector but without any code..all windows are empty.
Noticed that I'm not getting 'Express server listening on port 3000'
Tried all as per node-inspector fails to connect to node but no luck
Couldn't work out what I'm missing. Would be great of you have any suggestions..so I can debug my Node.js apps in Google Chrome.
Try to run node --debug-brk app.js instead of just --debug. Your application may not be pausing before node inspector hooks into the node process. Using --debug-brk will force node to break on the first line of your app and wait for a debugger to attach to the process. Loading the node-inspector web interface is what causes node-inspector to attach to your node process; that's why you include the node debug port in the query string (localhost:8080/debug?port=5858). You're telling node-inspector what port it should reach out and attach to.
Here's an animated gif I put together showing a complete install and run of node-inspector.
In the gif I use the --debug flag because I'm not debugging any code that runs right at startup. I'm debugging inside a request handler, which only fires when the page is requested. Thus, refreshing the page causes node-inspector to break on that line.
I also put together a 15 minute YouTube tutorial a while ago.
http://youtu.be/03qGA-GJXjI
node-inspector by default tries to pre-load all the code before initiating the debug window. I have had instances, node-inspector just hangs for ever because of this pre-loading. Luckily the newer versions have an option to stop the pre-load thereby making the inspector load faster.
Try node-inspector --no-preload
Standard remote debugging is broken entirely in node 6.5. It's replaced however by a new internal node feature
$ node --inspect --debug-brk build/server/server.js
Debugger listening on port 9229.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome:
chrome-devtools://devtools/remote/serve_file/#62cd277117e6f8ec53e31b1be58290a6f7ab42ef/inspector.html?experiments=true&v8only=true&ws=localhost:9229/node
Debugger attached.
See here - http://arveknudsen.com/?p=346%3Fpage_id%3D346&print=pdf - for more info
--debug-brk is now deprecated
try node --inspect-brk <your starting file name>
and then go to chrome and type url
chrome://inspect and click on Open dedicated DevTools for Node,
the debugger will start, no need of node-inspector
On the left of Node Inspector, "Sources" tab, there is "a box with a triangle in it" - highlighting says "Show Navigator". (See it in the picture above). Open that to find the files you want to debug, and put a break point on code that has yet to run.
Also note, if you want to debug code that runs on starting node, you'll need to use the --debug-brk option when starting. Then, in Node Inspector, you you'll have to kick off the app (F8 to run all). You'll need this option if you want to debug all the initialization code, like starting a web browser.
node-debug --no-preload app.js
This what's working for me. Accoriding to this:
My script runs too fast to attach the debugger.
The debugged process must be started with --debug-brk, this way the
script is paused on the first line.
Note: node-debug adds this option for you by default.

Resources