From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22072 invoked by alias); 1 Feb 2009 22:21:55 -0000 Received: (qmail 22064 invoked by uid 22791); 1 Feb 2009 22:21:53 -0000 X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL,BAYES_00,SPF_PASS X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.33.17) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 01 Feb 2009 22:21:49 +0000 Received: from zps18.corp.google.com (zps18.corp.google.com [172.25.146.18]) by smtp-out.google.com with ESMTP id n11MLj4h003771 for ; Sun, 1 Feb 2009 22:21:45 GMT Received: from localhost (ruffy.corp.google.com [172.18.118.116]) by zps18.corp.google.com with ESMTP id n11MLh2r032180 for ; Sun, 1 Feb 2009 14:21:43 -0800 Received: by localhost (Postfix, from userid 67641) id 100941C7A19; Sun, 1 Feb 2009 14:21:42 -0800 (PST) To: gdb-patches@sourceware.org Subject: [RFA] print target_wait result if debug_infrun Message-Id: <20090201222143.100941C7A19@localhost> Date: Sun, 01 Feb 2009 22:21:00 -0000 From: dje@google.com (Doug Evans) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-02/txt/msg00014.txt.bz2 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 * 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