@@ -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
@@ -232,9 +231,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
@@ -986,7 +982,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;
@@ -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. */
@@ -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,11 +549,11 @@ 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)
{
target_terminal::ours_for_output ();
fprintf_filtered (gdb_stdlog,
- _("Attaching after %s %s to child %s.\n"),
+ _("[Attaching after %s %s to child %s.]\n"),
target_pid_to_str (parent_ptid),
has_vforked ? "vfork" : "fork",
target_pid_to_str (child_ptid));
@@ -594,15 +594,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));
target_terminal::ours_for_output ();
fprintf_filtered (gdb_stdlog,
- _("Detaching after fork from "
- "child %s.\n"),
+ _("[Detaching after fork from "
+ "child %s.]\n"),
target_pid_to_str (process_ptid));
}
@@ -616,7 +616,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 +956,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);
}
}
@@ -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 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 detached\\\]"
}
kill_wait_spawned_process $test_spawn_id
@@ -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
@@ -194,7 +195,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 detached\\\]" \
"attach1 detach"
# Wait a bit for gdb to finish detaching
@@ -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
}
}
@@ -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.
#
@@ -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"
}
}
new file mode 100644
@@ -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;
+}
new file mode 100644
@@ -0,0 +1,68 @@
+# 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/>.
+
+if { [use_gdb_stub] || [target_info gdb_protocol] == "extended-remote" } {
+ untested "not supported on gdbserver"
+ 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:
+#
+# follow-fork: child; detach-on-fork: on; inferior-events: on
+# follow-fork: child; detach-on-fork: on; inferior-events: off
+# follow-fork: child; detach-on-fork: off; inferior-events: on
+# follow-fork: child; detach-on-fork: off; inferior-events: off
+# follow-fork: parent; detach-on-fork: on; inferior-events: on
+# follow-fork: parent; detach-on-fork: on; inferior-events: off
+# follow-fork: parent; detach-on-fork: off; inferior-events: on
+# follow-fork: parent; detach-on-fork: off; inferior-events: off
+set expected_output [list \
+ "\\\[Attaching after process $decimal fork to child process $decimal\\.\\\]\r\n\\\[New inferior $decimal\\\]\r\n\\\[Detaching after fork from child process $decimal\\.\\\]\r\n\\\[Inferior $decimal detached\\\]\r\n\\\[Inferior $decimal \\(process $decimal\\) exited normally\\\]" \
+ "\\\[Inferior $decimal \\(process $decimal\\) exited normally\\\]" \
+ "\\\[Attaching after process $decimal fork to child process $decimal\\.\\\]\r\n\\\[New inferior $decimal\\\]\r\n\\\[Inferior $decimal \\(process $decimal\\) exited normally\\\]" \
+ "\\\[Inferior $decimal \\(process $decimal\\) exited normally\\\]" \
+ "\\\[Detaching after fork from child process $decimal\\.\\\]\r\n\\\[Inferior $decimal \\(process $decimal\\) exited normally\\\]" \
+ "\\\[Inferior $decimal \\(process $decimal\\) exited normally\\\]" \
+ "\\\[New inferior $decimal\\\]\r\n\\\[Inferior $decimal \\(process $decimal\\) exited normally\\\]" \
+ "\\\[Inferior $decimal \\(process $decimal\\) exited normally\\\]"]
+
+set i 0
+
+foreach_with_prefix follow_fork_mode { "child" "parent" } {
+ foreach_with_prefix detach_on_fork { "on" "off" } {
+ foreach_with_prefix print_inferior_events { "on" "off" } {
+ clean_restart $binfile
+ gdb_test_no_output "set follow-fork-mode $follow_fork_mode"
+ gdb_test_no_output "set detach-on-fork $detach_on_fork"
+ gdb_test_no_output "set print inferior-events $print_inferior_events"
+
+ 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"
+ set i [expr $i + 1]
+ gdb_test "run" $output
+ }
+ }
+}
@@ -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 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 detached\\\]"
}
}
@@ -82,7 +82,7 @@ proc detach_and_expect_exit {inf_output_re test} {
global gdb_prompt
return_if_fail [gdb_test_multiple "detach" $test {
- -re "Detaching from .*, process $decimal" {
+ -re "Detaching from .*, process $decimal\r\n\\\[Inferior $decimal detached\\\]" {
}
}]
@@ -169,7 +169,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 detached\\\]" \
"detach child"
gdb_test "inferior 1" "\[Switching to inferior $decimal\].*" \
@@ -193,7 +193,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 detached\\\]$extra"
} elseif {$cmd == "continue"} {
gdb_test "continue" $continue_re
} else {