This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH v4] Enable 'set print inferior-events' and improve detach/fork/kill/exit messages
- From: Sergio Durigan Junior <sergiodj at redhat dot com>
- To: GDB Patches <gdb-patches at sourceware dot org>
- Cc: Jan Kratochvil <jan dot kratochvil at redhat dot com>, Pedro Alves <palves at redhat dot com>
- Date: Thu, 05 Apr 2018 17:32:20 -0400
- Subject: Re: [PATCH v4] Enable 'set print inferior-events' and improve detach/fork/kill/exit messages
- References: <20180124194714.26222-1-sergiodj@redhat.com> <20180405184648.3055-1-sergiodj@redhat.com>
On Thursday, April 05 2018, I wrote:
> Changes from v3:
>
> - Revisited commit log and fixed wrong copy&paste from GDB output.
>
> - Use target_pid_to_str where applicable. Use
> gdb::unique_xmalloc_ptr<char> to save results from
> target_pid_to_str in some cases.
>
> - Add comment on testsuite about not being able to run on target
> remote stubs.
>
> - Try another approach on gdb.threads/process-dies-while-detaching.exp
> in order to avoid racy conditions with GDB output.
Sorry, this patch has a few regressions I forgot to fix. I thought it
was regression-free, but I'm now seeing the BuildBot messages. I'll
send an updated patch soon.
>
> This is a followup of Pedro's suggestion to turn 'set print
> inferior-events' always on, and do some cleanup on the messages
> printed by GDB when various inferior events happen (attach, detach,
> fork, kill, exit).
>
> To make sure that the patch is correct, I've tested it with a handful
> of combinations of 'set follow-fork-mode', 'set detach-on-fork' and
> 'set print inferior-events'. In the end, I decided to make my
> hand-made test into an official testcase. More on that below.
>
> Using the following program as an example:
>
> #include <unistd.h>
> int main ()
> {
> fork ();
> return 0;
> }
>
> We see the following outputs from the patched GDB:
>
> - With 'set print inferior-events on':
>
> (gdb) r
> Starting program: a.out
> [Detaching after fork from child process 27749]
> [Inferior 1 (process 27745) exited normally]
> (gdb)
>
> - With 'set print inferior-events off':
>
> (gdb) r
> Starting program: a.out
> [Inferior 1 (process 27823) exited normally]
> (gdb)
>
> Comparing this against an unpatched GDB:
>
> - With 'set print inferior-events off' and 'set follow-fork-mode
> child':
>
> (gdb) r
> Starting program: a.out
> [Inferior 2 (process 5993) exited normally]
> (gdb)
>
> Compare this against an unpatched GDB:
>
> (unpatched-gdb) r
> Starting program: a.out
> [New process 5702]
> [Inferior 2 (process 5702) exited normally]
> (unpatched-gdb)
>
> It is possible to notice that, in this scenario, the patched GDB
> will lose the '[New process %d]' message.
>
> - With 'set print inferior-events on', 'set follow-fork-mode child'
> and 'set detach-on-fork on':
>
> (gdb) r
> Starting program: a.out
> [Attaching after process 27905 fork to child process 27909]
> [New inferior 2 (process 27909)]
> [Detaching after fork from parent process 27905]
> [Inferior 1 (process 27905) detached]
> [Inferior 2 (process 27909) exited normally]
> (gdb)
>
> Compare this output with an unpatched GDB, using the same settings:
>
> (unpatched-gdb) r
> Starting program: a.out
> [New inferior 28033]
> [Inferior 28029 detached]
> [New process 28033]
> [Inferior 2 (process 28033) exited normally]
> [Inferior 28033 exited]
> (unpatched-gdb)
>
> As can be seen above, I've also made a few modifications to messages
> that are printed when 'set print inferior-events' is on. For example,
> a few of the messages did not contain the '[' and ']' as
> prefix/suffix, which led to a few inconsistencies like:
>
> Attaching after process 22995 fork to child process 22999.
> [New inferior 22999]
> Detaching after fork from child process 22999.
> [Inferior 22995 detached]
> [Inferior 2 (process 22999) exited normally]
>
> So I took the opportunity and included the square brackets where
> applicable. I have also made the existing messages more uniform, by
> always printing "Inferior %d (process %d)..." where applicable. This
> makes it easier to identify the inferior number and the PID number
> from the messages.
>
> As suggested by Pedro, the "[Inferior %d exited]" message from
> 'exit_inferior' has been removed, because it got duplicated when
> 'inferior-events' is on. I'm also using the
> 'add_{thread,inferior}_silent' versions (instead of their verbose
> counterparts) on some locations, also to avoid duplicated messages.
> For example, a patched GDB with 'set print inferior-events on', 'set
> detach-on-fork on' and 'set follow-fork-mode child', but using
> 'add_thread', would print:
>
> (gdb) run
> Starting program: a.out
> [Attaching after process 25088 fork to child process 25092.]
> [New inferior 25092] <--- duplicated
> [Detaching after fork from child process 25092.]
> [Inferior 25088 detached]
> [New process 25092] <--- duplicated
> [Inferior 2 (process 25092) exited normally]
>
> But if we use 'add_thread_silent' (with the same configuration as
> before):
>
> (gdb) run
> Starting program: a.out
> [Attaching after process 31606 fork to child process 31610]
> [New inferior 2 (process 31610)]
> [Detaching after fork from parent process 31606]
> [Inferior 1 (process 31606) detached]
> [Inferior 2 (process 31610) exited normally]
>
> As for the tests, the configuration options being exercised are:
>
> - follow-fork-mode: child/parent
> - detach-on-fork: on/off
> - print inferior-events: on/off
>
> It was also necessary to perform adjustments on several testcases,
> because the expected messages changed considerably.
>
> Built and regtested on BuildBot, without regressions.
>
> gdb/ChangeLog:
> 2018-04-05 Jan Kratochvil <jan.kratochvil@redhat.com>
> Sergio Durigan Junior <sergiodj@redhat.com>
> Pedro Alves <palves@redhat.com>
>
> * infcmd.c (kill_command): Print message when inferior has
> been killed.
> * inferior.c (print_inferior_events): Remove 'static'. Set as
> '1'.
> (add_inferior): Improve message printed when
> 'print_inferior_events' is on.
> (exit_inferior): Remove message printed when
> 'print_inferior_events' is on.
> (detach_inferior): Improve message printed when
> 'print_inferior_events' is on.
> (initialize_inferiors): Use 'add_inferior_silent' to set
> 'current_inferior_'.
> * inferior.h (print_inferior_events): Declare here as
> 'extern'.
> * infrun.c (follow_fork_inferior): Print '[Attaching...]' or
> '[Detaching...]' messages when 'print_inferior_events' is on.
> Use 'add_thread_silent' instead of 'add_thread'. Add '[' and ']'
> as prefix/suffix for messages. Remove periods. Fix erroneous
> 'Detaching after fork from child...', replace it by '... from
> parent...'.
> (handle_vfork_child_exec_or_exit): Add '[' and ']' as
> prefix/suffix when printing 'Detaching...' messages. Print
> them when 'print_inferior_events' is on.
> * remote.c (remote_detach_1): Print message when detaching
> from inferior and '!is_fork_parent'.
>
> gdb/testsuite/ChangeLog:
> 2018-04-05 Jan Kratochvil <jan.kratochvil@redhat.com>
> Sergio Durigan Junior <sergiodj@redhat.com>
> Pedro Alves <palves@redhat.com>
>
> * gdb.base/attach-non-pgrp-leader.exp: Adjust 'Detaching...'
> regexps to expect for '[Inferior ... detached]' as well.
> * gdb.base/attach.exp: Likewise.
> * gdb.base/catch-syscall.exp (check_for_program_end): Adjust
> "gdb_continue_to_end".
> (test_catch_syscall_with_wrong_args): Likewise.
> * gdb.base/foll-fork.exp: Adjust regexps to match '[' and
> ']'. Don't set 'verbose' on.
> * gdb.base/foll-vfork.exp: Likewise.
> * gdb.base/fork-print-inferior-events.c: New file.
> * gdb.base/fork-print-inferior-events.exp: New file.
> * gdb.base/hook-stop.exp: Adjust regexps to expect for new
> '[Inferior ... has been killed]' message.
> * gdb.base/kill-after-signal.exp: Likewise.
> * gdb.base/solib-overlap.exp: Adjust regexps to expect for new
> detach message.
> * gdb.threads/kill.exp: Adjust regexps to expect for new kill
> message.
> * gdb.threads/process-dies-while-detaching.c
> (parent_function): Use 'usleep' in order to avoid
> race-conditions.
> * gdb.threads/process-dies-while-detaching.exp: Adjust regexps
> to expect for new detach message.
> * gdb.threads/clone-attach-detach.exp: Adjust 'Detaching...'
> regexps to expect for '[Inferior ... detached]' as well.
> * gdb.threads/process-dies-while-detaching.exp: Likewise.
> ---
> gdb/infcmd.c | 8 ++
> gdb/inferior.c | 16 ++--
> gdb/inferior.h | 4 +
> gdb/infrun.c | 39 +++++-----
> gdb/remote.c | 7 +-
> gdb/testsuite/gdb.base/attach-non-pgrp-leader.exp | 5 +-
> gdb/testsuite/gdb.base/attach.exp | 3 +-
> gdb/testsuite/gdb.base/catch-syscall.exp | 4 +-
> gdb/testsuite/gdb.base/foll-fork.exp | 14 ++--
> gdb/testsuite/gdb.base/foll-vfork.exp | 16 ++--
> .../gdb.base/fork-print-inferior-events.c | 37 ++++++++++
> .../gdb.base/fork-print-inferior-events.exp | 85 ++++++++++++++++++++++
> gdb/testsuite/gdb.base/hook-stop.exp | 3 +-
> gdb/testsuite/gdb.base/kill-after-signal.exp | 6 +-
> gdb/testsuite/gdb.base/solib-overlap.exp | 2 +-
> gdb/testsuite/gdb.threads/clone-attach-detach.exp | 4 +-
> gdb/testsuite/gdb.threads/kill.exp | 8 +-
> .../gdb.threads/process-dies-while-detaching.exp | 20 +++--
> 18 files changed, 218 insertions(+), 63 deletions(-)
> create mode 100644 gdb/testsuite/gdb.base/fork-print-inferior-events.c
> create mode 100644 gdb/testsuite/gdb.base/fork-print-inferior-events.exp
>
> diff --git a/gdb/infcmd.c b/gdb/infcmd.c
> index 9c236b8e70..580436dbd9 100644
> --- a/gdb/infcmd.c
> +++ b/gdb/infcmd.c
> @@ -2598,8 +2598,16 @@ kill_command (const char *arg, int from_tty)
> error (_("The program is not being run."));
> if (!query (_("Kill the program being debugged? ")))
> error (_("Not confirmed."));
> +
> + const char *pid_str = target_pid_to_str (inferior_ptid);
> + int infnum = current_inferior ()->num;
> +
> target_kill ();
>
> + if (print_inferior_events)
> + printf_unfiltered (_("[Inferior %d (process %s) has been killed]\n"),
> + infnum, pid_str);
> +
> /* If we still have other inferiors to debug, then don't mess with
> with their threads. */
> if (!have_inferiors ())
> diff --git a/gdb/inferior.c b/gdb/inferior.c
> index 4ff5712d75..eeb1ac8b7c 100644
> --- a/gdb/inferior.c
> +++ b/gdb/inferior.c
> @@ -45,9 +45,8 @@ DEFINE_REGISTRY (inferior, REGISTRY_ACCESS_FIELD)
> struct inferior *inferior_list = NULL;
> static int highest_inferior_num;
>
> -/* Print notices on inferior events (attach, detach, etc.), set with
> - `set print inferior-events'. */
> -static int print_inferior_events = 0;
> +/* See inferior.h. */
> +int print_inferior_events = 1;
>
> /* The Current Inferior. This is a strong reference. I.e., whenever
> an inferior is the current inferior, its refcount is
> @@ -123,7 +122,8 @@ add_inferior (int pid)
> struct inferior *inf = add_inferior_silent (pid);
>
> if (print_inferior_events)
> - printf_unfiltered (_("[New inferior %d]\n"), pid);
> + printf_unfiltered (_("[New inferior %d (process %d)]\n"),
> + inf->num, pid);
>
> return inf;
> }
> @@ -234,9 +234,6 @@ exit_inferior (int pid)
> struct inferior *inf = find_inferior_pid (pid);
>
> exit_inferior_1 (inf, 0);
> -
> - if (print_inferior_events)
> - printf_unfiltered (_("[Inferior %d exited]\n"), pid);
> }
>
> void
> @@ -266,7 +263,8 @@ detach_inferior (inferior *inf)
> exit_inferior_1 (inf, 0);
>
> if (print_inferior_events)
> - printf_unfiltered (_("[Inferior %d detached]\n"), pid);
> + printf_unfiltered (_("[Inferior %d (process %d) detached]\n"),
> + inf->num, pid);
> }
>
> /* See inferior.h. */
> @@ -989,7 +987,7 @@ initialize_inferiors (void)
> can only allocate an inferior when all those modules have done
> that. Do this after initialize_progspace, due to the
> current_program_space reference. */
> - current_inferior_ = add_inferior (0);
> + current_inferior_ = add_inferior_silent (0);
> current_inferior_->incref ();
> current_inferior_->pspace = current_program_space;
> current_inferior_->aspace = current_program_space->aspace;
> diff --git a/gdb/inferior.h b/gdb/inferior.h
> index 391a5fdaa5..bd26c8a86d 100644
> --- a/gdb/inferior.h
> +++ b/gdb/inferior.h
> @@ -220,6 +220,10 @@ extern enum stop_stack_kind stop_stack_dummy;
>
> extern int stopped_by_random_signal;
>
> +/* Print notices on inferior events (attach, detach, etc.), set with
> + `set print inferior-events'. */
> +extern int print_inferior_events;
> +
> /* STEP_OVER_ALL means step over all subroutine calls.
> STEP_OVER_UNDEBUGGABLE means step over calls to undebuggable functions.
> STEP_OVER_NONE means don't step over any subroutine calls. */
> diff --git a/gdb/infrun.c b/gdb/infrun.c
> index 6648698df6..4d664d4ac4 100644
> --- a/gdb/infrun.c
> +++ b/gdb/infrun.c
> @@ -461,14 +461,14 @@ holding the child stopped. Try \"set detach-on-fork\" or \
> remove_breakpoints_pid (ptid_get_pid (inferior_ptid));
> }
>
> - if (info_verbose || debug_infrun)
> + if (print_inferior_events)
> {
> /* Ensure that we have a process ptid. */
> ptid_t process_ptid = pid_to_ptid (ptid_get_pid (child_ptid));
>
> target_terminal::ours_for_output ();
> fprintf_filtered (gdb_stdlog,
> - _("Detaching after %s from child %s.\n"),
> + _("[Detaching after %s from child %s]\n"),
> has_vforked ? "vfork" : "fork",
> target_pid_to_str (process_ptid));
> }
> @@ -489,7 +489,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
> scoped_restore_current_pspace_and_thread restore_pspace_thread;
>
> inferior_ptid = child_ptid;
> - add_thread (inferior_ptid);
> + add_thread_silent (inferior_ptid);
> set_current_inferior (child_inf);
> child_inf->symfile_flags = SYMFILE_NO_READ;
>
> @@ -549,14 +549,19 @@ holding the child stopped. Try \"set detach-on-fork\" or \
> struct inferior *parent_inf, *child_inf;
> struct program_space *parent_pspace;
>
> - if (info_verbose || debug_infrun)
> + if (print_inferior_events)
> {
> + gdb::unique_xmalloc_ptr<char>
> + parent_pid (xstrdup (target_pid_to_str (parent_ptid)));
> + gdb::unique_xmalloc_ptr<char>
> + child_pid (xstrdup (target_pid_to_str (child_ptid)));
> +
> target_terminal::ours_for_output ();
> fprintf_filtered (gdb_stdlog,
> - _("Attaching after %s %s to child %s.\n"),
> - target_pid_to_str (parent_ptid),
> + _("[Attaching after %s %s to child %s]\n"),
> + parent_pid.get (),
> has_vforked ? "vfork" : "fork",
> - target_pid_to_str (child_ptid));
> + child_pid.get ());
> }
>
> /* Add the new inferior first, so that the target_detach below
> @@ -594,15 +599,15 @@ holding the child stopped. Try \"set detach-on-fork\" or \
> }
> else if (detach_fork)
> {
> - if (info_verbose || debug_infrun)
> + if (print_inferior_events)
> {
> /* Ensure that we have a process ptid. */
> - ptid_t process_ptid = pid_to_ptid (ptid_get_pid (child_ptid));
> + ptid_t process_ptid = pid_to_ptid (ptid_get_pid (parent_ptid));
>
> target_terminal::ours_for_output ();
> fprintf_filtered (gdb_stdlog,
> - _("Detaching after fork from "
> - "child %s.\n"),
> + _("[Detaching after fork from "
> + "parent %s]\n"),
> target_pid_to_str (process_ptid));
> }
>
> @@ -616,7 +621,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
> informing the solib layer about this new process. */
>
> inferior_ptid = child_ptid;
> - add_thread (inferior_ptid);
> + add_thread_silent (inferior_ptid);
> set_current_inferior (child_inf);
>
> /* If this is a vfork child, then the address-space is shared
> @@ -956,22 +961,22 @@ handle_vfork_child_exec_or_exit (int exec)
> inf->aspace = NULL;
> inf->pspace = NULL;
>
> - if (debug_infrun || info_verbose)
> + if (print_inferior_events)
> {
> target_terminal::ours_for_output ();
>
> if (exec)
> {
> fprintf_filtered (gdb_stdlog,
> - _("Detaching vfork parent process "
> - "%d after child exec.\n"),
> + _("[Detaching vfork parent process "
> + "%d after child exec]\n"),
> inf->vfork_parent->pid);
> }
> else
> {
> fprintf_filtered (gdb_stdlog,
> - _("Detaching vfork parent process "
> - "%d after child exit.\n"),
> + _("[Detaching vfork parent process "
> + "%d after child exit]\n"),
> inf->vfork_parent->pid);
> }
> }
> diff --git a/gdb/remote.c b/gdb/remote.c
> index 68c43f8312..4cb4badd8a 100644
> --- a/gdb/remote.c
> +++ b/gdb/remote.c
> @@ -5137,7 +5137,12 @@ remote_detach_1 (int from_tty, inferior *inf)
> /* If doing detach-on-fork, we don't mourn, because that will delete
> breakpoints that should be available for the followed inferior. */
> if (!is_fork_parent)
> - target_mourn_inferior (inferior_ptid);
> + {
> + target_mourn_inferior (inferior_ptid);
> + if (print_inferior_events)
> + printf_unfiltered (_("[Inferior %d (process %d) detached]\n"),
> + inf->num, pid);
> + }
> else
> {
> inferior_ptid = null_ptid;
> diff --git a/gdb/testsuite/gdb.base/attach-non-pgrp-leader.exp b/gdb/testsuite/gdb.base/attach-non-pgrp-leader.exp
> index dbe554eff3..89f0ecd01b 100644
> --- a/gdb/testsuite/gdb.base/attach-non-pgrp-leader.exp
> +++ b/gdb/testsuite/gdb.base/attach-non-pgrp-leader.exp
> @@ -30,6 +30,7 @@ if { [build_executable ${testfile}.exp ${testfile} $srcfile {debug}] == -1 } {
>
> proc do_test {} {
> global binfile
> + global decimal
>
> set test_spawn_id [spawn_wait_for_attach $binfile]
> set parent_pid [spawn_id_get_pid $test_spawn_id]
> @@ -52,7 +53,7 @@ proc do_test {} {
> }
>
> gdb_test "detach" \
> - "Detaching from program: .*process $parent_pid"
> + "Detaching from program: .*process $parent_pid\r\n\\\[Inferior $decimal \\(process $decimal\\) detached\\\]"
> }
>
> # Start over, and attach to the child this time.
> @@ -67,7 +68,7 @@ proc do_test {} {
> gdb_continue_to_breakpoint "marker"
>
> gdb_test "detach" \
> - "Detaching from program: .*process $child_pid"
> + "Detaching from program: .*process $child_pid\r\n\\\[Inferior $decimal \\(process $decimal\\) detached\\\]"
> }
>
> kill_wait_spawned_process $test_spawn_id
> diff --git a/gdb/testsuite/gdb.base/attach.exp b/gdb/testsuite/gdb.base/attach.exp
> index efec49e385..173afbcd74 100644
> --- a/gdb/testsuite/gdb.base/attach.exp
> +++ b/gdb/testsuite/gdb.base/attach.exp
> @@ -53,6 +53,7 @@ proc do_attach_tests {} {
> global testfile
> global subdir
> global timeout
> + global decimal
>
> # Figure out a regular expression that will match the sysroot,
> # noting that the default sysroot is "target:", and also noting
> @@ -191,7 +192,7 @@ proc do_attach_tests {} {
> # Detach the process.
>
> gdb_test "detach" \
> - "Detaching from program: .*$escapedbinfile, process $testpid" \
> + "Detaching from program: .*$escapedbinfile, process $testpid\r\n\\\[Inferior $decimal \\(process $decimal\\) detached\\\]" \
> "attach1 detach"
>
> # Wait a bit for gdb to finish detaching
> diff --git a/gdb/testsuite/gdb.base/catch-syscall.exp b/gdb/testsuite/gdb.base/catch-syscall.exp
> index 2a8bf27e5c..20fa041155 100644
> --- a/gdb/testsuite/gdb.base/catch-syscall.exp
> +++ b/gdb/testsuite/gdb.base/catch-syscall.exp
> @@ -179,7 +179,7 @@ proc check_for_program_end {} {
> # Deleting the catchpoints
> delete_breakpoints
>
> - gdb_continue_to_end
> + gdb_continue_to_end "" continue 1
> }
>
> proc test_catch_syscall_without_args {} {
> @@ -250,7 +250,7 @@ proc test_catch_syscall_with_wrong_args {} {
> # If it doesn't, everything is right (since we don't have
> # a syscall named "mlock" in it). Otherwise, this is a failure.
> set thistest "catch syscall with unused syscall ($syscall_name)"
> - gdb_continue_to_end $thistest
> + gdb_continue_to_end $thistest continue 1
> }
> }
>
> diff --git a/gdb/testsuite/gdb.base/foll-fork.exp b/gdb/testsuite/gdb.base/foll-fork.exp
> index a715b7fa9d..9e8fe99542 100644
> --- a/gdb/testsuite/gdb.base/foll-fork.exp
> +++ b/gdb/testsuite/gdb.base/foll-fork.exp
> @@ -110,13 +110,13 @@ proc test_follow_fork { who detach cmd } {
> # Set up the output we expect to see after we run.
> set expected_re ""
> if {$who == "child"} {
> - set expected_re "Attaching after.* fork to.*"
> + set expected_re "\\\[Attaching after.* fork to.*"
> if {$detach == "on"} {
> - append expected_re "Detaching after fork from .*"
> + append expected_re "\\\[Detaching after fork from .*"
> }
> append expected_re "set breakpoint here.*"
> } elseif {$who == "parent" && $detach == "on"} {
> - set expected_re "Detaching after fork from .*set breakpoint here.*"
> + set expected_re "\\\[Detaching after fork from .*set breakpoint here.*"
> } else {
> set expected_re ".*set breakpoint here.*"
> }
> @@ -217,7 +217,7 @@ proc catch_fork_child_follow {} {
> "Temporary breakpoint.*, line $bp_after_fork.*" \
> "set follow-fork child, tbreak"
>
> - set expected_re "Attaching after.* fork to.*Detaching after fork from"
> + set expected_re "\\\[Attaching after.* fork to.*\\\[Detaching after fork from"
> append expected_re ".* at .*$bp_after_fork.*"
> gdb_test "continue" $expected_re "set follow-fork child, hit tbreak"
>
> @@ -305,7 +305,7 @@ proc tcatch_fork_parent_follow {} {
> "set follow-fork parent, tbreak"
>
> gdb_test "continue" \
> - "Detaching after fork from.* at .*$bp_after_fork.*" \
> + "\\\[Detaching after fork from.* at .*$bp_after_fork.*" \
> "set follow-fork parent, hit tbreak"
>
> # The child has been detached; allow time for any output it might
> @@ -398,10 +398,6 @@ By default, the debugger will follow the parent process..*" \
> if [runto_main] then { tcatch_fork_parent_follow }
> }
>
> -# The "Detaching..." and "Attaching..." messages may be hidden by
> -# default.
> -gdb_test_no_output "set verbose"
> -
> # This is a test of gdb's ability to follow the parent, child or both
> # parent and child of a Unix fork() system call.
> #
> diff --git a/gdb/testsuite/gdb.base/foll-vfork.exp b/gdb/testsuite/gdb.base/foll-vfork.exp
> index 6aa4edd9fe..ddda2d6143 100644
> --- a/gdb/testsuite/gdb.base/foll-vfork.exp
> +++ b/gdb/testsuite/gdb.base/foll-vfork.exp
> @@ -55,10 +55,6 @@ proc setup_gdb {} {
>
> clean_restart $testfile
>
> - # The "Detaching..." and "Attaching..." messages may be hidden by
> - # default.
> - gdb_test_no_output "set verbose"
> -
> if ![runto_main] {
> return -code return
> }
> @@ -103,7 +99,7 @@ proc vfork_parent_follow_through_step {} {
>
> set test "step"
> gdb_test_multiple "next" $test {
> - -re "Detaching after vfork from.*if \\(pid == 0\\).*$gdb_prompt " {
> + -re "\\\[Detaching after vfork from.*if \\(pid == 0\\).*$gdb_prompt " {
> pass $test
> }
> }
> @@ -128,7 +124,7 @@ proc vfork_parent_follow_to_bp {} {
>
> set test "continue to bp"
> gdb_test_multiple "continue" $test {
> - -re ".*Detaching after vfork from child process.*Breakpoint.*${bp_location}.*$gdb_prompt " {
> + -re ".*\\\[Detaching after vfork from child process.*Breakpoint.*${bp_location}.*$gdb_prompt " {
> pass $test
> }
> }
> @@ -153,7 +149,7 @@ proc vfork_child_follow_to_exit {} {
> # PR gdb/14766
> fail "$test"
> }
> - -re "Attaching after.* vfork to.*Detaching vfork parent .* after child exit.*$gdb_prompt " {
> + -re "\\\[Attaching after.* vfork to.*\\\[Detaching vfork parent .* after child exit.*$gdb_prompt " {
> pass $test
> }
> }
> @@ -177,7 +173,7 @@ proc vfork_and_exec_child_follow_to_main_bp {} {
>
> set test "continue to bp"
> gdb_test_multiple "continue" $test {
> - -re "Attaching after.* vfork to.*Detaching vfork parent.*xecuting new program.*Breakpoint.*vforked-prog.c:${linenum}.*$gdb_prompt " {
> + -re "\\\[Attaching after.* vfork to.*\\\[Detaching vfork parent.*xecuting new program.*Breakpoint.*vforked-prog.c:${linenum}.*$gdb_prompt " {
> pass $test
> }
> }
> @@ -203,7 +199,7 @@ proc vfork_and_exec_child_follow_through_step {} {
> # before it execs. Thus, "next" lands on the next line after
> # the vfork.
> gdb_test_multiple "next" $test {
> - -re "Attaching after .* vfork to child.*if \\(pid == 0\\).*$gdb_prompt " {
> + -re "\\\[Attaching after .* vfork to child.*if \\(pid == 0\\).*$gdb_prompt " {
> pass "$test"
> }
> }
> @@ -341,7 +337,7 @@ proc vfork_relations_in_info_inferiors { variant } {
>
> set test "step over vfork"
> gdb_test_multiple "next" $test {
> - -re "Attaching after .* vfork to child.*if \\(pid == 0\\).*$gdb_prompt " {
> + -re "\\\[Attaching after .* vfork to child.*if \\(pid == 0\\).*$gdb_prompt " {
> pass "$test"
> }
> }
> diff --git a/gdb/testsuite/gdb.base/fork-print-inferior-events.c b/gdb/testsuite/gdb.base/fork-print-inferior-events.c
> new file mode 100644
> index 0000000000..182a363dcc
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/fork-print-inferior-events.c
> @@ -0,0 +1,37 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> + Copyright 2007-2018 Free Software Foundation, Inc.
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>. */
> +
> +#include <stdlib.h>
> +#include <unistd.h>
> +
> +int
> +main (int argc, char *argv[])
> +{
> + pid_t child;
> +
> + child = fork ();
> + switch (child)
> + {
> + case -1:
> + abort ();
> + case 0:
> + default:
> + break;
> + }
> +
> + return 0;
> +}
> diff --git a/gdb/testsuite/gdb.base/fork-print-inferior-events.exp b/gdb/testsuite/gdb.base/fork-print-inferior-events.exp
> new file mode 100644
> index 0000000000..caa01a594e
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/fork-print-inferior-events.exp
> @@ -0,0 +1,85 @@
> +# This testcase is part of GDB, the GNU debugger.
> +
> +# Copyright 2007-2018 Free Software Foundation, Inc.
> +
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program. If not, see <http://www.gnu.org/licenses/>.
> +
> +# Test that the event messages printed when using 'set print
> +# inferior-events [on,off]', 'set follow-fork-mode [child,parent]' and
> +# 'set detach-on-fork [on,off]' are the correct ones.
> +
> +# This test relies on "run", so it cannot run on target remote stubs.
> +if { [use_gdb_stub] } {
> + untested "not supported on target remote stubs"
> + return
> +}
> +
> +standard_testfile
> +
> +if { [prepare_for_testing "failed to prepare" $testfile $srcfile debug] } {
> + return -1
> +}
> +
> +# This is the expected output for each of the test combinations
> +# below. The order here is important:
> +#
> +# inferior-events: on; follow-fork: child; detach-on-fork: on
> +# inferior-events: on; follow-fork: child; detach-on-fork: off
> +# inferior-events: on; follow-fork: parent; detach-on-fork: on
> +# inferior-events: on; follow-fork: parent; detach-on-fork: off
> +# inferior-events: off; follow-fork: child; detach-on-fork: on
> +# inferior-events: off; follow-fork: child; detach-on-fork: off
> +# inferior-events: off; follow-fork: parent; detach-on-fork: on
> +# inferior-events: off; follow-fork: parent; detach-on-fork: off
> +
> +set reading_re "(Reading.*from remote target\\.\\.\\.\r\n)*"
> +set exited_normally_re "${reading_re}\\\[Inferior $decimal \\(process $decimal\\) exited normally\\\]"
> +# gdbserver produces a slightly different message when attaching after
> +# a fork, so we have to tweak the regexp to accomodate that.
> +set attach_child_re "${reading_re}\\\[Attaching after (process $decimal\|Thread ${decimal}\\.${decimal}) fork to child (process $decimal\|Thread ${decimal}\\.${decimal})\\\]\r\n"
> +set detach_child_re "${reading_re}\\\[Detaching after fork from child process $decimal\\\]\r\n"
> +set detach_parent_re "${reading_re}\\\[Detaching after fork from parent process $decimal\\\]\r\n"
> +set new_inf_re "${reading_re}\\\[New inferior $decimal \\(process $decimal\\)\\\]\r\n"
> +set inf_detached_re "${reading_re}\\\[Inferior $decimal \\(process $decimal\\) detached\\\]\r\n"
> +
> +set expected_output [list \
> + "${attach_child_re}${new_inf_re}${detach_parent_re}${inf_detached_re}" \
> + "${attach_child_re}${new_inf_re}" \
> + "${detach_child_re}" \
> + "${new_inf_re}" \
> + "" \
> + "" \
> + "" \
> + "" \
> + ]
> +
> +set i 0
> +
> +foreach_with_prefix print_inferior_events { "on" "off" } {
> + foreach_with_prefix follow_fork_mode { "child" "parent" } {
> + foreach_with_prefix detach_on_fork { "on" "off" } {
> + clean_restart $binfile
> + gdb_test_no_output "set print inferior-events $print_inferior_events"
> + gdb_test_no_output "set follow-fork-mode $follow_fork_mode"
> + gdb_test_no_output "set detach-on-fork $detach_on_fork"
> +
> + set output [lindex $expected_output $i]
> + # Always add the "Starting program..." string so that we
> + # match exactly the lines we want.
> + set output "Starting program: $binfile\\s*\r\n${output}${exited_normally_re}"
> + set i [expr $i + 1]
> + gdb_test "run" $output
> + }
> + }
> +}
> diff --git a/gdb/testsuite/gdb.base/hook-stop.exp b/gdb/testsuite/gdb.base/hook-stop.exp
> index fbdfcfe3d6..f1b930c380 100644
> --- a/gdb/testsuite/gdb.base/hook-stop.exp
> +++ b/gdb/testsuite/gdb.base/hook-stop.exp
> @@ -78,6 +78,7 @@ proc hook_stop_before_frame {} {
> proc hook_stop_kill {} {
> with_test_prefix "hook-stop kills inferior" {
> global gdb_prompt
> + global decimal
>
> setup "kill"
>
> @@ -85,7 +86,7 @@ proc hook_stop_kill {} {
>
> set test "run hook-stop"
> gdb_test_multiple "continue" "$test" {
> - -re "Continuing.\r\n${gdb_prompt} $" {
> + -re "Continuing.\r\n\\\[Inferior $decimal \\(process $decimal\\) has been killed\\\]\r\n${gdb_prompt} $" {
> pass $test
> }
> }
> diff --git a/gdb/testsuite/gdb.base/kill-after-signal.exp b/gdb/testsuite/gdb.base/kill-after-signal.exp
> index 76f9d5af70..082927ddb3 100644
> --- a/gdb/testsuite/gdb.base/kill-after-signal.exp
> +++ b/gdb/testsuite/gdb.base/kill-after-signal.exp
> @@ -37,4 +37,8 @@ if ![runto_main] {
>
> gdb_test "continue" "Program received signal SIGUSR1, .*"
> gdb_test "stepi" "\r\nhandler .*"
> -gdb_test "kill" "^y" "kill" "Kill the program being debugged\\? \\(y or n\\) $" "y"
> +gdb_test_multiple "kill" "kill" {
> + -re "Kill the program being debugged\\? \\(y or n\\) $" {
> + gdb_test "y" "\\\[Inferior $decimal \\(process $decimal\\) has been killed\\\]" "kill"
> + }
> +}
> diff --git a/gdb/testsuite/gdb.base/solib-overlap.exp b/gdb/testsuite/gdb.base/solib-overlap.exp
> index 88762be449..bc8a1a13a8 100644
> --- a/gdb/testsuite/gdb.base/solib-overlap.exp
> +++ b/gdb/testsuite/gdb.base/solib-overlap.exp
> @@ -119,7 +119,7 @@ foreach prelink_lib1 {0x40000000 0x50000000} { with_test_prefix "$prelink_lib1"
>
> # Detach the process.
>
> - gdb_test "detach" "Detaching from program: .*$escapedbinfile, process $testpid"
> + gdb_test "detach" "Detaching from program: .*$escapedbinfile, process $testpid\r\n\\\[Inferior $decimal \\(process $testpid\\) detached\\\]"
>
> # Wait a bit for gdb to finish detaching
>
> diff --git a/gdb/testsuite/gdb.threads/clone-attach-detach.exp b/gdb/testsuite/gdb.threads/clone-attach-detach.exp
> index 1fbdc95ffc..d597f2faf6 100644
> --- a/gdb/testsuite/gdb.threads/clone-attach-detach.exp
> +++ b/gdb/testsuite/gdb.threads/clone-attach-detach.exp
> @@ -56,7 +56,7 @@ for {set attempt 1} {$attempt <= $attempts} {incr attempt} {
> "1.*${thread_re}.*\r\n.*2.*${thread_re}.*" \
> "info threads shows two LWPs"
>
> - gdb_test "detach" "Detaching from .*, process $testpid"
> + gdb_test "detach" "Detaching from .*, process $testpid\r\n\\\[Inferior $decimal \\(process $decimal\\) detached\\\]"
> }
> }
>
> @@ -91,7 +91,7 @@ for {set attempt 1} {$attempt <= $attempts} {incr attempt} {
> "1.*${thread_re}.*\\(running\\)\r\n.*2.*${thread_re}.*\\(running\\)" \
> "info threads shows two LWPs"
>
> - gdb_test "detach" "Detaching from .*, process $testpid"
> + gdb_test "detach" "Detaching from .*, process $testpid\r\n\\\[Inferior $decimal \\(process $decimal\\) detached\\\]"
> }
> }
>
> diff --git a/gdb/testsuite/gdb.threads/kill.exp b/gdb/testsuite/gdb.threads/kill.exp
> index 61384578e6..c7dca1407f 100644
> --- a/gdb/testsuite/gdb.threads/kill.exp
> +++ b/gdb/testsuite/gdb.threads/kill.exp
> @@ -21,7 +21,7 @@ standard_testfile
> # program and spawn several threads before trying to kill the program.
>
> proc test {threaded} {
> - global testfile srcfile
> + global testfile srcfile decimal
>
> with_test_prefix [expr ($threaded)?"threaded":"non-threaded"] {
>
> @@ -68,7 +68,11 @@ proc test {threaded} {
> #
> # the above would mean that the remote end crashed.
>
> - gdb_test "kill" "^y" "kill program" "Kill the program being debugged\\? \\(y or n\\) $" "y"
> + gdb_test_multiple "kill" "kill" {
> + -re "Kill the program being debugged\\? \\(y or n\\) $" {
> + gdb_test "y" "\\\[Inferior $decimal \\(process $decimal\\) has been killed\\\]" "kill"
> + }
> + }
> }
> }
>
> diff --git a/gdb/testsuite/gdb.threads/process-dies-while-detaching.exp b/gdb/testsuite/gdb.threads/process-dies-while-detaching.exp
> index e05acb1711..616b6cf7a4 100644
> --- a/gdb/testsuite/gdb.threads/process-dies-while-detaching.exp
> +++ b/gdb/testsuite/gdb.threads/process-dies-while-detaching.exp
> @@ -81,8 +81,15 @@ proc detach_and_expect_exit {inf_output_re test} {
> global inferior_spawn_id
> global gdb_prompt
>
> + set saw_inf_exit 0
> return_if_fail [gdb_test_multiple "detach" $test {
> - -re "Detaching from .*, process $decimal" {
> + -re "Detaching from .*, process $decimal\r\n\\\[Inferior $decimal \\(process $decimal\\) detached\\\]" {
> + }
> + # inf_output_re can also appear in the middle, so we catch
> + # this case here in order to avoid racy results.
> + -re "Detaching from .*, process $decimal\r\n${inf_output_re}\r\n\\\[Inferior $decimal \\(process $decimal\\) detached\\\]" {
> + verbose -log "saw inferior exit"
> + set saw_inf_exit 1
> }
> }]
>
> @@ -92,10 +99,13 @@ proc detach_and_expect_exit {inf_output_re test} {
> # "target remote" mode, the eof caused by gdbserver exiting is
> # left for the caller to handle.
> global daee_spawn_id_list
> - set daee_spawn_id_list "$inferior_spawn_id $gdb_spawn_id"
> + if { !$saw_inf_exit } {
> + set daee_spawn_id_list "$inferior_spawn_id $gdb_spawn_id"
> + } else {
> + set daee_spawn_id_list "$gdb_spawn_id"
> + }
>
> set saw_prompt 0
> - set saw_inf_exit 0
> while { !$saw_prompt || ! $saw_inf_exit } {
> # We don't know what order the interesting things will arrive in.
> # Using a pattern of the form 'x|y|z' instead of -re x ... -re y
> @@ -169,7 +179,7 @@ proc do_detach {multi_process cmd child_exit} {
> && [target_info gdb_protocol] == "remote"}]
>
> if {$multi_process} {
> - gdb_test "detach" "Detaching from .*, process $decimal" \
> + gdb_test "detach" "Detaching from .*, process $decimal\r\n\\\[Inferior $decimal \\(process $decimal\\) detached\\\]" \
> "detach child"
>
> gdb_test "inferior 1" "\[Switching to inferior $decimal\].*" \
> @@ -193,7 +203,7 @@ proc do_detach {multi_process cmd child_exit} {
> set extra ""
> }
> if {$cmd == "detach"} {
> - gdb_test "detach" "Detaching from .*, process $decimal$extra"
> + gdb_test "detach" "Detaching from .*, process ${decimal}\r\n\\\[Inferior $decimal \\(process $decimal\\) detached\\\]$extra"
> } elseif {$cmd == "continue"} {
> gdb_test "continue" $continue_re
> } else {
> --
> 2.14.3
--
Sergio
GPG key ID: 237A 54B1 0287 28BF 00EF 31F4 D0EB 7628 65FC 5E36
Please send encrypted e-mail if possible
http://sergiodj.net/