+static void gdb_log_incoming_packet(char *packet)
+{
+ if (!LOG_LEVEL_IS(LOG_LVL_DEBUG))
+ return;
+
+ /* Avoid dumping non-printable characters to the terminal */
+ const unsigned packet_len = strlen(packet);
+ const char *nonprint = find_nonprint_char(packet, packet_len);
+ if (nonprint) {
+ /* Does packet at least have a prefix that is printable?
+ * Look within the first 50 chars of the packet. */
+ const char *colon = memchr(packet, ':', MIN(50, packet_len));
+ const bool packet_has_prefix = (colon != NULL);
+ const bool packet_prefix_printable = (packet_has_prefix && nonprint > colon);
+
+ 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);
+ } else {
+ LOG_DEBUG("received packet: <binary-data-%u-bytes>", packet_len);
+ }
+ } else {
+ /* All chars printable, dump the packet as is */
+ LOG_DEBUG("received packet: %s", packet);
+ }
+}
+
+static void gdb_log_outgoing_packet(char *packet_buf, unsigned int packet_len, unsigned char checksum)
+{
+ if (!LOG_LEVEL_IS(LOG_LVL_DEBUG))
+ return;
+
+ if (find_nonprint_char(packet_buf, packet_len))
+ LOG_DEBUG("sending packet: $<binary-data-%u-bytes>#%2.2x", packet_len, checksum);
+ else
+ LOG_DEBUG("sending packet: $%.*s#%2.2x'", packet_len, packet_buf, checksum);
+}
+