Debugging Guide: Enable Inspector
Debugging Guide: Enable Inspector
This guide will help you get started debugging your Node.js apps and scripts.
Enable Inspector
When started with the --inspect switch, a Node.js process listens for a debugging client.
By default, it will listen at host and port 127.0.0.1:9229. Each process is also assigned a
unique UUID.
Inspector clients must know and specify host address, port, and UUID to connect. A full URL
will look something like ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-
f63b0f33d55e.
Node.js will also start listening for debugging messages if it receives a SIGUSR1 signal.
(SIGUSR1 is not available on Windows.) In Node.js 7 and earlier, this activates the legacy
Debugger API. In Node.js 8 and later, it will activate the Inspector API.
Security Implications
Since the debugger has full access to the Node.js execution environment, a malicious actor
able to connect to this port may be able to execute arbitrary code on behalf of the Node
process. It is important to understand the security implications of exposing the debugger
port on public and private networks.
If the debugger is bound to a public IP address, or to 0.0.0.0, any clients that can reach your
IP address will be able to connect to the debugger without any restriction and will be able to
run arbitrary code.
See the section on 'Enabling remote debugging scenarios' on some advice on how to safely
allow remote debugger clients to connect.
Even if you bind the inspector port to 127.0.0.1 (the default), any applications running locally
on your machine will have unrestricted access. This is by design to allow local debuggers to
be able to attach conveniently.
Websites open in a web-browser can make WebSocket and HTTP requests under the
browser security model. An initial HTTP connection is necessary to obtain a unique
debugger session id. The same-origin-policy prevents websites from being able to make this
HTTP connection. For additional security against DNS rebinding attacks, Node.js verifies
that the 'Host' headers for the connection either specify an IP address
or localhostor localhost6 precisely.
These security policies disallow connecting to a remote debug server by specifying the
hostname. You can work-around this restriction by specifying either the IP address or by
using ssh tunnels as described below.
Inspector Clients
Several commercial and open source tools can connect to Node's Inspector. Basic info on
these follows:
node-inspect
Chrome DevTools 55+
Visual Studio 2017
Choose "Debug > Start Debugging" from the menu or hit F5.
Detailed instructions.
chrome-remote-interface
Gitpod
Start a Node.js debug configuration from the Debug view or hit F5. Detailed
instructions
Command-line options
The following table lists the impact of various runtime flags on debugging:
Flag Meaning
Enable inspector agent
--inspect Listen on default address and port (127.0.0.1:9229)
We recommend that you never have the debugger listen on a public IP address. If you need
to allow remote debugging connections we recommend the use of ssh tunnels instead. We
provide the following example for illustrative purposes only. Please understand the security
risk of allowing remote access to a privileged service before proceeding.
Let's say you are running Node on remote machine, remote.example.com, that you want to
be able to debug. On that machine, you should start the node process with the inspector
listening only to localhost (the default).
$ node --inspect server.js
Now, on your local machine from where you want to initiate a debug client connection, you
can setup an ssh tunnel:
$ ssh -L 9221:localhost:9229 [email protected]
This starts a ssh tunnel session where a connection to port 9221 on your local machine will
be forwarded to port 9229 on remote.example.com. You can now attach a debugger such
as Chrome DevTools or Visual Studio Code to localhost:9221, which should be able to
debug as if the Node.js application was running locally.
Legacy Debugger
The legacy debugger has been deprecated as of Node 7.7.0. Please use --inspect and
Inspector instead.
Built-in Debugger
Start node debug script_name.js to start your script under Node's builtin command-line
debugger. Your script starts in another Node process started with the --debug-brk option,
and the initial Node process runs the _debugger.js script and connects to your target.
node-inspector
Debug your Node.js app with Chrome DevTools by using an intermediary process which
translates the Inspector Protocol used in Chromium to the V8 Debugger protocol used in
Node.js.