Skip to content

Commit 9a111e7

Browse files
Eugene Ostroukhovitaloacasas
Eugene Ostroukhov
authored andcommitted
inspector: no crash when WS server can't start
This change also changes error message to make it consistent with the one printed by the debugger. Fixes: #10858 PR-URL: #10878 Reviewed-By: Ben Noordhuis <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Colin Ihrig <[email protected]>
1 parent 63f4302 commit 9a111e7

5 files changed

+33
-22
lines changed

src/inspector_agent.cc

+3-2
Original file line numberDiff line numberDiff line change
@@ -556,9 +556,10 @@ void AgentImpl::WorkerRunIO() {
556556
}
557557
InspectorAgentDelegate delegate(this, script_path, script_name_, wait_);
558558
delegate_ = &delegate;
559-
InspectorSocketServer server(&delegate, options_.port());
559+
InspectorSocketServer server(&delegate,
560+
options_.host_name(),
561+
options_.port());
560562
if (!server.Start(&child_loop_)) {
561-
fprintf(stderr, "Unable to open devtools socket: %s\n", uv_strerror(err));
562563
state_ = State::kError; // Safe, main thread is waiting on semaphore
563564
uv_close(reinterpret_cast<uv_handle_t*>(&io_thread_req_), nullptr);
564565
uv_loop_close(&child_loop_);

src/inspector_socket_server.cc

+15-9
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ void Escape(std::string* string) {
2424
}
2525
}
2626

27-
std::string GetWsUrl(int port, const std::string& id) {
27+
std::string GetWsUrl(const std::string& host, int port, const std::string& id) {
2828
char buf[1024];
29-
snprintf(buf, sizeof(buf), "127.0.0.1:%d/%s", port, id.c_str());
29+
snprintf(buf, sizeof(buf), "%s:%d/%s", host.c_str(), port, id.c_str());
3030
return buf;
3131
}
3232

@@ -74,7 +74,8 @@ void OnBufferAlloc(uv_handle_t* handle, size_t len, uv_buf_t* buf) {
7474
buf->len = len;
7575
}
7676

77-
void PrintDebuggerReadyMessage(int port,
77+
void PrintDebuggerReadyMessage(const std::string& host,
78+
int port,
7879
const std::vector<std::string>& ids,
7980
FILE* out) {
8081
if (out == NULL) {
@@ -92,7 +93,8 @@ void PrintDebuggerReadyMessage(int port,
9293
for (const std::string& id : ids) {
9394
fprintf(out,
9495
" chrome-devtools://devtools/bundled/inspector.html?"
95-
"experiments=true&v8only=true&ws=%s\n", GetWsUrl(port, id).c_str());
96+
"experiments=true&v8only=true&ws=%s\n",
97+
GetWsUrl(host, port, id).c_str());
9698
}
9799
fflush(out);
98100
}
@@ -229,9 +231,11 @@ class SocketSession {
229231
};
230232

231233
InspectorSocketServer::InspectorSocketServer(SocketServerDelegate* delegate,
234+
const std::string& host,
232235
int port,
233236
FILE* out) : loop_(nullptr),
234237
delegate_(delegate),
238+
host_(host),
235239
port_(port),
236240
server_(uv_tcp_t()),
237241
closer_(nullptr),
@@ -284,7 +288,7 @@ void InspectorSocketServer::SessionTerminated(int session_id) {
284288
delegate_->EndSession(session_id);
285289
if (connected_sessions_.empty() &&
286290
uv_is_active(reinterpret_cast<uv_handle_t*>(&server_))) {
287-
PrintDebuggerReadyMessage(port_, delegate_->GetTargetIds(), out_);
291+
PrintDebuggerReadyMessage(host_, port_, delegate_->GetTargetIds(), out_);
288292
}
289293
}
290294

@@ -337,7 +341,7 @@ void InspectorSocketServer::SendListResponse(InspectorSocket* socket) {
337341
}
338342
}
339343
if (!connected) {
340-
std::string address = GetWsUrl(port_, id);
344+
std::string address = GetWsUrl(host_, port_, id);
341345
std::ostringstream frontend_url;
342346
frontend_url << "chrome-devtools://devtools/bundled";
343347
frontend_url << "/inspector.html?experiments=true&v8only=true&ws=";
@@ -353,7 +357,7 @@ bool InspectorSocketServer::Start(uv_loop_t* loop) {
353357
loop_ = loop;
354358
sockaddr_in addr;
355359
uv_tcp_init(loop_, &server_);
356-
uv_ip4_addr("0.0.0.0", port_, &addr);
360+
uv_ip4_addr(host_.c_str(), port_, &addr);
357361
int err = uv_tcp_bind(&server_,
358362
reinterpret_cast<const struct sockaddr*>(&addr), 0);
359363
if (err == 0)
@@ -363,11 +367,13 @@ bool InspectorSocketServer::Start(uv_loop_t* loop) {
363367
SocketConnectedCallback);
364368
}
365369
if (err == 0 && connected_sessions_.empty()) {
366-
PrintDebuggerReadyMessage(port_, delegate_->GetTargetIds(), out_);
370+
PrintDebuggerReadyMessage(host_, port_, delegate_->GetTargetIds(), out_);
367371
}
368372
if (err != 0 && connected_sessions_.empty()) {
369373
if (out_ != NULL) {
370-
fprintf(out_, "Unable to open devtools socket: %s\n", uv_strerror(err));
374+
fprintf(out_, "Starting inspector on %s:%d failed: %s\n",
375+
host_.c_str(), port_, uv_strerror(err));
376+
fflush(out_);
371377
}
372378
uv_close(reinterpret_cast<uv_handle_t*>(&server_), nullptr);
373379
return false;

src/inspector_socket_server.h

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class InspectorSocketServer {
3333
public:
3434
using ServerCallback = void (*)(InspectorSocketServer*);
3535
InspectorSocketServer(SocketServerDelegate* delegate,
36+
const std::string& host,
3637
int port,
3738
FILE* out = stderr);
3839
bool Start(uv_loop_t* loop);
@@ -65,6 +66,7 @@ class InspectorSocketServer {
6566

6667
uv_loop_t* loop_;
6768
SocketServerDelegate* const delegate_;
69+
const std::string host_;
6870
int port_;
6971
std::string path_;
7072
uv_tcp_t server_;

src/node.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -4331,7 +4331,7 @@ inline int Start(Isolate* isolate, IsolateData* isolate_data,
43314331
if (debug_enabled) {
43324332
const char* path = argc > 1 ? argv[1] : nullptr;
43334333
StartDebug(&env, path, debug_options);
4334-
if (debug_options.debugger_enabled() && !debugger_running)
4334+
if (!debugger_running)
43354335
return 12; // Signal internal error.
43364336
}
43374337

test/cctest/test_inspector_socket_server.cc

+12-10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
static uv_loop_t loop;
1010

11+
static const char HOST[] = "127.0.0.1";
12+
1113
static const char CLIENT_CLOSE_FRAME[] = "\x88\x80\x2D\x0E\x1E\xFA";
1214
static const char SERVER_CLOSE_FRAME[] = "\x88\x00";
1315

@@ -249,7 +251,7 @@ class SocketWrapper {
249251
}
250252

251253
static void Connected_(uv_connect_t* connect, int status) {
252-
EXPECT_EQ(0, status);
254+
EXPECT_EQ(0, status) << "Unable to connect: " << uv_strerror(status);
253255
SocketWrapper* wrapper =
254256
node::ContainerOf(&SocketWrapper::connect_, connect);
255257
wrapper->connected_ = true;
@@ -301,7 +303,7 @@ class ServerHolder {
301303
template <typename Delegate>
302304
ServerHolder(Delegate* delegate, int port, FILE* out = NULL)
303305
: closed(false), paused(false), sessions_terminated(false),
304-
server_(delegate, port, out) {
306+
server_(delegate, HOST, port, out) {
305307
delegate->Connect(&server_);
306308
}
307309

@@ -362,7 +364,7 @@ class ServerDelegateNoTargets : public SocketServerDelegate {
362364
static void TestHttpRequest(int port, const std::string& path,
363365
const std::string& expected_body) {
364366
SocketWrapper socket(&loop);
365-
socket.Connect("0.0.0.0", port);
367+
socket.Connect(HOST, port);
366368
socket.TestHttpRequest(path, expected_body);
367369
socket.Close();
368370
}
@@ -385,7 +387,7 @@ TEST_F(InspectorSocketServerTest, InspectorSessions) {
385387

386388
SocketWrapper well_behaved_socket(&loop);
387389
// Regular connection
388-
well_behaved_socket.Connect("0.0.0.0", server.port());
390+
well_behaved_socket.Connect(HOST, server.port());
389391
well_behaved_socket.Write(WsHandshakeRequest(MAIN_TARGET_ID));
390392
well_behaved_socket.Expect(WS_HANDSHAKE_RESPONSE);
391393

@@ -408,7 +410,7 @@ TEST_F(InspectorSocketServerTest, InspectorSessions) {
408410

409411
// Declined connection
410412
SocketWrapper declined_target_socket(&loop);
411-
declined_target_socket.Connect("127.0.0.1", server.port());
413+
declined_target_socket.Connect(HOST, server.port());
412414
declined_target_socket.Write(WsHandshakeRequest(UNCONNECTABLE_TARGET_ID));
413415
declined_target_socket.Expect("HTTP/1.0 400 Bad Request");
414416
declined_target_socket.ExpectEOF();
@@ -417,7 +419,7 @@ TEST_F(InspectorSocketServerTest, InspectorSessions) {
417419

418420
// Bogus target - start session callback should not even be invoked
419421
SocketWrapper bogus_target_socket(&loop);
420-
bogus_target_socket.Connect("127.0.0.1", server.port());
422+
bogus_target_socket.Connect(HOST, server.port());
421423
bogus_target_socket.Write(WsHandshakeRequest("bogus_target"));
422424
bogus_target_socket.Expect("HTTP/1.0 400 Bad Request");
423425
bogus_target_socket.ExpectEOF();
@@ -426,7 +428,7 @@ TEST_F(InspectorSocketServerTest, InspectorSessions) {
426428

427429
// Drop connection (no proper close frames)
428430
SocketWrapper dropped_connection_socket(&loop);
429-
dropped_connection_socket.Connect("127.0.0.1", server.port());
431+
dropped_connection_socket.Connect(HOST, server.port());
430432
dropped_connection_socket.Write(WsHandshakeRequest(MAIN_TARGET_ID));
431433
dropped_connection_socket.Expect(WS_HANDSHAKE_RESPONSE);
432434

@@ -440,7 +442,7 @@ TEST_F(InspectorSocketServerTest, InspectorSessions) {
440442

441443
// Reconnect regular connection
442444
SocketWrapper stays_till_termination_socket(&loop);
443-
stays_till_termination_socket.Connect("127.0.0.1", server.port());
445+
stays_till_termination_socket.Connect(HOST, server.port());
444446
stays_till_termination_socket.Write(WsHandshakeRequest(MAIN_TARGET_ID));
445447
stays_till_termination_socket.Expect(WS_HANDSHAKE_RESPONSE);
446448

@@ -484,7 +486,7 @@ TEST_F(InspectorSocketServerTest, ServerWithoutTargets) {
484486

485487
// Declined connection
486488
SocketWrapper socket(&loop);
487-
socket.Connect("0.0.0.0", server.port());
489+
socket.Connect(HOST, server.port());
488490
socket.Write(WsHandshakeRequest(UNCONNECTABLE_TARGET_ID));
489491
socket.Expect("HTTP/1.0 400 Bad Request");
490492
socket.ExpectEOF();
@@ -512,7 +514,7 @@ TEST_F(InspectorSocketServerTest, StoppingServerDoesNotKillConnections) {
512514
ServerHolder server(&delegate, 0);
513515
ASSERT_TRUE(server->Start(&loop));
514516
SocketWrapper socket1(&loop);
515-
socket1.Connect("0.0.0.0", server.port());
517+
socket1.Connect(HOST, server.port());
516518
socket1.TestHttpRequest("/json/list", "[ ]");
517519
server->Stop(ServerHolder::CloseCallback);
518520
SPIN_WHILE(!server.closed);

0 commit comments

Comments
 (0)