[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