From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24750 invoked by alias); 25 Feb 2011 22:10:11 -0000 Received: (qmail 24742 invoked by uid 22791); 25 Feb 2011 22:10:09 -0000 X-SWARE-Spam-Status: No, hits=-4.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp-outbound-2.vmware.com (HELO smtp-outbound-2.vmware.com) (65.115.85.73) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 25 Feb 2011 22:10:03 +0000 Received: from mailhost2.vmware.com (mailhost2.vmware.com [10.16.67.167]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id 27A7144003; Fri, 25 Feb 2011 14:10:02 -0800 (PST) Received: from msnyder-server.eng.vmware.com (promd-2s-dhcp138.eng.vmware.com [10.20.124.138]) by mailhost2.vmware.com (Postfix) with ESMTP id 14C898EE53; Fri, 25 Feb 2011 14:10:02 -0800 (PST) Message-ID: <4D6828B9.2000000@vmware.com> Date: Fri, 25 Feb 2011 22:30:00 -0000 From: Michael Snyder User-Agent: Thunderbird 2.0.0.24 (X11/20101201) MIME-Version: 1.0 To: Pedro Alves CC: "gdb-patches@sourceware.org" Subject: Re: [rfa] Use get_number_or_range for kill inferior etc. References: <4D680E45.50607@vmware.com> <201102252051.36471.pedro@codesourcery.com> In-Reply-To: <201102252051.36471.pedro@codesourcery.com> Content-Type: multipart/mixed; boundary="------------080008050508010902060604" 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: 2011-02/txt/msg00782.txt.bz2 This is a multi-part message in MIME format. --------------080008050508010902060604 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit Content-length: 986 Pedro Alves wrote: > On Friday 25 February 2011 20:17:09, Michael Snyder wrote: >> - tp = any_thread_of_process (pid); >> - if (!tp) >> - error (_("Inferior has no threads.")); >> + tp = any_thread_of_process (pid); >> + if (!tp) >> + error (_("Inferior has no threads.")); > > This is fine with me, but I think all the errors should > be updated to include the inferior ID that caused the > trouble. > >> error (_("Requires argument (inferior id to detach)")); > > Probably want to make these plural as well. > > On Friday 25 February 2011 20:17:09, Michael Snyder wrote: >> +gdb_test_no_output "remove-inferior 2-3" "remove-inferior 2-3" > > Plural? > > If you only have say inferiors 1, 3 and 5, these commands will > error out if you do 'CMD 1-5', claiming 2 or 4 are invalid. > Not sure that's user friendly. > > And you'll need to update the docs as well, at least > because you renamed some commands. Good feedbacks. Revised patch attached. --------------080008050508010902060604 Content-Type: text/plain; name="remove.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="remove.txt" Content-length: 10197 2011-02-25 Michael Snyder * inferior.c (detach_inferior_command): Use get_number_or_range. (kill_inferior_command): Ditto. (remove_inferior_command): Ditto. (initialize_inferiors): Make command names plural. Update help strings. 2011-02-25 Michael Snyder * gdb.texinfo (Inferiors and Programs): Update commands to show that they can accept multiple arguments. 2011-02-25 Michael Snyder * gdb.multi/base.exp: Add test for remove-inferiors. Index: inferior.c =================================================================== RCS file: /cvs/src/src/gdb/inferior.c,v retrieving revision 1.24 diff -u -p -u -p -r1.24 inferior.c --- inferior.c 25 Feb 2011 19:19:25 -0000 1.24 +++ inferior.c 25 Feb 2011 22:05:57 -0000 @@ -624,22 +624,31 @@ detach_inferior_command (char *args, int struct thread_info *tp; if (!args || !*args) - error (_("Requires argument (inferior id to detach)")); + error (_("Requires argument (inferior id(s) to detach)")); - num = parse_and_eval_long (args); + while (*args != '\0') + { + num = get_number_or_range (&args); - if (!valid_gdb_inferior_id (num)) - error (_("Inferior ID %d not known."), num); + if (!valid_gdb_inferior_id (num)) + { + warning (_("Inferior ID %d not known."), num); + continue; + } - pid = gdb_inferior_id_to_pid (num); + pid = gdb_inferior_id_to_pid (num); - tp = any_thread_of_process (pid); - if (!tp) - error (_("Inferior has no threads.")); + tp = any_thread_of_process (pid); + if (!tp) + { + warning (_("Inferior ID %d has no threads."), num); + continue; + } - switch_to_thread (tp->ptid); + switch_to_thread (tp->ptid); - detach_command (NULL, from_tty); + detach_command (NULL, from_tty); + } } static void @@ -649,22 +658,31 @@ kill_inferior_command (char *args, int f struct thread_info *tp; if (!args || !*args) - error (_("Requires argument (inferior id to kill)")); + error (_("Requires argument (inferior id(s) to kill)")); - num = parse_and_eval_long (args); + while (*args != '\0') + { + num = get_number_or_range (&args); - if (!valid_gdb_inferior_id (num)) - error (_("Inferior ID %d not known."), num); + if (!valid_gdb_inferior_id (num)) + { + warning (_("Inferior ID %d not known."), num); + continue; + } - pid = gdb_inferior_id_to_pid (num); + pid = gdb_inferior_id_to_pid (num); - tp = any_thread_of_process (pid); - if (!tp) - error (_("Inferior has no threads.")); + tp = any_thread_of_process (pid); + if (!tp) + { + warning (_("Inferior ID %d has no threads."), num); + continue; + } - switch_to_thread (tp->ptid); + switch_to_thread (tp->ptid); - target_kill (); + target_kill (); + } bfd_cache_close_all (); } @@ -740,19 +758,34 @@ remove_inferior_command (char *args, int int num; struct inferior *inf; - num = parse_and_eval_long (args); - inf = find_inferior_id (num); + if (args == NULL || *args == '\0') + error (_("Requires an argument (inferior id(s) to remove)")); - if (inf == NULL) - error (_("Inferior ID %d not known."), num); + while (*args != '\0') + { + num = get_number_or_range (&args); + inf = find_inferior_id (num); - if (inf == current_inferior ()) - error (_("Can not remove current symbol inferior.")); + if (inf == NULL) + { + warning (_("Inferior ID %d not known."), num); + continue; + } + + if (inf == current_inferior ()) + { + warning (_("Can not remove current symbol inferior %d."), num); + continue; + } - if (inf->pid != 0) - error (_("Can not remove an active inferior.")); + if (inf->pid != 0) + { + warning (_("Can not remove active inferior %d."), num); + continue; + } - delete_inferior_1 (inf, 1); + delete_inferior_1 (inf, 1); + } } struct inferior * @@ -1048,13 +1081,13 @@ initialize_inferiors (void) add_com ("add-inferior", no_class, add_inferior_command, _("\ Add a new inferior.\n\ Usage: add-inferior [-copies ] [-exec ]\n\ -N is the optional number of inferior to add, default is 1.\n\ +N is the optional number of inferiors to add, default is 1.\n\ FILENAME is the file name of the executable to use\n\ as main program.")); - add_com ("remove-inferior", no_class, remove_inferior_command, _("\ -Remove inferior ID.\n\ -Usage: remove-inferior ID")); + add_com ("remove-inferiors", no_class, remove_inferior_command, _("\ +Remove inferior ID (or list of IDs).\n\ +Usage: remove-inferiors ID...")); add_com ("clone-inferior", no_class, clone_inferior_command, _("\ Clone inferior ID.\n\ @@ -1064,12 +1097,12 @@ executable loaded as the copied inferior adds 1 copy. If ID is not specified, it is the current inferior\n\ that is cloned.")); - add_cmd ("inferior", class_run, detach_inferior_command, _("\ -Detach from inferior ID."), + add_cmd ("inferiors", class_run, detach_inferior_command, _("\ +Detach from inferior ID (or list of IDS)."), &detachlist); - add_cmd ("inferior", class_run, kill_inferior_command, _("\ -Kill inferior ID."), + add_cmd ("inferiors", class_run, kill_inferior_command, _("\ +Kill inferior ID (or list of IDs)."), &killlist); add_cmd ("inferior", class_run, inferior_command, _("\ Index: doc/gdb.texinfo =================================================================== RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v retrieving revision 1.805 diff -u -p -u -p -r1.805 gdb.texinfo --- doc/gdb.texinfo 24 Feb 2011 07:38:00 -0000 1.805 +++ doc/gdb.texinfo 25 Feb 2011 22:05:58 -0000 @@ -2465,7 +2465,7 @@ You can get multiple executables into a systems @value{GDBN} can add inferiors to the debug session automatically by following calls to @code{fork} and @code{exec}. To remove inferiors from the debugging session use the -@w{@code{remove-inferior}} command. +@w{@code{remove-inferiors}} command. @table @code @kindex add-inferior @@ -2498,37 +2498,37 @@ Added inferior 2. You can now simply switch focus to inferior 2 and run it. -@kindex remove-inferior -@item remove-inferior @var{infno} -Removes the inferior @var{infno}. It is not possible to remove an -inferior that is running with this command. For those, use the -@code{kill} or @code{detach} command first. +@kindex remove-inferiors +@item remove-inferiors @var{infno}@dots{} +Removes the inferior or inferiors @var{infno}@dots{}. It is not +possible to remove an inferior that is running with this command. For +those, use the @code{kill} or @code{detach} command first. @end table To quit debugging one of the running inferiors that is not the current inferior, you can either detach from it by using the @w{@code{detach inferior}} command (allowing it to run independently), or kill it -using the @w{@code{kill inferior}} command: +using the @w{@code{kill inferiors}} command: @table @code -@kindex detach inferior @var{infno} -@item detach inferior @var{infno} -Detach from the inferior identified by @value{GDBN} inferior number -@var{infno}. Note that the inferior's entry still stays on the list -of inferiors shown by @code{info inferiors}, but its Description will -show @samp{}. - -@kindex kill inferior @var{infno} -@item kill inferior @var{infno} -Kill the inferior identified by @value{GDBN} inferior number -@var{infno}. Note that the inferior's entry still stays on the list -of inferiors shown by @code{info inferiors}, but its Description will -show @samp{}. +@kindex detach inferiors @var{infno}@dots{} +@item detach inferior @var{infno}@dots{} +Detach from the inferior or inferiors identified by @value{GDBN} +inferior number(s) @var{infno}@dots. Note that the inferior's entry +still stays on the list of inferiors shown by @code{info inferiors}, +but its Description will show @samp{}. + +@kindex kill inferiors @var{infno}@dots{} +@item kill inferiors @var{infno}@dots{} +Kill the inferior or inferiors identified by @value{GDBN} inferior +number(s) @var{infno}@dots{}. Note that the inferior's entry still +stays on the list of inferiors shown by @code{info inferiors}, but its +Description will show @samp{}. @end table After the successful completion of a command such as @code{detach}, -@code{detach inferior}, @code{kill} or @code{kill inferior}, or after +@code{detach inferiors}, @code{kill} or @code{kill inferiors}, or after a normal process exit, the inferior is still valid and listed with @code{info inferiors}, ready to be restarted. @@ -2986,8 +2986,8 @@ to another by using the @code{inferior} Programs, ,Debugging Multiple Inferiors and Programs}). To quit debugging one of the forked processes, you can either detach -from it by using the @w{@code{detach inferior}} command (allowing it -to run independently), or kill it using the @w{@code{kill inferior}} +from it by using the @w{@code{detach inferiors}} command (allowing it +to run independently), or kill it using the @w{@code{kill inferiors}} command. @xref{Inferiors and Programs, ,Debugging Multiple Inferiors and Programs}. Index: testsuite/gdb.multi/base.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.multi/base.exp,v retrieving revision 1.8 diff -u -p -u -p -r1.8 base.exp --- testsuite/gdb.multi/base.exp 25 Feb 2011 19:19:26 -0000 1.8 +++ testsuite/gdb.multi/base.exp 25 Feb 2011 22:05:58 -0000 @@ -156,3 +156,34 @@ if { ![runto_main] } then { gdb_test "break hello" ".*" gdb_test "continue" "Breakpoint \[0-9\].*, hello.*" + +# Now let's remove the other two + +gdb_test_no_output "remove-inferiors 2-3" "remove-inferiors 2-3" + +set see1 0 +set see2 0 +set see3 0 + +gdb_test_multiple "info inferiors" "check remove-inferiors" { + -re ". 3 \[^\r\n\]*${exec3}" { + set see3 1 + exp_continue + } + -re ". 2 \[^\r\n\]*${exec2}" { + set see2 1 + exp_continue + } + -re ". 1 \[^\r\n\]*${exec1}" { + set see1 1 + exp_continue + } + -re "$gdb_prompt $" { + if { $see1 && !$see2 && !$see3 } then { + pass "check remove-inferiors" + } else { + fail "check remove-inferiors" + } + } +} + --------------080008050508010902060604--