From 9e09fc0508104f0262900116fb2f2371eb7ea86f Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Sat, 24 Sep 2011 12:44:08 +0700 Subject: [PATCH] more cli options * node debug localhost:5858 - connects to remote debugger * node debug -p `pgrep node` - connects to running process * Fixed double-run of debugger on SIGUSR1 --- lib/_debugger.js | 47 ++++++++++++++++++++++++++++++++++++++--------- src/node.cc | 5 ++++- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/lib/_debugger.js b/lib/_debugger.js index 9275fb5eb..4e3c9b2b3 100644 --- a/lib/_debugger.js +++ b/lib/_debugger.js @@ -27,8 +27,6 @@ var util = require('util'), inherits = util.inherits, spawn = require('child_process').spawn; -exports.port = 5858; - exports.start = function(argv, stdin, stdout) { argv || (argv = process.argv.slice(2)); @@ -922,6 +920,8 @@ Interface.prototype.controlEval = function(code, context, filename, callback) { // Used for debugger's remote evaluation (`repl`) commands Interface.prototype.debugEval = function(code, context, filename, callback) { + if (!this.requireConnection()) return; + var self = this, client = this.client; @@ -1409,14 +1409,43 @@ Interface.prototype.killChild = function() { // Spawns child process (and restores breakpoints) Interface.prototype.trySpawn = function(cb) { var self = this, - breakpoints = this.breakpoints || []; + breakpoints = this.breakpoints || [], + port = 5858, + host = 'localhost'; this.killChild(); - this.child = spawn(process.execPath, this.args); + // Connecting to remote debugger + // `node debug localhost:5858` + if (this.args.length === 2) { + var match = this.args[1].match(/^([^:]+):(\d+)$/); + if (match) { + host = match[1]; + port = parseInt(match[2], 10); + this.child = { + kill: function() { + // TODO Do we really need to handle it? + } + }; + } + } else if (this.args.length === 3) { + // `node debug -p pid` + if (this.args[1] === '-p' && /^\d+$/.test(this.args[2])) { + this.child = { + kill: function() { + // TODO Do we really need to handle it? + } + }; + process.kill(parseInt(this.args[2], 10), 'SIGUSR1'); + } + } - this.child.stdout.on('data', this.childPrint.bind(this)); - this.child.stderr.on('data', this.childPrint.bind(this)); + if (!this.child) { + this.child = spawn(process.execPath, this.args); + + this.child.stdout.on('data', this.childPrint.bind(this)); + this.child.stderr.on('data', this.childPrint.bind(this)); + } this.pause(); @@ -1461,16 +1490,16 @@ Interface.prototype.trySpawn = function(cb) { client.on('error', connectError); function connectError() { // If it's failed to connect 4 times then don't catch the next error - if (connectionAttempts >= 4) { + if (connectionAttempts >= 10) { client.removeListener('error', connectError); } - setTimeout(attemptConnect, 50); + setTimeout(attemptConnect, 500); } function attemptConnect() { ++connectionAttempts; self.stdout.write('.'); - client.connect(exports.port); + client.connect(port, host); } setTimeout(function() { diff --git a/src/node.cc b/src/node.cc index 336240ac3..1cd6bc0b0 100644 --- a/src/node.cc +++ b/src/node.cc @@ -2356,14 +2356,17 @@ static void EnableDebug(bool wait_connect) { // Print out some information. fprintf(stderr, "debugger listening on port %d", debug_port); + + debugger_running = true; } static volatile bool hit_signal; +static volatile bool debugger_running = false; static void DebugSignalCB(const Debug::EventDetails& details) { - if (hit_signal && details.GetEvent() == v8::Break) { + if (!debugger_running && hit_signal && details.GetEvent() == v8::Break) { hit_signal = false; fprintf(stderr, "Hit SIGUSR1 - starting debugger agent.\n"); EnableDebug(false);