Allow source debugger reconnection (#1667)

Allow to wait for a new debugger connection once the previous one
is disconnected:
- when receiving a detach command
- when the client socket is closed (for example, lldb process is killed)
This commit is contained in:
TianlongLiang
2022-11-02 17:12:34 +08:00
committed by GitHub
parent 5b144c491d
commit 3b4033aceb
6 changed files with 162 additions and 53 deletions

View File

@ -34,6 +34,7 @@ static const struct packet_handler_elem packet_handler_table[255] = {
DEL_HANDLER('c', handle_continue_request),
DEL_HANDLER('k', handle_kill_request),
DEL_HANDLER('_', handle____request),
DEL_HANDLER('D', handle_detach_request),
};
WASMGDBServer *
@ -89,7 +90,6 @@ fail:
bool
wasm_gdbserver_listen(WASMGDBServer *server)
{
bh_socket_t sockt_fd = (bh_socket_t)-1;
int32 ret;
ret = os_socket_listen(server->listen_fd, 1);
@ -98,6 +98,23 @@ wasm_gdbserver_listen(WASMGDBServer *server)
goto fail;
}
LOG_VERBOSE("listen for gdb client");
return true;
fail:
os_socket_shutdown(server->listen_fd);
os_socket_close(server->listen_fd);
return false;
}
bool
wasm_gdbserver_accept(WASMGDBServer *server)
{
bh_socket_t sockt_fd = (bh_socket_t)-1;
LOG_VERBOSE("waiting for gdb client to connect...");
os_socket_accept(server->listen_fd, &sockt_fd, NULL, NULL);
if (sockt_fd < 0) {
LOG_ERROR("wasm gdb server error: socket accept failed");
@ -115,6 +132,15 @@ fail:
return false;
}
void
wasm_gdbserver_detach(WASMGDBServer *server)
{
if (server->socket_fd > 0) {
os_socket_shutdown(server->socket_fd);
os_socket_close(server->socket_fd);
}
}
void
wasm_close_gdbserver(WASMGDBServer *server)
{
@ -263,8 +289,9 @@ wasm_gdbserver_handle_packet(WASMGDBServer *server)
n = os_socket_recv(server->socket_fd, buf, sizeof(buf));
if (n == 0) {
LOG_VERBOSE("Debugger disconnected");
return false;
handle_detach_request(server, NULL);
LOG_VERBOSE("Debugger disconnected, waiting for debugger reconnection");
return true;
}
else if (n < 0) {
#if defined(BH_PLATFORM_WINDOWS)