+2018-04-24 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'.
+
2018-04-24 Tom Tromey <tom@tromey.com>
* cli-out.h: Reindent.
error (_("The program is not being run."));
if (!query (_("Kill the program being debugged? ")))
error (_("Not confirmed."));
+
+ std::string pid_str = target_pid_to_str (inferior_ptid);
+ int infnum = current_inferior ()->num;
+
target_kill ();
+ if (print_inferior_events)
+ printf_unfiltered (_("[Inferior %d (%s) has been killed]\n"),
+ infnum, pid_str.c_str ());
+
/* If we still have other inferiors to debug, then don't mess with
with their threads. */
if (!have_inferiors ())
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
struct inferior *inf = add_inferior_silent (pid);
if (print_inferior_events)
- printf_unfiltered (_("[New inferior %d]\n"), pid);
+ printf_unfiltered (_("[New inferior %d (%s)]\n"),
+ inf->num,
+ target_pid_to_str (pid_to_ptid (pid)));
return inf;
}
struct inferior *inf = find_inferior_pid (pid);
exit_inferior_1 (inf, 0);
-
- if (print_inferior_events)
- printf_unfiltered (_("[Inferior %d exited]\n"), pid);
}
void
exit_inferior_1 (inf, 0);
if (print_inferior_events)
- printf_unfiltered (_("[Inferior %d detached]\n"), pid);
+ printf_unfiltered (_("[Inferior %d (%s) detached]\n"),
+ inf->num,
+ target_pid_to_str (pid_to_ptid (pid)));
}
/* See inferior.h. */
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;
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. */
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));
}
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;
struct inferior *parent_inf, *child_inf;
struct program_space *parent_pspace;
- if (info_verbose || debug_infrun)
+ if (print_inferior_events)
{
+ std::string parent_pid = target_pid_to_str (parent_ptid);
+ std::string child_pid = 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.c_str (),
has_vforked ? "vfork" : "fork",
- target_pid_to_str (child_ptid));
+ child_pid.c_str ());
}
/* Add the new inferior first, so that the target_detach below
}
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));
}
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
inf->aspace = NULL;
inf->pspace = NULL;
- if (debug_infrun || info_verbose)
+ if (print_inferior_events)
{
+ const char *pidstr
+ = target_pid_to_str (pid_to_ptid (inf->vfork_parent->pid));
+
target_terminal::ours_for_output ();
if (exec)
{
fprintf_filtered (gdb_stdlog,
- _("Detaching vfork parent process "
- "%d after child exec.\n"),
- inf->vfork_parent->pid);
+ _("[Detaching vfork parent %s "
+ "after child exec]\n"), pidstr);
}
else
{
fprintf_filtered (gdb_stdlog,
- _("Detaching vfork parent process "
- "%d after child exit.\n"),
- inf->vfork_parent->pid);
+ _("[Detaching vfork parent %s "
+ "after child exit]\n"), pidstr);
}
}
/* 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);
+ {
+ std::string infpid = target_pid_to_str (inferior_ptid);
+
+ target_mourn_inferior (inferior_ptid);
+ if (print_inferior_events)
+ printf_unfiltered (_("[Inferior %d (%s) detached]\n"),
+ inf->num, infpid.c_str ());
+ }
else
{
inferior_ptid = null_ptid;
+2018-04-24 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/clone-attach-detach.exp: Adjust 'Detaching...'
+ regexps to expect for '[Inferior ... detached]' as well.
+ * gdb.threads/process-dies-while-detaching.exp: Likewise.
+
2018-04-24 Simon Marchi <simon.marchi@ericsson.com>
PR gdb/23104
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]
}
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.
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
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
# 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
# Deleting the catchpoints
delete_breakpoints
- gdb_continue_to_end
+ gdb_continue_to_end "" continue 1
}
proc test_catch_syscall_without_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
}
}
# 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.*"
}
"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"
"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
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.
#
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
}
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
}
}
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
}
}
# 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
}
}
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
}
}
# 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"
}
}
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"
}
}
--- /dev/null
+/* 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;
+}
--- /dev/null
+# 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 \\(.*\\) 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 .* fork to child .*\\\]\r\n"
+set detach_child_re "${reading_re}\\\[Detaching after fork from child .*\\\]\r\n"
+set detach_parent_re "${reading_re}\\\[Detaching after fork from parent .*\\\]\r\n"
+set new_inf_re "${reading_re}\\\[New inferior $decimal \\(.*\\)\\\]\r\n"
+set inf_detached_re "${reading_re}\\\[Inferior $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
+ }
+ }
+}
proc hook_stop_kill {} {
with_test_prefix "hook-stop kills inferior" {
global gdb_prompt
+ global decimal
setup "kill"
set test "run hook-stop"
gdb_test_multiple "continue" "$test" {
- -re "Continuing.\r\n${gdb_prompt} $" {
+ -re "Continuing.\r\n\\\[Inferior $decimal \\(.*\\) has been killed\\\]\r\n${gdb_prompt} $" {
pass $test
}
}
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 \\(.*\\) has been killed\\\]" "kill"
+ }
+}
# 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 \\(.*\\) detached\\\]"
# Wait a bit for gdb to finish detaching
"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\\\]"
}
}
"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\\\]"
}
}
# 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"] {
#
# 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 \\(.*\\) has been killed\\\]" "kill"
+ }
+ }
}
}
&& [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\].*" \
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 {