gdb_server: Improve logging of GDB-remote packets
- Print also the target name, not just the packet contents. This is important when there are more GDB servers (more debug-able targets) active in one OpenOCD session. - Log also the received Ctrl-C requests coming from GDB (one byte 0x3), ACKs ("+") and NACKs ("-"). - Do not print zero-length incoming packets (this occurred when Ctrl-C packets were received). - Removed a stray apostrophe "'" that got printed in gdb_log_outgoing_packet() Signed-off-by: Jan Matyas <matyas@codasip.com> Change-Id: If68fe0a8aa635165d0bbe6fa0e48a4645a02da67 Reviewed-on: https://review.openocd.org/c/openocd/+/6879 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
parent
6c9dd1c6ba
commit
017d3ddafb
|
@ -371,11 +371,13 @@ static int gdb_write(struct connection *connection, void *data, int len)
|
||||||
return ERROR_SERVER_REMOTE_CLOSED;
|
return ERROR_SERVER_REMOTE_CLOSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gdb_log_incoming_packet(char *packet)
|
static void gdb_log_incoming_packet(struct connection *connection, char *packet)
|
||||||
{
|
{
|
||||||
if (!LOG_LEVEL_IS(LOG_LVL_DEBUG))
|
if (!LOG_LEVEL_IS(LOG_LVL_DEBUG))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
struct target *target = get_target_from_connection(connection);
|
||||||
|
|
||||||
/* Avoid dumping non-printable characters to the terminal */
|
/* Avoid dumping non-printable characters to the terminal */
|
||||||
const unsigned packet_len = strlen(packet);
|
const unsigned packet_len = strlen(packet);
|
||||||
const char *nonprint = find_nonprint_char(packet, packet_len);
|
const char *nonprint = find_nonprint_char(packet, packet_len);
|
||||||
|
@ -389,25 +391,31 @@ static void gdb_log_incoming_packet(char *packet)
|
||||||
if (packet_prefix_printable) {
|
if (packet_prefix_printable) {
|
||||||
const unsigned int prefix_len = colon - packet + 1; /* + 1 to include the ':' */
|
const unsigned int prefix_len = colon - packet + 1; /* + 1 to include the ':' */
|
||||||
const unsigned int payload_len = packet_len - prefix_len;
|
const unsigned int payload_len = packet_len - prefix_len;
|
||||||
LOG_DEBUG("received packet: %.*s<binary-data-%u-bytes>", prefix_len, packet, payload_len);
|
LOG_TARGET_DEBUG(target, "received packet: %.*s<binary-data-%u-bytes>", prefix_len,
|
||||||
|
packet, payload_len);
|
||||||
} else {
|
} else {
|
||||||
LOG_DEBUG("received packet: <binary-data-%u-bytes>", packet_len);
|
LOG_TARGET_DEBUG(target, "received packet: <binary-data-%u-bytes>", packet_len);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* All chars printable, dump the packet as is */
|
/* All chars printable, dump the packet as is */
|
||||||
LOG_DEBUG("received packet: %s", packet);
|
LOG_TARGET_DEBUG(target, "received packet: %s", packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gdb_log_outgoing_packet(char *packet_buf, unsigned int packet_len, unsigned char checksum)
|
static void gdb_log_outgoing_packet(struct connection *connection, char *packet_buf,
|
||||||
|
unsigned int packet_len, unsigned char checksum)
|
||||||
{
|
{
|
||||||
if (!LOG_LEVEL_IS(LOG_LVL_DEBUG))
|
if (!LOG_LEVEL_IS(LOG_LVL_DEBUG))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
struct target *target = get_target_from_connection(connection);
|
||||||
|
|
||||||
if (find_nonprint_char(packet_buf, packet_len))
|
if (find_nonprint_char(packet_buf, packet_len))
|
||||||
LOG_DEBUG("sending packet: $<binary-data-%u-bytes>#%2.2x", packet_len, checksum);
|
LOG_TARGET_DEBUG(target, "sending packet: $<binary-data-%u-bytes>#%2.2x",
|
||||||
|
packet_len, checksum);
|
||||||
else
|
else
|
||||||
LOG_DEBUG("sending packet: $%.*s#%2.2x'", packet_len, packet_buf, checksum);
|
LOG_TARGET_DEBUG(target, "sending packet: $%.*s#%2.2x", packet_len, packet_buf,
|
||||||
|
checksum);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gdb_put_packet_inner(struct connection *connection,
|
static int gdb_put_packet_inner(struct connection *connection,
|
||||||
|
@ -450,7 +458,7 @@ static int gdb_put_packet_inner(struct connection *connection,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
gdb_log_outgoing_packet(buffer, len, my_checksum);
|
gdb_log_outgoing_packet(connection, buffer, len, my_checksum);
|
||||||
|
|
||||||
char local_buffer[1024];
|
char local_buffer[1024];
|
||||||
local_buffer[0] = '$';
|
local_buffer[0] = '$';
|
||||||
|
@ -483,22 +491,27 @@ static int gdb_put_packet_inner(struct connection *connection,
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
if (reply == '+')
|
if (reply == '+') {
|
||||||
|
gdb_log_incoming_packet(connection, "+");
|
||||||
break;
|
break;
|
||||||
else if (reply == '-') {
|
} else if (reply == '-') {
|
||||||
/* Stop sending output packets for now */
|
/* Stop sending output packets for now */
|
||||||
gdb_con->output_flag = GDB_OUTPUT_NO;
|
gdb_con->output_flag = GDB_OUTPUT_NO;
|
||||||
|
gdb_log_incoming_packet(connection, "-");
|
||||||
LOG_WARNING("negative reply, retrying");
|
LOG_WARNING("negative reply, retrying");
|
||||||
} else if (reply == 0x3) {
|
} else if (reply == 0x3) {
|
||||||
gdb_con->ctrl_c = true;
|
gdb_con->ctrl_c = true;
|
||||||
|
gdb_log_incoming_packet(connection, "<Ctrl-C>");
|
||||||
retval = gdb_get_char(connection, &reply);
|
retval = gdb_get_char(connection, &reply);
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
return retval;
|
return retval;
|
||||||
if (reply == '+')
|
if (reply == '+') {
|
||||||
|
gdb_log_incoming_packet(connection, "+");
|
||||||
break;
|
break;
|
||||||
else if (reply == '-') {
|
} else if (reply == '-') {
|
||||||
/* Stop sending output packets for now */
|
/* Stop sending output packets for now */
|
||||||
gdb_con->output_flag = GDB_OUTPUT_NO;
|
gdb_con->output_flag = GDB_OUTPUT_NO;
|
||||||
|
gdb_log_incoming_packet(connection, "-");
|
||||||
LOG_WARNING("negative reply, retrying");
|
LOG_WARNING("negative reply, retrying");
|
||||||
} else if (reply == '$') {
|
} else if (reply == '$') {
|
||||||
LOG_ERROR("GDB missing ack(1) - assumed good");
|
LOG_ERROR("GDB missing ack(1) - assumed good");
|
||||||
|
@ -675,6 +688,7 @@ static int gdb_get_packet_inner(struct connection *connection,
|
||||||
case '$':
|
case '$':
|
||||||
break;
|
break;
|
||||||
case '+':
|
case '+':
|
||||||
|
gdb_log_incoming_packet(connection, "+");
|
||||||
/* According to the GDB documentation
|
/* According to the GDB documentation
|
||||||
* (https://sourceware.org/gdb/onlinedocs/gdb/Packet-Acknowledgment.html):
|
* (https://sourceware.org/gdb/onlinedocs/gdb/Packet-Acknowledgment.html):
|
||||||
* "gdb sends a final `+` acknowledgment of the stub's `OK`
|
* "gdb sends a final `+` acknowledgment of the stub's `OK`
|
||||||
|
@ -692,9 +706,11 @@ static int gdb_get_packet_inner(struct connection *connection,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '-':
|
case '-':
|
||||||
|
gdb_log_incoming_packet(connection, "-");
|
||||||
LOG_WARNING("negative acknowledgment, but no packet pending");
|
LOG_WARNING("negative acknowledgment, but no packet pending");
|
||||||
break;
|
break;
|
||||||
case 0x3:
|
case 0x3:
|
||||||
|
gdb_log_incoming_packet(connection, "<Ctrl-C>");
|
||||||
gdb_con->ctrl_c = true;
|
gdb_con->ctrl_c = true;
|
||||||
*len = 0;
|
*len = 0;
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
|
@ -3452,9 +3468,10 @@ static int gdb_input_inner(struct connection *connection)
|
||||||
/* terminate with zero */
|
/* terminate with zero */
|
||||||
gdb_packet_buffer[packet_size] = '\0';
|
gdb_packet_buffer[packet_size] = '\0';
|
||||||
|
|
||||||
gdb_log_incoming_packet(gdb_packet_buffer);
|
|
||||||
|
|
||||||
if (packet_size > 0) {
|
if (packet_size > 0) {
|
||||||
|
|
||||||
|
gdb_log_incoming_packet(connection, gdb_packet_buffer);
|
||||||
|
|
||||||
retval = ERROR_OK;
|
retval = ERROR_OK;
|
||||||
switch (packet[0]) {
|
switch (packet[0]) {
|
||||||
case 'T': /* Is thread alive? */
|
case 'T': /* Is thread alive? */
|
||||||
|
|
Loading…
Reference in New Issue