[RFA] print target_wait result if debug_infrun
Doug Evans
dje@google.com
Sun Feb 1 22:21:00 GMT 2009
Hi.
Debugging infrun is a bit of a pain because one also needs to enable
"debug target" to get useful data like the result of target_wait,
but enabling the latter vastly reduces the S/N ratio of the debug output
because of all the "child:target_xfer_partial" lines in the output.
Plus target debugging can't be enabled/disabled on the fly like
infrun debugging can be.
This patch does two things:
- adds printing of the result of target_wait to the output of infrun
debugging without having to enable target debugging
- adds missing entries for TARGET_WAITKIND_SYSCALL_ENTRY,
TARGET_WAITKIND_SYSCALL_RETURN, TARGET_WAITKIND_IGNORE,
TARGET_WAITKIND_NO_HISTORY to the debug output
The patch does cause the result of target_wait to be printed twice
if both infrun and target debugging are on. It's a miniscule price to pay.
Ok to check in?
2009-02-01 Doug Evans <dje@google.com>
* target.h (target_waitstatus_to_string): Declare.
* target.c (target_waitstatus_to_string): New function. Copied from
debug_to_wait. Add missing entries for TARGET_WAITKIND_SYSCALL_ENTRY,
TARGET_WAITKIND_SYSCALL_RETURN, case TARGET_WAITKIND_IGNORE,
TARGET_WAITKIND_NO_HISTORY.
(debug_to_wait): Call it.
* infrun.c (wait_for_inferior): If debug_infrun, print result of
target_wait.
(fetch_inferior_event): Ditto.
Index: target.h
===================================================================
RCS file: /cvs/src/src/gdb/target.h,v
retrieving revision 1.140
diff -u -p -u -r1.140 target.h
--- target.h 15 Jan 2009 22:07:19 -0000 1.140
+++ target.h 1 Feb 2009 22:04:05 -0000
@@ -151,6 +151,10 @@ struct target_waitstatus
value;
};
+/* Return a pretty printed form of target_waitstatus.
+ Space for the result is malloc'd, caller must free. */
+extern char *target_waitstatus_to_string (const struct target_waitstatus *);
+
/* Possible types of events that the inferior handler will have to
deal with. */
enum inferior_event_type
Index: target.c
===================================================================
RCS file: /cvs/src/src/gdb/target.c,v
retrieving revision 1.195
diff -u -p -u -r1.195 target.c
--- target.c 11 Jan 2009 13:23:42 -0000 1.195
+++ target.c 1 Feb 2009 22:04:05 -0000
@@ -2603,50 +2603,63 @@ debug_to_resume (ptid_t ptid, int step,
target_signal_to_name (siggnal));
}
-static ptid_t
-debug_to_wait (ptid_t ptid, struct target_waitstatus *status)
-{
- ptid_t retval;
+/* Return a pretty printed form of target_waitstatus.
+ Space for the result is malloc'd, caller must free. */
- retval = debug_target.to_wait (ptid, status);
+char *
+target_waitstatus_to_string (const struct target_waitstatus *ws)
+{
+ const char *kind_str = "status->kind = ";
- fprintf_unfiltered (gdb_stdlog,
- "target_wait (%d, status) = %d, ", PIDGET (ptid),
- PIDGET (retval));
- fprintf_unfiltered (gdb_stdlog, "status->kind = ");
- switch (status->kind)
+ switch (ws->kind)
{
case TARGET_WAITKIND_EXITED:
- fprintf_unfiltered (gdb_stdlog, "exited, status = %d\n",
- status->value.integer);
- break;
+ return xstrprintf ("%sexited, status = %d",
+ kind_str, ws->value.integer);
case TARGET_WAITKIND_STOPPED:
- fprintf_unfiltered (gdb_stdlog, "stopped, signal = %s\n",
- target_signal_to_name (status->value.sig));
- break;
+ return xstrprintf ("%sstopped, signal = %s",
+ kind_str, target_signal_to_name (ws->value.sig));
case TARGET_WAITKIND_SIGNALLED:
- fprintf_unfiltered (gdb_stdlog, "signalled, signal = %s\n",
- target_signal_to_name (status->value.sig));
- break;
+ return xstrprintf ("%ssignalled, signal = %s",
+ kind_str, target_signal_to_name (ws->value.sig));
case TARGET_WAITKIND_LOADED:
- fprintf_unfiltered (gdb_stdlog, "loaded\n");
- break;
+ return xstrprintf ("%sloaded", kind_str);
case TARGET_WAITKIND_FORKED:
- fprintf_unfiltered (gdb_stdlog, "forked\n");
- break;
+ return xstrprintf ("%sforked", kind_str);
case TARGET_WAITKIND_VFORKED:
- fprintf_unfiltered (gdb_stdlog, "vforked\n");
- break;
+ return xstrprintf ("%svforked", kind_str);
case TARGET_WAITKIND_EXECD:
- fprintf_unfiltered (gdb_stdlog, "execd\n");
- break;
+ return xstrprintf ("%sexecd", kind_str);
+ case TARGET_WAITKIND_SYSCALL_ENTRY:
+ return xstrprintf ("%ssyscall-entry", kind_str);
+ case TARGET_WAITKIND_SYSCALL_RETURN:
+ return xstrprintf ("%ssyscall-return", kind_str);
case TARGET_WAITKIND_SPURIOUS:
- fprintf_unfiltered (gdb_stdlog, "spurious\n");
- break;
+ return xstrprintf ("%sspurious", kind_str);
+ case TARGET_WAITKIND_IGNORE:
+ return xstrprintf ("%signore", kind_str);
+ case TARGET_WAITKIND_NO_HISTORY:
+ return xstrprintf ("%sno-history", kind_str);
default:
- fprintf_unfiltered (gdb_stdlog, "unknown???\n");
- break;
+ return xstrprintf ("%sunknown???", kind_str);
}
+}
+
+static ptid_t
+debug_to_wait (ptid_t ptid, struct target_waitstatus *status)
+{
+ ptid_t retval;
+ char *status_string;
+
+ retval = debug_target.to_wait (ptid, status);
+
+ fprintf_unfiltered (gdb_stdlog,
+ "target_wait (%d, status) = %d, ", PIDGET (ptid),
+ PIDGET (retval));
+
+ status_string = target_waitstatus_to_string (status);
+ fprintf_unfiltered (gdb_stdlog, "%s\n", status_string);
+ xfree (status_string);
return retval;
}
Index: infrun.c
===================================================================
RCS file: /cvs/src/src/gdb/infrun.c,v
retrieving revision 1.355
diff -u -p -u -r1.355 infrun.c
--- infrun.c 24 Jan 2009 19:17:24 -0000 1.355
+++ infrun.c 1 Feb 2009 22:04:05 -0000
@@ -1789,6 +1789,16 @@ wait_for_inferior (int treat_exec_as_sig
else
ecs->ptid = target_wait (waiton_ptid, &ecs->ws);
+ if (debug_infrun)
+ {
+ char *status_string = target_waitstatus_to_string (&ecs->ws);
+ fprintf_unfiltered (gdb_stdlog,
+ "infrun: target_wait (%d, status) = %d, %s\n",
+ PIDGET (waiton_ptid), PIDGET (ecs->ptid),
+ status_string);
+ xfree (status_string);
+ }
+
if (treat_exec_as_sigtrap && ecs->ws.kind == TARGET_WAITKIND_EXECD)
{
xfree (ecs->ws.value.execd_pathname);
@@ -1864,6 +1874,16 @@ fetch_inferior_event (void *client_data)
else
ecs->ptid = target_wait (waiton_ptid, &ecs->ws);
+ if (debug_infrun)
+ {
+ char *status_string = target_waitstatus_to_string (&ecs->ws);
+ fprintf_unfiltered (gdb_stdlog,
+ "infrun: target_wait (%d, status) = %d, %s\n",
+ PIDGET (waiton_ptid), PIDGET (ecs->ptid),
+ status_string);
+ xfree (status_string);
+ }
+
if (non_stop
&& ecs->ws.kind != TARGET_WAITKIND_IGNORE
&& ecs->ws.kind != TARGET_WAITKIND_EXITED
More information about the Gdb-patches
mailing list