From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9359 invoked by alias); 14 Nov 2008 19:44:36 -0000 Received: (qmail 9255 invoked by uid 22791); 14 Nov 2008 19:44:34 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 14 Nov 2008 19:43:59 +0000 Received: (qmail 29438 invoked from network); 14 Nov 2008 19:43:57 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 14 Nov 2008 19:43:57 -0000 From: Pedro Alves To: Joel Brobecker Subject: [RFA] Re: [RFC] Warn about what will happen to all inferiors on "quit" Date: Sat, 15 Nov 2008 16:11:00 -0000 User-Agent: KMail/1.9.10 Cc: gdb-patches@sourceware.org References: <200811132155.16758.pedro@codesourcery.com> <20081113225817.GO5112@adacore.com> In-Reply-To: <20081113225817.GO5112@adacore.com> MIME-Version: 1.0 Content-Disposition: inline Content-Type: Multipart/Mixed; boundary="Boundary-00=_LUdHJqtvr7s4yUF" Message-Id: <200811141944.11647.pedro@codesourcery.com> 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: 2008-11/txt/msg00372.txt.bz2 --Boundary-00=_LUdHJqtvr7s4yUF Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 1393 On Thursday 13 November 2008 22:58:17, Joel Brobecker wrote: > > (gdb) q > > A debugging session is active. > > > > Inferior 1 [process 17555] will be killed. > > > > Do you still want to close the debugger? (y or n) > [...] > > (gdb) q > > A debugging session is active. > > > > Inferior 1 [process 22005] will be killed. > > Inferior 2 [process 22323] will be killed. > > Inferior 3 [process 22656] will be detached. > > > > Do you still want to close the debugger? (y or n) > > > > What do you think of something like that? > > That looks pretty good to me :). > > > +struct piqa_args > > +{ > > + int count; > > + struct ui_file *stb; > > +}; > > Hmmm, given the relatively cryptic name of the structure, a little > comment explaining what it's for would probably be useful... You're right --- those are the initials to print_inferior_quit_action :-). I'm not sure if there's a standard to name these things. print_inferior_quit_action_args seemed rather longuish, just I can change to anything, no problem. Here's an updated patch that adds some more commenting and makes things a bit clearer codewise, I guess. I've also updated the output a wee bit in the case where there are just too many inferiors to print --- now it tells how many extra will be detached or killed, instead of just saying how many there are. -- Pedro Alves --Boundary-00=_LUdHJqtvr7s4yUF Content-Type: text/x-diff; charset="iso 8859-15"; name="show_all_inferiors.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="show_all_inferiors.diff" Content-length: 6881 2008-11-13 Pedro Alves gdb/ * top.c (struct piqa_args): New. (print_inferior_quit_action): New. (quit_confirm): Rewrite to print info about all inferiors. 2008-11-13 Pedro Alves gdb/testsuite/ * gdb.threads/killed.exp, gdb.threads/manythreads.exp, gdb.threads/staticthreads.exp: Adjust. --- gdb/testsuite/gdb.threads/killed.exp | 2 gdb/testsuite/gdb.threads/manythreads.exp | 2 gdb/testsuite/gdb.threads/staticthreads.exp | 2 gdb/top.c | 143 ++++++++++++++++++++++------ 4 files changed, 118 insertions(+), 31 deletions(-) Index: src/gdb/top.c =================================================================== --- src.orig/gdb/top.c 2008-11-13 21:36:56.000000000 +0000 +++ src/gdb/top.c 2008-11-14 16:17:40.000000000 +0000 @@ -1176,34 +1176,6 @@ set_prompt (char *s) } -/* If necessary, make the user confirm that we should quit. Return - non-zero if we should quit, zero if we shouldn't. */ - -int -quit_confirm (void) -{ - if (! ptid_equal (inferior_ptid, null_ptid) && target_has_execution) - { - char *s; - struct inferior *inf = current_inferior (); - - /* This is something of a hack. But there's no reliable way to - see if a GUI is running. The `use_windows' variable doesn't - cut it. */ - if (deprecated_init_ui_hook) - s = "A debugging session is active.\nDo you still want to close the debugger?"; - else if (inf->attach_flag) - s = "The program is running. Quit anyway (and detach it)? "; - else - s = "The program is running. Quit anyway (and kill it)? "; - - if (!query ("%s", s)) - return 0; - } - - return 1; -} - struct qt_args { char *args; @@ -1246,6 +1218,121 @@ kill_or_detach (struct inferior *inf, vo return 0; } +/* Arguments passed to print_inferior_quit_action. */ + +struct piqa_args +{ + /* Inferiors left to print, when this reaches 0, stop printing, and + start counting kills and detaches. */ + int slots_left; + + /* Number of inferiors that weren't printed, and going to be + killed. */ + int kills; + + /* Number of inferior that weren't printed, and are going to be + detached. */ + int detaches; + + /* Output is collected here. */ + struct ui_file *stb; +}; + +/* Callback for iterate_over_inferiors. Prints info about what GDB + will do to each inferior on a "quit". ARG points to a struct + piqa_args instance. */ + +static int +print_inferior_quit_action (struct inferior *inf, void *arg) +{ + struct piqa_args *args = arg; + + if (args->slots_left == 0) + { + if (inf->attach_flag) + args->detaches++; + else + args->kills++; + } + else + { + args->slots_left--; + + if (inf->attach_flag) + fprintf_filtered (args->stb, + _("\tInferior %d [%s] will be detached.\n"), inf->num, + target_pid_to_str (pid_to_ptid (inf->pid))); + else + fprintf_filtered (args->stb, + _("\tInferior %d [%s] will be killed.\n"), inf->num, + target_pid_to_str (pid_to_ptid (inf->pid))); + } + + return 0; +} + +/* If necessary, make the user confirm that we should quit. Return + non-zero if we should quit, zero if we shouldn't. */ + +int +quit_confirm (void) +{ + /* Don't ask if we're debugging a core file inferior. */ + if (have_inferiors () && target_has_execution) + { + struct piqa_args args = {0}; + struct cleanup *old_chain; + char *str; + long length; + int qr; + + /* The GUI will most likely place the whole query in a dialog + box. Make sure the query string is fully built as a single + string. */ + args.stb = mem_fileopen (); + old_chain = make_cleanup_ui_file_delete (args.stb); + + /* Don't print more than a few entries, in case the user is + trying to bail out with many inferiors and this paginates, or + if this is going to be displayed by a GUI in a dialog + box. */ + args.slots_left = 10; + + fprintf_filtered (args.stb, _("A debugging session is active.\n\n")); + + iterate_over_inferiors (print_inferior_quit_action, &args); + + /* Still give an idea what will happen to the rest of the + inferiors that weren't displayed. */ + if (args.kills != 0 && args.detaches != 0) + fprintf_filtered (args.stb, + _("\ +\n\t... %d inferior(s) more (of those, killing %d and detaching %d).\n"), + args.kills + args.detaches, + args.kills, args.detaches); + else if (args.kills != 0) + fprintf_filtered (args.stb, + _("\n\t... %d inferior(s) more will be killed.\n"), + args.kills); + else if (args.detaches != 0) + fprintf_filtered (args.stb, + _("\n\t... %d inferior(s) more will be detached.\n"), + args.detaches); + + fprintf_filtered (args.stb, + _("\nDo you still want to close the debugger? ")); + + str = ui_file_xstrdup (args.stb, &length); + make_cleanup (xfree, str); + + qr = query ("%s", str); + do_cleanups (old_chain); + return qr; + } + + return 1; +} + /* Helper routine for quit_force that requires error handling. */ static int Index: src/gdb/testsuite/gdb.threads/killed.exp =================================================================== --- src.orig/gdb/testsuite/gdb.threads/killed.exp 2008-11-13 21:36:56.000000000 +0000 +++ src/gdb/testsuite/gdb.threads/killed.exp 2008-11-13 21:36:57.000000000 +0000 @@ -87,7 +87,7 @@ gdb_expect { # Try to quit. send_gdb "quit\n" gdb_expect { - -re "The program is running. Quit anyway \\(and kill it\\)\\? \\(y or n\\) $" { + -re "\\(y or n\\) $" { send_gdb "y\n" exp_continue } Index: src/gdb/testsuite/gdb.threads/manythreads.exp =================================================================== --- src.orig/gdb/testsuite/gdb.threads/manythreads.exp 2008-11-13 21:36:56.000000000 +0000 +++ src/gdb/testsuite/gdb.threads/manythreads.exp 2008-11-13 21:36:57.000000000 +0000 @@ -160,7 +160,7 @@ gdb_test_multiple "" "stop threads 2" { } gdb_test_multiple "quit" "GDB exits after stopping multithreaded program" { - -re "The program is running. Quit anyway \\(and kill it\\)\\? \\(y or n\\) $" { + -re "\\(y or n\\) $" { send_gdb "y\n" exp_continue } Index: src/gdb/testsuite/gdb.threads/staticthreads.exp =================================================================== --- src.orig/gdb/testsuite/gdb.threads/staticthreads.exp 2008-11-13 21:36:56.000000000 +0000 +++ src/gdb/testsuite/gdb.threads/staticthreads.exp 2008-11-13 21:36:57.000000000 +0000 @@ -91,7 +91,7 @@ gdb_test_multiple "info threads" "$test" set test "GDB exits with static thread program" gdb_test_multiple "quit" "$test" { - -re "The program is running. Quit anyway \\(and kill it\\)\\? \\(y or n\\) $" { + -re "\\(y or n\\) $" { send_gdb "y\n" exp_continue } --Boundary-00=_LUdHJqtvr7s4yUF--