From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18320 invoked by alias); 13 Nov 2008 22:54:16 -0000 Received: (qmail 17795 invoked by uid 22791); 13 Nov 2008 22:54:13 -0000 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.31) with ESMTP; Thu, 13 Nov 2008 22:53:36 +0000 Received: from mailhost2.vmware.com (mailhost2.vmware.com [10.16.67.167]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id 9266431010; Thu, 13 Nov 2008 14:53:34 -0800 (PST) Received: from [10.20.92.59] (promb-2s-dhcp59.eng.vmware.com [10.20.92.59]) by mailhost2.vmware.com (Postfix) with ESMTP id 7BDFB8E56F; Thu, 13 Nov 2008 14:53:34 -0800 (PST) Message-ID: <491CAFDF.7060109@vmware.com> Date: Fri, 14 Nov 2008 07:03:00 -0000 From: Michael Snyder User-Agent: Thunderbird 1.5.0.12 (X11/20080411) MIME-Version: 1.0 To: Pedro Alves CC: "gdb-patches@sourceware.org" Subject: Re: [RFC] Warn about what will happen to all inferiors on "quit" References: <200811132155.16758.pedro@codesourcery.com> In-Reply-To: <200811132155.16758.pedro@codesourcery.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit 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/msg00309.txt.bz2 I wonder if you might want to iterate thru the attached/child processes, and give the user a choice about what to do with each one? Pedro Alves wrote: > Currently, when GDB is debugging an attached inferior and the user > does "quit", GDB is currently querying: > > (gdb) q > The program is running. Quit anyway (and detach it)? (y or n) > > If you spawned a child instead of attaching, you get: > > (gdb) q > The program is running. Quit anyway (and kill it)? (y or n) > > Now, if GDB is debugging multiple inferiors, say, inferior 1 was > created by "target extended-remote", inferior 2 was created by a following > "run", and inferior 3 was created by a further "attach", and you > have inferior 3 currently selected, if you again do "quit", you > still get the same: > > (gdb) q > The program is running. Quit anyway (and detach it)? (y or n) > > But this time, if you answer "y", GDB will kill inferior 1, kill > inferior 2, and, detach from inferior 3. There was no hint that > GDB was going to kill two inferiors, which ends up being > quite surprising. > > The attached patch changes GDB's output to something like: > > (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) > > Or: > > (gdb) q > A debugging session is active. > > Inferior 1 [process 22005] will be detached. > > Do you still want to close the debugger? (y or n) > > Or in the multi-inferior case: > > (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? > > Tested on x86-64-unknown-linux-gnu native and against > gdbserver. > > > > ------------------------------------------------------------------------ > > 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 | 101 ++++++++++++++++++++-------- > 4 files changed, 76 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-13 21:54:19.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,79 @@ kill_or_detach (struct inferior *inf, vo > return 0; > } > > +struct piqa_args > +{ > + int count; > + struct ui_file *stb; > +}; > + > +static int > +print_inferior_quit_action (struct inferior *inf, void *arg) > +{ > + struct piqa_args *args = arg; > + > + /* 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. */ > + if (++args->count >= 1) > + return 1; > + > + 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; > + 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); > + > + args.count = -10; /* max displayed is mod(count) */ > + > + fprintf_filtered (args.stb, _("A debugging session is active.\n\n")); > + > + iterate_over_inferiors (print_inferior_quit_action, &args); > + > + if (args.count > 0) > + fprintf_filtered (args.stb, _("\n\t... (%d inferior(s) more)\n"), > + args.count); > + > + 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 > }