Add break to gdbr's read_packet and move isbreaked to libgdbr ##debug

Since read_packet has a large number of retries you would wait for it
for a couple of seconds after breaking in functions like connect and
vcont
This commit is contained in:
yossizap 2019-11-13 21:50:05 +00:00 committed by radare
parent 0b68cab009
commit 279f53122f
4 changed files with 16 additions and 11 deletions

View File

@ -196,6 +196,8 @@ typedef struct libgdbr_t {
int arch, bits;
bool valid;
} target;
bool isbreaked;
} libgdbr_t;
/*!

View File

@ -84,12 +84,10 @@ static void reg_cache_init(libgdbr_t *g) {
}
}
static bool _isbreaked = false;
static void gdbr_break_process(void *arg) {
libgdbr_t *g = (libgdbr_t *)arg;
(void)g;
_isbreaked = true;
g->isbreaked = true;
}
bool gdbr_lock_tryenter(libgdbr_t *g) {
@ -105,7 +103,7 @@ bool gdbr_lock_enter(libgdbr_t *g) {
void *bed = r_cons_sleep_begin ();
r_th_lock_enter (g->gdbr_lock);
r_cons_sleep_end (bed);
if (_isbreaked) {
if (g->isbreaked) {
return false;
}
return true;
@ -114,6 +112,10 @@ bool gdbr_lock_enter(libgdbr_t *g) {
void gdbr_lock_leave(libgdbr_t *g) {
r_cons_break_pop ();
r_th_lock_leave (g->gdbr_lock);
// if this is the last lock this thread holds make sure that we disable the break
if (!r_th_lock_check (g->gdbr_lock)) {
g->isbreaked = false;
}
}
static int gdbr_connect_lldb(libgdbr_t *g) {
@ -178,7 +180,7 @@ int gdbr_connect(libgdbr_t *g, const char *host, int port) {
g->connected = 1;
void *bed = r_cons_sleep_begin ();
// TODO add config possibility here
for (i = 0; i < QSUPPORTED_MAX_RETRIES && !_isbreaked; i++) {
for (i = 0; i < QSUPPORTED_MAX_RETRIES && !g->isbreaked; i++) {
ret = send_msg (g, message);
if (ret < 0) {
continue;
@ -194,8 +196,8 @@ int gdbr_connect(libgdbr_t *g, const char *host, int port) {
break;
}
r_cons_sleep_end (bed);
if (_isbreaked) {
_isbreaked = false;
if (g->isbreaked) {
g->isbreaked = false;
ret = -1;
goto end;
}
@ -1261,9 +1263,9 @@ int send_vcont(libgdbr_t *g, const char *command, const char *thread_id) {
}
bed = r_cons_sleep_begin ();
while ((ret = read_packet (g, true)) < 0 && !_isbreaked && r_socket_is_connected (g->sock));
if (_isbreaked) {
_isbreaked = false;
while ((ret = read_packet (g, true)) < 0 && !g->isbreaked && r_socket_is_connected (g->sock));
if (g->isbreaked) {
g->isbreaked = false;
// Stop target
r_socket_write (g->sock, "\x03", 1);
// Read the stop reason

View File

@ -43,6 +43,7 @@ int gdbr_init(libgdbr_t *g, bool is_server) {
return -1;
}
g->remote_type = GDB_REMOTE_TYPE_GDB;
g->isbreaked = false;
return 0;
}

View File

@ -159,7 +159,7 @@ int read_packet(libgdbr_t *g, bool vcont) {
}
}
g->data_len = 0;
for (i = 0; i < g->num_retries; vcont ? 0 : i++) {
for (i = 0; i < g->num_retries && !g->isbreaked; vcont ? 0 : i++) {
ret = r_socket_ready (g->sock, 0, READ_TIMEOUT);
if (ret == 0 && !vcont) {
continue;