diff --git a/src/node.cc b/src/node.cc index da4e1d4b0e..5a2b4843be 100644 --- a/src/node.cc +++ b/src/node.cc @@ -3480,6 +3480,12 @@ static void PrintHelp() { " does not appear to be a terminal\n" " -r, --require module to preload (option can be " "repeated)\n" +#if HAVE_INSPECTOR + " --inspect[=host:port] activate inspector on host:port\n" + " (default: 127.0.0.1:9229)\n" + " --inspect-brk[=host:port] activate inspector on host:port\n" + " and break at start of user script\n" +#endif " --no-deprecation silence deprecation warnings\n" " --trace-deprecation show stack traces on deprecations\n" " --throw-deprecation throw an exception on deprecations\n" diff --git a/src/node_debug_options.cc b/src/node_debug_options.cc index 5681e3d46e..410e23acb3 100644 --- a/src/node_debug_options.cc +++ b/src/node_debug_options.cc @@ -30,7 +30,8 @@ int parse_and_validate_port(const std::string& port) { } std::pair split_host_port(const std::string& arg) { - // IPv6, no port + // remove_brackets only works if no port is specified + // so if it has an effect only an IPv6 address was specified std::string host = remove_brackets(arg); if (host.length() < arg.length()) return {host, -1}; @@ -46,6 +47,7 @@ std::pair split_host_port(const std::string& arg) { } return {"", parse_and_validate_port(arg)}; } + // host and port found return std::make_pair(remove_brackets(arg.substr(0, colon)), parse_and_validate_port(arg.substr(colon + 1))); } @@ -90,6 +92,7 @@ bool DebugOptions::ParseOption(const std::string& option) { argument = option.substr(pos + 1); } + // --debug and --inspect are mutually exclusive if (option_name == "--debug") { debugger_enabled_ = true; } else if (option_name == "--debug-brk") { @@ -98,7 +101,15 @@ bool DebugOptions::ParseOption(const std::string& option) { } else if (option_name == "--inspect") { debugger_enabled_ = true; enable_inspector = true; - } else if (option_name != "--debug-port" || !has_argument) { + } else if (option_name == "--inspect-brk") { + debugger_enabled_ = true; + enable_inspector = true; + wait_connect_ = true; + } else if ((option_name != "--debug-port" && + option_name != "--inspect-port") || + !has_argument) { + // only other valid possibility is --debug-port, + // which requires an argument return false; } @@ -112,20 +123,17 @@ bool DebugOptions::ParseOption(const std::string& option) { #endif } - if (!has_argument) { - return true; + // argument can be specified for *any* option to specify host:port + if (has_argument) { + std::pair host_port = split_host_port(argument); + if (!host_port.first.empty()) { + host_name_ = host_port.first; + } + if (host_port.second >= 0) { + port_ = host_port.second; + } } - // FIXME(bnoordhuis) Move IPv6 address parsing logic to lib/net.js. - // It seems reasonable to support [address]:port notation - // in net.Server#listen() and net.Socket#connect(). - std::pair host_port = split_host_port(argument); - if (!host_port.first.empty()) { - host_name_ = host_port.first; - } - if (host_port.second >= 0) { - port_ = host_port.second; - } return true; } diff --git a/test/inspector/inspector-helper.js b/test/inspector/inspector-helper.js index 3e517123fe..105d9b358b 100644 --- a/test/inspector/inspector-helper.js +++ b/test/inspector/inspector-helper.js @@ -428,7 +428,7 @@ Harness.prototype.expectShutDown = function(errorCode) { exports.startNodeForInspectorTest = function(callback) { const child = spawn(process.execPath, - [ '--inspect', '--debug-brk', mainScript ]); + [ '--inspect-brk', mainScript ]); const timeoutId = timeout('Child process did not start properly', 4); diff --git a/test/sequential/test-debugger-debug-brk.js b/test/sequential/test-debugger-debug-brk.js index 85ebe2ad17..5454aaa08a 100644 --- a/test/sequential/test-debugger-debug-brk.js +++ b/test/sequential/test-debugger-debug-brk.js @@ -26,3 +26,5 @@ function test(arg) { test('--debug-brk'); test('--debug-brk=5959'); +test('--inspect-brk'); +test('--inspect-brk=9230');