Jan Kratochvil 7ecbbb2
http://sourceware.org/ml/gdb-patches/2015-10/msg00301.html
Jan Kratochvil 7ecbbb2
Subject: [PATCH 1/3] Never kill PID on: gdb exec PID
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
Hi,
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
in some cases with deleted main executable GDB will want to kill the inferior.
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
$ cp /bin/sleep /tmp/sleep;/tmp/sleep 1h&p=$!
Jan Kratochvil 7ecbbb2
$ rm /tmp/sleep
Jan Kratochvil 7ecbbb2
$ gdb /tmp/sleep $p
Jan Kratochvil 7ecbbb2
GNU gdb (GDB) 7.10.50.20151016-cvs
Jan Kratochvil 7ecbbb2
/tmp/sleep: No such file or directory.
Jan Kratochvil 7ecbbb2
Attaching to process 9694
Jan Kratochvil 7ecbbb2
/tmp/sleep (deleted): No such file or directory.
Jan Kratochvil 7ecbbb2
A program is being debugged already.  Kill it? (y or n) _
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
The first attachment of "/tmp/sleep" commandline argument errors at:
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
#0  throw_error (error=GENERIC_ERROR, fmt=0x116d135 "%s.") at ./common/common-exceptions.c:371
Jan Kratochvil 7ecbbb2
#1  in throw_perror_with_name (errcode=GENERIC_ERROR, string=0x7fffffffdb96 "/dfsfds") at utils.c:974
Jan Kratochvil 7ecbbb2
#2  in perror_with_name (string=0x7fffffffdb96 "/dfsfds") at utils.c:982
Jan Kratochvil 7ecbbb2
#3  in exec_file_attach (filename=0x7fffffffdb96 "/dfsfds", from_tty=1) at exec.c:268
Jan Kratochvil 7ecbbb2
267               if (scratch_chan < 0)
Jan Kratochvil 7ecbbb2
268                 perror_with_name (filename);
Jan Kratochvil 7ecbbb2
#4  in catch_command_errors_const (command=0x80f59f <exec_file_attach>, arg=0x7fffffffdb96 "/dfsfds", from_tty=1) at main.c:395
Jan Kratochvil 7ecbbb2
#5  in captured_main (data=0x7fffffffd6f0) at main.c:1051
Jan Kratochvil 7ecbbb2
1051          if (catch_command_errors_const (exec_file_attach, execarg,
Jan Kratochvil 7ecbbb2
1052                                          !batch_flag))
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
Then GDB tries to attach to the process $p:
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
#0  inferior_appeared (inf=0x240e0b0, pid=29210) at inferior.c:305
Jan Kratochvil 7ecbbb2
#1  in inf_ptrace_attach (ops=0x2339540, args=0x21dcdc0 "29210", from_tty=1) at inf-ptrace.c:206
Jan Kratochvil 7ecbbb2
#2  in linux_nat_attach (ops=0x2339540, args=0x21dcdc0 "29210", from_tty=1) at linux-nat.c:1278
Jan Kratochvil 7ecbbb2
#3  in attach_command (args=0x21dcdc0 "29210", from_tty=1) at infcmd.c:2748
Jan Kratochvil 7ecbbb2
#4  in catch_command_errors (command=0x79d7e5 <attach_command>, arg=0x7fffffffdb9e "29210", from_tty=1) at main.c:368
Jan Kratochvil 7ecbbb2
#5  in captured_main (data=0x7fffffffd6f0) at main.c:1082
Jan Kratochvil 7ecbbb2
1082              if (catch_command_errors (attach_command, pid_or_core_arg,
Jan Kratochvil 7ecbbb2
1083                                        !batch_flag) == 0)
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
This succeeds and since this moment GDB has a valid inferior.  But despite that
Jan Kratochvil 7ecbbb2
the lines
Jan Kratochvil 7ecbbb2
1082              if (catch_command_errors (attach_command, pid_or_core_arg,
Jan Kratochvil 7ecbbb2
1083                                        !batch_flag) == 0)
Jan Kratochvil 7ecbbb2
still fail because consequently attach_command() fails to find the associated
Jan Kratochvil 7ecbbb2
executable file:
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
#0  throw_error (error=GENERIC_ERROR, fmt=0x116d135 "%s.") at ./common/common-exceptions.c:371
Jan Kratochvil 7ecbbb2
#1  in throw_perror_with_name (errcode=GENERIC_ERROR, string=0x2477860 "/tmp/sleep (deleted)") at utils.c:974
Jan Kratochvil 7ecbbb2
#2  in perror_with_name (string=0x2477860 "/tmp/sleep (deleted)") at utils.c:982
Jan Kratochvil 7ecbbb2
#3  in exec_file_attach (filename=0x2477860 "/tmp/sleep (deleted)", from_tty=1) at exec.c:268
Jan Kratochvil 7ecbbb2
267               if (scratch_chan < 0)
Jan Kratochvil 7ecbbb2
268                 perror_with_name (filename);
Jan Kratochvil 7ecbbb2
#4  in exec_file_locate_attach (pid=29210, from_tty=1) at exec.c:173
Jan Kratochvil 7ecbbb2
#5  in attach_command_post_wait (args=0x24739b0 "29210", from_tty=1, async_exec=0) at infcmd.c:2628
Jan Kratochvil 7ecbbb2
#6  in attach_command_continuation (args=0x2473590, err=0) at infcmd.c:2700
Jan Kratochvil 7ecbbb2
#7  in do_my_continuations_1 (pmy_chain=0x7fffffffd190, err=0) at continuations.c:59
Jan Kratochvil 7ecbbb2
#8  in do_my_continuations (list=0x240e130, err=0) at continuations.c:83
Jan Kratochvil 7ecbbb2
#9  in do_all_inferior_continuations (err=0) at continuations.c:125
Jan Kratochvil 7ecbbb2
#10 in inferior_event_handler (event_type=INF_EXEC_COMPLETE, client_data=0x0) at inf-loop.c:60
Jan Kratochvil 7ecbbb2
#11 in fetch_inferior_event (client_data=0x0) at infrun.c:3929
Jan Kratochvil 7ecbbb2
#12 in inferior_event_handler (event_type=INF_REG_EVENT, client_data=0x0) at inf-loop.c:44
Jan Kratochvil 7ecbbb2
#13 in handle_target_event (error=0, client_data=0x0) at linux-nat.c:4681
Jan Kratochvil 7ecbbb2
#14 in handle_file_event (file_ptr=0x21e4170, ready_mask=1) at event-loop.c:708
Jan Kratochvil 7ecbbb2
#15 in gdb_wait_for_event (block=0) at event-loop.c:834
Jan Kratochvil 7ecbbb2
#16 in gdb_do_one_event () at event-loop.c:298
Jan Kratochvil 7ecbbb2
#17 in wait_sync_command_done () at top.c:373
Jan Kratochvil 7ecbbb2
#18 in maybe_wait_sync_command_done (was_sync=0) at top.c:388
Jan Kratochvil 7ecbbb2
#19 in catch_command_errors (command=0x79d7e5 <attach_command>, arg=0x7fffffffdb9e "29210", from_tty=1) at main.c:370
Jan Kratochvil 7ecbbb2
#20 in captured_main (data=0x7fffffffd6f0) at main.c:1082
Jan Kratochvil 7ecbbb2
1082              if (catch_command_errors (attach_command, pid_or_core_arg,
Jan Kratochvil 7ecbbb2
1083                                        !batch_flag) == 0)
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
and therefore GDB executes the following:
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
(gdb) bt
Jan Kratochvil 7ecbbb2
#5  in query (ctlstr=0x1141ae8 "A program is being debugged already.  Kill it? ") at utils.c:1371
Jan Kratochvil 7ecbbb2
#6  in target_preopen (from_tty=1) at target.c:2183
Jan Kratochvil 7ecbbb2
2179	  if (have_inferiors ())
Jan Kratochvil 7ecbbb2
2180	    {
Jan Kratochvil 7ecbbb2
2181	      if (!from_tty
Jan Kratochvil 7ecbbb2
2182		  || !have_live_inferiors ()
Jan Kratochvil 7ecbbb2
2183		  || query (_("A program is being debugged already.  Kill it? ")))
Jan Kratochvil 7ecbbb2
2184		iterate_over_inferiors (dispose_inferior, NULL);
Jan Kratochvil 7ecbbb2
2185	      else
Jan Kratochvil 7ecbbb2
2186		error (_("Program not killed."));
Jan Kratochvil 7ecbbb2
2187	    }
Jan Kratochvil 7ecbbb2
#7  in core_open (arg=0x7fffffffdb9f "9694", from_tty=1) at corelow.c:283
Jan Kratochvil 7ecbbb2
#8  in core_file_command (filename=0x7fffffffdb9f "9694", from_tty=1) at corefile.c:77
Jan Kratochvil 7ecbbb2
#9  in catch_command_errors (command=0x86ca16 <core_file_command>, arg=0x7fffffffdb9f "9694", from_tty=1) at main.c:368
Jan Kratochvil 7ecbbb2
#10 in captured_main (data=0x7fffffffd6f0) at main.c:1084
Jan Kratochvil 7ecbbb2
1084		    catch_command_errors (core_file_command, pid_or_core_arg,
Jan Kratochvil 7ecbbb2
1085					  !batch_flag);
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
No regressions on {x86_64,x86_64-m32,i686}-fedora24pre-linux-gnu.
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
Thanks,
Jan Kratochvil 7ecbbb2
Jan
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
gdb/ChangeLog
Jan Kratochvil 7ecbbb2
2015-10-16  Jan Kratochvil  <jan.kratochvil@redhat.com>
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
	* main.c (captured_main): Run core_file_command for pid_or_core_arg
Jan Kratochvil 7ecbbb2
	only if not have_inferiors ().
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
gdb/testsuite/ChangeLog
Jan Kratochvil 7ecbbb2
2015-10-16  Jan Kratochvil  <jan.kratochvil@redhat.com>
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
	* gdb.base/attach-kills.c: New.
Jan Kratochvil 7ecbbb2
	* gdb.base/attach-kills.exp: New.
Jan Kratochvil 7ecbbb2
---
Jan Kratochvil 7ecbbb2
 gdb/testsuite/gdb.base/attach-kills.c   |   25 ++++++++++++++++
Jan Kratochvil 7ecbbb2
 gdb/testsuite/gdb.base/attach-kills.exp |   49 +++++++++++++++++++++++++++++++
Jan Kratochvil 7ecbbb2
 2 files changed, 74 insertions(+)
Jan Kratochvil 7ecbbb2
 create mode 100644 gdb/testsuite/gdb.base/attach-kills.c
Jan Kratochvil 7ecbbb2
 create mode 100644 gdb/testsuite/gdb.base/attach-kills.exp
Jan Kratochvil 7ecbbb2
Jan Kratochvil 7ecbbb2
diff --git a/gdb/main.c b/gdb/main.c
Jan Kratochvil 7ecbbb2
index 49c9b68..bc19699 100644
Jan Kratochvil 7ecbbb2
--- a/gdb/main.c
Jan Kratochvil 7ecbbb2
+++ b/gdb/main.c
Jan Kratochvil 7ecbbb2
@@ -1080,7 +1080,10 @@ captured_main (void *data)
Jan Kratochvil 7ecbbb2
       if (isdigit (pid_or_core_arg[0]))
Jan Kratochvil 7ecbbb2
 	{
Jan Kratochvil 7ecbbb2
 	  if (catch_command_errors (attach_command, pid_or_core_arg,
Jan Kratochvil 7ecbbb2
-				    !batch_flag) == 0)
Jan Kratochvil 7ecbbb2
+				    !batch_flag) == 0
Jan Kratochvil 7ecbbb2
+	      /* attach_command could succeed partially and core_file_command
Jan Kratochvil 7ecbbb2
+		 would try to kill it.  */
Jan Kratochvil 7ecbbb2
+	      && !have_inferiors ())
Jan Kratochvil 7ecbbb2
 	    catch_command_errors (core_file_command, pid_or_core_arg,
Jan Kratochvil 7ecbbb2
 				  !batch_flag);
Jan Kratochvil 7ecbbb2
 	}
Jan Kratochvil 7ecbbb2
diff --git a/gdb/testsuite/gdb.base/attach-kills.c b/gdb/testsuite/gdb.base/attach-kills.c
Jan Kratochvil 7ecbbb2
new file mode 100644
Jan Kratochvil 7ecbbb2
index 0000000..2398f00
Jan Kratochvil 7ecbbb2
--- /dev/null
Jan Kratochvil 7ecbbb2
+++ b/gdb/testsuite/gdb.base/attach-kills.c
Jan Kratochvil 7ecbbb2
@@ -0,0 +1,25 @@
Jan Kratochvil 7ecbbb2
+/* This testcase is part of GDB, the GNU debugger.
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+   Copyright 2015 Free Software Foundation, Inc.
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+   This program is free software; you can redistribute it and/or modify
Jan Kratochvil 7ecbbb2
+   it under the terms of the GNU General Public License as published by
Jan Kratochvil 7ecbbb2
+   the Free Software Foundation; either version 3 of the License, or
Jan Kratochvil 7ecbbb2
+   (at your option) any later version.
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+   This program is distributed in the hope that it will be useful,
Jan Kratochvil 7ecbbb2
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
Jan Kratochvil 7ecbbb2
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Jan Kratochvil 7ecbbb2
+   GNU General Public License for more details.
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+   You should have received a copy of the GNU General Public License
Jan Kratochvil 7ecbbb2
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+#include <unistd.h>
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+int
Jan Kratochvil 7ecbbb2
+main (void)
Jan Kratochvil 7ecbbb2
+{
Jan Kratochvil 7ecbbb2
+  sleep (600);
Jan Kratochvil 7ecbbb2
+  return 0;
Jan Kratochvil 7ecbbb2
+}
Jan Kratochvil 7ecbbb2
diff --git a/gdb/testsuite/gdb.base/attach-kills.exp b/gdb/testsuite/gdb.base/attach-kills.exp
Jan Kratochvil 7ecbbb2
new file mode 100644
Jan Kratochvil 7ecbbb2
index 0000000..9a93cb7
Jan Kratochvil 7ecbbb2
--- /dev/null
Jan Kratochvil 7ecbbb2
+++ b/gdb/testsuite/gdb.base/attach-kills.exp
Jan Kratochvil 7ecbbb2
@@ -0,0 +1,49 @@
Jan Kratochvil 7ecbbb2
+# Copyright (C) 2015 Free Software Foundation, Inc.
Jan Kratochvil 7ecbbb2
+#
Jan Kratochvil 7ecbbb2
+# This program is free software; you can redistribute it and/or modify
Jan Kratochvil 7ecbbb2
+# it under the terms of the GNU General Public License as published by
Jan Kratochvil 7ecbbb2
+# the Free Software Foundation; either version 3 of the License, or
Jan Kratochvil 7ecbbb2
+# (at your option) any later version.
Jan Kratochvil 7ecbbb2
+#
Jan Kratochvil 7ecbbb2
+# This program is distributed in the hope that it will be useful,
Jan Kratochvil 7ecbbb2
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
Jan Kratochvil 7ecbbb2
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Jan Kratochvil 7ecbbb2
+# GNU General Public License for more details.
Jan Kratochvil 7ecbbb2
+#
Jan Kratochvil 7ecbbb2
+# You should have received a copy of the GNU General Public License
Jan Kratochvil 7ecbbb2
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+if { ![can_spawn_for_attach] } {
Jan Kratochvil 7ecbbb2
+    return 0
Jan Kratochvil 7ecbbb2
+}
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+standard_testfile
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+if { [build_executable ${testfile}.exp $testfile] == -1 } {
Jan Kratochvil 7ecbbb2
+    return -1
Jan Kratochvil 7ecbbb2
+}
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+# Start the program running and then wait for a bit, to be sure
Jan Kratochvil 7ecbbb2
+# that it can be attached to.
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+set test_spawn_id [spawn_wait_for_attach $binfile]
Jan Kratochvil 7ecbbb2
+set testpid [spawn_id_get_pid $test_spawn_id]
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+remote_exec target "cp -pf -- $binfile $binfile-copy"
Jan Kratochvil 7ecbbb2
+remote_exec target "rm -f -- $binfile"
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+set test "start gdb"
Jan Kratochvil 7ecbbb2
+set res [gdb_spawn_with_cmdline_opts \
Jan Kratochvil 7ecbbb2
+	 "-iex \"set height 0\" -iex \"set width 0\" /DoEsNoTeXySt $testpid"]
Jan Kratochvil 7ecbbb2
+if { $res != 0} {
Jan Kratochvil 7ecbbb2
+    fail "$test (spawn)"
Jan Kratochvil 7ecbbb2
+    kill_wait_spawned_process $test_spawn_id
Jan Kratochvil 7ecbbb2
+    return -1
Jan Kratochvil 7ecbbb2
+}
Jan Kratochvil 7ecbbb2
+gdb_test_multiple "" $test {
Jan Kratochvil 7ecbbb2
+    -re "\r\nAttaching to .*\r\n$gdb_prompt $" {
Jan Kratochvil 7ecbbb2
+	pass $test
Jan Kratochvil 7ecbbb2
+    }
Jan Kratochvil 7ecbbb2
+}
Jan Kratochvil 7ecbbb2
+
Jan Kratochvil 7ecbbb2
+kill_wait_spawned_process $test_spawn_id
Jan Kratochvil 7ecbbb2