You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
9.1 KiB
209 lines
9.1 KiB
http://sourceware.org/ml/gdb-patches/2015-10/msg00301.html |
|
Subject: [PATCH 1/3] Never kill PID on: gdb exec PID |
|
|
|
Hi, |
|
|
|
in some cases with deleted main executable GDB will want to kill the inferior. |
|
|
|
$ cp /bin/sleep /tmp/sleep;/tmp/sleep 1h&p=$! |
|
$ rm /tmp/sleep |
|
$ gdb /tmp/sleep $p |
|
GNU gdb (GDB) 7.10.50.20151016-cvs |
|
/tmp/sleep: No such file or directory. |
|
Attaching to process 9694 |
|
/tmp/sleep (deleted): No such file or directory. |
|
A program is being debugged already. Kill it? (y or n) _ |
|
|
|
The first attachment of "/tmp/sleep" commandline argument errors at: |
|
|
|
#0 throw_error (error=GENERIC_ERROR, fmt=0x116d135 "%s.") at ./common/common-exceptions.c:371 |
|
#1 in throw_perror_with_name (errcode=GENERIC_ERROR, string=0x7fffffffdb96 "/dfsfds") at utils.c:974 |
|
#2 in perror_with_name (string=0x7fffffffdb96 "/dfsfds") at utils.c:982 |
|
#3 in exec_file_attach (filename=0x7fffffffdb96 "/dfsfds", from_tty=1) at exec.c:268 |
|
267 if (scratch_chan < 0) |
|
268 perror_with_name (filename); |
|
#4 in catch_command_errors_const (command=0x80f59f <exec_file_attach>, arg=0x7fffffffdb96 "/dfsfds", from_tty=1) at main.c:395 |
|
#5 in captured_main (data=0x7fffffffd6f0) at main.c:1051 |
|
1051 if (catch_command_errors_const (exec_file_attach, execarg, |
|
1052 !batch_flag)) |
|
|
|
Then GDB tries to attach to the process $p: |
|
|
|
#0 inferior_appeared (inf=0x240e0b0, pid=29210) at inferior.c:305 |
|
#1 in inf_ptrace_attach (ops=0x2339540, args=0x21dcdc0 "29210", from_tty=1) at inf-ptrace.c:206 |
|
#2 in linux_nat_attach (ops=0x2339540, args=0x21dcdc0 "29210", from_tty=1) at linux-nat.c:1278 |
|
#3 in attach_command (args=0x21dcdc0 "29210", from_tty=1) at infcmd.c:2748 |
|
#4 in catch_command_errors (command=0x79d7e5 <attach_command>, arg=0x7fffffffdb9e "29210", from_tty=1) at main.c:368 |
|
#5 in captured_main (data=0x7fffffffd6f0) at main.c:1082 |
|
1082 if (catch_command_errors (attach_command, pid_or_core_arg, |
|
1083 !batch_flag) == 0) |
|
|
|
This succeeds and since this moment GDB has a valid inferior. But despite that |
|
the lines |
|
1082 if (catch_command_errors (attach_command, pid_or_core_arg, |
|
1083 !batch_flag) == 0) |
|
still fail because consequently attach_command() fails to find the associated |
|
executable file: |
|
|
|
#0 throw_error (error=GENERIC_ERROR, fmt=0x116d135 "%s.") at ./common/common-exceptions.c:371 |
|
#1 in throw_perror_with_name (errcode=GENERIC_ERROR, string=0x2477860 "/tmp/sleep (deleted)") at utils.c:974 |
|
#2 in perror_with_name (string=0x2477860 "/tmp/sleep (deleted)") at utils.c:982 |
|
#3 in exec_file_attach (filename=0x2477860 "/tmp/sleep (deleted)", from_tty=1) at exec.c:268 |
|
267 if (scratch_chan < 0) |
|
268 perror_with_name (filename); |
|
#4 in exec_file_locate_attach (pid=29210, from_tty=1) at exec.c:173 |
|
#5 in attach_command_post_wait (args=0x24739b0 "29210", from_tty=1, async_exec=0) at infcmd.c:2628 |
|
#6 in attach_command_continuation (args=0x2473590, err=0) at infcmd.c:2700 |
|
#7 in do_my_continuations_1 (pmy_chain=0x7fffffffd190, err=0) at continuations.c:59 |
|
#8 in do_my_continuations (list=0x240e130, err=0) at continuations.c:83 |
|
#9 in do_all_inferior_continuations (err=0) at continuations.c:125 |
|
#10 in inferior_event_handler (event_type=INF_EXEC_COMPLETE, client_data=0x0) at inf-loop.c:60 |
|
#11 in fetch_inferior_event (client_data=0x0) at infrun.c:3929 |
|
#12 in inferior_event_handler (event_type=INF_REG_EVENT, client_data=0x0) at inf-loop.c:44 |
|
#13 in handle_target_event (error=0, client_data=0x0) at linux-nat.c:4681 |
|
#14 in handle_file_event (file_ptr=0x21e4170, ready_mask=1) at event-loop.c:708 |
|
#15 in gdb_wait_for_event (block=0) at event-loop.c:834 |
|
#16 in gdb_do_one_event () at event-loop.c:298 |
|
#17 in wait_sync_command_done () at top.c:373 |
|
#18 in maybe_wait_sync_command_done (was_sync=0) at top.c:388 |
|
#19 in catch_command_errors (command=0x79d7e5 <attach_command>, arg=0x7fffffffdb9e "29210", from_tty=1) at main.c:370 |
|
#20 in captured_main (data=0x7fffffffd6f0) at main.c:1082 |
|
1082 if (catch_command_errors (attach_command, pid_or_core_arg, |
|
1083 !batch_flag) == 0) |
|
|
|
and therefore GDB executes the following: |
|
|
|
(gdb) bt |
|
#5 in query (ctlstr=0x1141ae8 "A program is being debugged already. Kill it? ") at utils.c:1371 |
|
#6 in target_preopen (from_tty=1) at target.c:2183 |
|
2179 if (have_inferiors ()) |
|
2180 { |
|
2181 if (!from_tty |
|
2182 || !have_live_inferiors () |
|
2183 || query (_("A program is being debugged already. Kill it? "))) |
|
2184 iterate_over_inferiors (dispose_inferior, NULL); |
|
2185 else |
|
2186 error (_("Program not killed.")); |
|
2187 } |
|
#7 in core_open (arg=0x7fffffffdb9f "9694", from_tty=1) at corelow.c:283 |
|
#8 in core_file_command (filename=0x7fffffffdb9f "9694", from_tty=1) at corefile.c:77 |
|
#9 in catch_command_errors (command=0x86ca16 <core_file_command>, arg=0x7fffffffdb9f "9694", from_tty=1) at main.c:368 |
|
#10 in captured_main (data=0x7fffffffd6f0) at main.c:1084 |
|
1084 catch_command_errors (core_file_command, pid_or_core_arg, |
|
1085 !batch_flag); |
|
|
|
No regressions on {x86_64,x86_64-m32,i686}-fedora24pre-linux-gnu. |
|
|
|
|
|
Thanks, |
|
Jan |
|
|
|
|
|
gdb/ChangeLog |
|
2015-10-16 Jan Kratochvil <jan.kratochvil@redhat.com> |
|
|
|
* main.c (captured_main): Run core_file_command for pid_or_core_arg |
|
only if not have_inferiors (). |
|
|
|
gdb/testsuite/ChangeLog |
|
2015-10-16 Jan Kratochvil <jan.kratochvil@redhat.com> |
|
|
|
* gdb.base/attach-kills.c: New. |
|
* gdb.base/attach-kills.exp: New. |
|
--- |
|
gdb/testsuite/gdb.base/attach-kills.c | 25 ++++++++++++++++ |
|
gdb/testsuite/gdb.base/attach-kills.exp | 49 +++++++++++++++++++++++++++++++ |
|
2 files changed, 74 insertions(+) |
|
create mode 100644 gdb/testsuite/gdb.base/attach-kills.c |
|
create mode 100644 gdb/testsuite/gdb.base/attach-kills.exp |
|
|
|
Index: gdb-7.2/gdb/main.c |
|
=================================================================== |
|
--- gdb-7.2.orig/gdb/main.c 2015-10-16 22:53:14.000000000 +0200 |
|
+++ gdb-7.2/gdb/main.c 2015-10-16 22:53:58.840722140 +0200 |
|
@@ -975,7 +975,10 @@ Can't attach to process and specify a co |
|
if (isdigit (pid_or_core_arg[0])) |
|
{ |
|
if (catch_command_errors (attach_command, pid_or_core_arg, |
|
- !batch_flag, RETURN_MASK_ALL) == 0) |
|
+ !batch_flag, RETURN_MASK_ALL) == 0 |
|
+ /* attach_command could succeed partially and core_file_command |
|
+ would try to kill it. */ |
|
+ && !have_inferiors ()) |
|
catch_command_errors (core_file_command, pid_or_core_arg, |
|
!batch_flag, RETURN_MASK_ALL); |
|
} |
|
Index: gdb-7.2/gdb/testsuite/gdb.base/attach-kills.c |
|
=================================================================== |
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 |
|
+++ gdb-7.2/gdb/testsuite/gdb.base/attach-kills.c 2015-10-16 22:53:22.843486331 +0200 |
|
@@ -0,0 +1,25 @@ |
|
+/* This testcase is part of GDB, the GNU debugger. |
|
+ |
|
+ Copyright 2015 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 <unistd.h> |
|
+ |
|
+int |
|
+main (void) |
|
+{ |
|
+ sleep (600); |
|
+ return 0; |
|
+} |
|
Index: gdb-7.2/gdb/testsuite/gdb.base/attach-kills.exp |
|
=================================================================== |
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 |
|
+++ gdb-7.2/gdb/testsuite/gdb.base/attach-kills.exp 2015-10-16 23:02:33.791095444 +0200 |
|
@@ -0,0 +1,39 @@ |
|
+# Copyright (C) 2015 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/>. |
|
+ |
|
+set testfile attach-kills |
|
+set binfile ${objdir}/${subdir}/${testfile} |
|
+ |
|
+if { [build_executable ${testfile}.exp $testfile] == -1 } { |
|
+ return -1 |
|
+} |
|
+ |
|
+# Start the program running and then wait for a bit, to be sure |
|
+# that it can be attached to. |
|
+ |
|
+set testpid [eval exec $binfile &] |
|
+exec sleep 2 |
|
+ |
|
+remote_exec target "cp -pf -- $binfile $binfile-copy" |
|
+remote_exec target "rm -f -- $binfile" |
|
+ |
|
+set GDBFLAGS_orig $GDBFLAGS |
|
+set GDBFLAGS "$GDBFLAGS /DoEsNoTeXySt $testpid" |
|
+gdb_start |
|
+set GDBFLAGS $GDBFLAGS_orig |
|
+ |
|
+gdb_test "info inferiors" " process \[0-9\].*" |
|
+ |
|
+remote_exec build "kill -9 ${testpid}"
|
|
|