Debug a Node.js process anywhere using chrome://inspect
or node-inspect
node debug port 9229 | ⟷ | sandbox debug client | ⟷ | sandbox debug broker |
---|
Interactive debugging using inspect, debug the same way you do with a local process.
Supports a Node.js process running
- on a machine you can't ssh / don't have access to
- in a Docker Container with no exposed ports
- on Travis CI
- on Github Actions
- on Bitbucket Pipelines
- on GitLab CI/CD
- on AWS CodeBuild
- on AWS Lambda
- on Heroku
- on Runkit
- anywhere that allows outbound internet traffic to port 80
How it works?
Node opens a websocket when in debug mode, both the sandbox server and client work by piping the websocket data via the broker.
The server is used as a gatekeeper for the debug messages.
npx sandbox-debugger-server
or
ᐅ docker run \
--name sandbox-debugger \
-ti \
--rm \
-p 9229:9229 \
jameskyburz/sandbox-debugger
The server will output
Debug server started!
- To debug a new process:
export DEBUG_PROXY=xxx.xxx.x.xxx:9229
node index.js
- To debug an existing process:
export DEBUG_PROXY=xxx.xxx.x.xxx:9229
export DEBUG_PID=<pid of node process>
npx sandbox-debugger
- Find pid of first running Node.js process
ps ax |
grep 'no[d]e ' |
awk '{print $1}' |
head -n 1
- Allow remote access to me:
npx ngrok http 9229 --scheme http
Using ngrok you can tunnel to the locally running broker from for example aws lambda.
npx ngrok http 9229 --scheme http
// index.js
require('sandbox-debugger')
debugger
console.log('all done')
# DEBUG_PROXY is ip:port to sandbox broker
DEBUG_PROXY=ip:port node index.js
# DEBUG_PROXY is ip:port to sandbox broker
# DEBUG_PID is pid of process to debug
DEBUG_PROXY=ip:port DEBUG_PID=x npx sandbox-debugger
Environment variable DEBUG_PROXY
needs to point to the ngrok
address including the port part :80
.
The easiest way to debug lambda is to edit the code in aws console.
Copy the contents of https://unpkg.com/sandbox-debugger@latest/dist/index.js
to debug.js, and require('./debug.cjs')
instead of sandbox-debugger
ESM example
import { createRequire } from 'node:module'
const require = createRequire(import.meta.url)
require('./debug.cjs')