gdb_server: Improve logging of GDB-remote packets 79/6879/5
authorJan Matyas <matyas@codasip.com>
Thu, 17 Mar 2022 13:27:58 +0000 (14:27 +0100)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sun, 3 Apr 2022 20:11:08 +0000 (20:11 +0000)
- 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>
src/server/gdb_server.c

index f5736196eddfb4717d389688d631c1e76f31bceb..82c8ce92b31faf395ee6f933ba147ee8ad1582ac 100644 (file)
@@ -371,11 +371,13 @@ static int gdb_write(struct connection *connection, void *data, int len)
        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))
                return;
 
+       struct target *target = get_target_from_connection(connection);
+
        /* Avoid dumping non-printable characters to the terminal */
        const unsigned packet_len = strlen(packet);
        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) {
                        const unsigned int prefix_len = colon - packet + 1;  /* + 1 to include the ':' */
                        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 {
-                       LOG_DEBUG("received packet: <binary-data-%u-bytes>", packet_len);
+                       LOG_TARGET_DEBUG(target, "received packet: <binary-data-%u-bytes>", packet_len);
                }
        } else {
                /* 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))
                return;
 
+       struct target *target = get_target_from_connection(connection);
+
        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
-               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,
@@ -450,7 +458,7 @@ static int gdb_put_packet_inner(struct connection *connection,
 #endif
 
        while (1) {
-               gdb_log_outgoing_packet(buffer, len, my_checksum);
+               gdb_log_outgoing_packet(connection, buffer, len, my_checksum);
 
                char local_buffer[1024];
                local_buffer[0] = '$';
@@ -483,22 +491,27 @@ static int gdb_put_packet_inner(struct connection *connection,
                if (retval != ERROR_OK)
                        return retval;
 
-               if (reply == '+')
+               if (reply == '+') {
+                       gdb_log_incoming_packet(connection, "+");
                        break;
-               else if (reply == '-') {
+               else if (reply == '-') {
                        /* Stop sending output packets for now */
                        gdb_con->output_flag = GDB_OUTPUT_NO;
+                       gdb_log_incoming_packet(connection, "-");
                        LOG_WARNING("negative reply, retrying");
                } else if (reply == 0x3) {
                        gdb_con->ctrl_c = true;
+                       gdb_log_incoming_packet(connection, "<Ctrl-C>");
                        retval = gdb_get_char(connection, &reply);
                        if (retval != ERROR_OK)
                                return retval;
-                       if (reply == '+')
+                       if (reply == '+') {
+                               gdb_log_incoming_packet(connection, "+");
                                break;
-                       else if (reply == '-') {
+                       else if (reply == '-') {
                                /* Stop sending output packets for now */
                                gdb_con->output_flag = GDB_OUTPUT_NO;
+                               gdb_log_incoming_packet(connection, "-");
                                LOG_WARNING("negative reply, retrying");
                        } else if (reply == '$') {
                                LOG_ERROR("GDB missing ack(1) - assumed good");
@@ -675,6 +688,7 @@ static int gdb_get_packet_inner(struct connection *connection,
                                case '$':
                                        break;
                                case '+':
+                                       gdb_log_incoming_packet(connection, "+");
                                        /* According to the GDB documentation
                                         * (https://sourceware.org/gdb/onlinedocs/gdb/Packet-Acknowledgment.html):
                                         * "gdb sends a final `+` acknowledgment of the stub's `OK`
@@ -692,9 +706,11 @@ static int gdb_get_packet_inner(struct connection *connection,
                                        }
                                        break;
                                case '-':
+                                       gdb_log_incoming_packet(connection, "-");
                                        LOG_WARNING("negative acknowledgment, but no packet pending");
                                        break;
                                case 0x3:
+                                       gdb_log_incoming_packet(connection, "<Ctrl-C>");
                                        gdb_con->ctrl_c = true;
                                        *len = 0;
                                        return ERROR_OK;
@@ -3452,9 +3468,10 @@ static int gdb_input_inner(struct connection *connection)
                /* terminate with zero */
                gdb_packet_buffer[packet_size] = '\0';
 
-               gdb_log_incoming_packet(gdb_packet_buffer);
-
                if (packet_size > 0) {
+
+                       gdb_log_incoming_packet(connection, gdb_packet_buffer);
+
                        retval = ERROR_OK;
                        switch (packet[0]) {
                                case 'T':       /* Is thread alive? */

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)