commit 36deef4e0b743790bc4e445d3272189be997b508
parent fd054558b1e324a2b057e8ba1a989123c9ca9b9b
Author: Brian Swetland <swetland@frotz.net>
Date: Sun, 21 Jun 2015 21:20:16 -0700
gdb-bridge: small fixes and improvements
- correctly detect closed socket
- return reasonable values for threadlist and threadstate queries
- don't grumble about unsupported packets we intentionally do not support
Diffstat:
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/tools/gdb-bridge.c b/tools/gdb-bridge.c
@@ -244,7 +244,20 @@ static const char *target_xml =
"</target>";
static void handle_query(struct gdbcnxn *gc, char *cmd, char *args) {
- if (!strcmp(cmd,"Rcmd")) {
+ if (!strcmp(cmd, "fThreadInfo")) {
+ /* report just one thread id, #1, for now */
+ gdb_puts(gc, "m1");
+ } else if(!strcmp(cmd, "sThreadInfo")) {
+ /* no additional thread ids */
+ gdb_puts(gc, "l");
+ } else if(!strcmp(cmd, "ThreadExtraInfo")) {
+ /* gdb manual suggest 'Runnable', 'Blocked on Mutex', etc */
+ /* informational text shown in gdb's "info threads" listing */
+ gdb_puthex(gc, "Native", 6);
+ } else if(!strcmp(cmd, "C")) {
+ /* current thread ID */
+ gdb_puts(gc, "QC1");
+ } else if (!strcmp(cmd, "Rcmd")) {
char *p = args;
cmd = p;
while (p[0] && p[1]) {
@@ -257,7 +270,7 @@ static void handle_query(struct gdbcnxn *gc, char *cmd, char *args) {
gdb_puts(gc,
"qXfer:features:read+"
";QStartNoAckMode+"
- ";PacketSize=2000"
+ ";PacketSize=2004" /* size includes "$" and "#xx" */
);
} else if(!strcmp(cmd, "Xfer")) {
if (!strncmp(args, "features:read:target.xml:", 25)) {
@@ -265,6 +278,10 @@ static void handle_query(struct gdbcnxn *gc, char *cmd, char *args) {
// todo: support binary format w/ escaping
gdb_puts(gc, target_xml);
}
+ } else if(!strcmp(cmd, "TStatus")) {
+ /* tracepoints unsupported. ignore. */
+ } else if(!strcmp(cmd, "Attached")) {
+ /* no process management. ignore */
} else {
zprintf("GDB: unsupported: q%s:%s\n", cmd, args);
}
@@ -365,7 +382,7 @@ void gdb_server(int fd) {
for (;;) {
r = read(fd, iobuf, sizeof(iobuf));
- if (r < 0) {
+ if (r <= 0) {
if (errno == EINTR) continue;
return;
}