mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-28 04:25:10 +08:00
PR server/18081: gdbserver crashes when providing an unexisting binary
$ ./gdbserver :1234 blah Process blah created; pid = 16471 Cannot exec blah: No such file or directory. Child exited with status 127 Killing process(es): 16471 ../../../../src/binutils-gdb/gdb/gdbserver/linux-low.c:920: A problem internal to GDBserver has been detected. kill_wait_lwp: Assertion `res > 0' failed. GDBserver shouldn't even be trying to kill that process. GDBserver kills or detaches from all processes on exit, and due to a missing mourn_inferior call, GDBserver tries to kill the process that it had already seen exit. Tested on x86_64 Fedora 20. New test included. I emulated what Windows outputs by hacking an error call in linux_create_inferior. gdb/gdbserver/ChangeLog: 2015-05-06 Pedro Alves <palves@redhat.com> PR server/18081 * server.c (start_inferior): If the process exits, mourn it. gdb/testsuite/ChangeLog: 2015-05-06 Pedro Alves <palves@redhat.com> PR server/18081 * gdb.server/non-existing-program.exp: New file.
This commit is contained in:
parent
f218b647aa
commit
80ad801e90
@ -1,3 +1,8 @@
|
||||
2015-05-06 Pedro Alves <palves@redhat.com>
|
||||
|
||||
PR server/18081
|
||||
* server.c (start_inferior): If the process exits, mourn it.
|
||||
|
||||
2015-04-21 Gary Benson <gbenson@redhat.com>
|
||||
|
||||
* hostio.c (fileio_open_flags_to_host): Factored out to
|
||||
|
@ -284,6 +284,8 @@ start_inferior (char **argv)
|
||||
current_thread->last_resume_kind = resume_stop;
|
||||
current_thread->last_status = last_status;
|
||||
}
|
||||
else
|
||||
mourn_inferior (find_process_pid (ptid_get_pid (last_ptid)));
|
||||
|
||||
return signal_pid;
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
2015-05-06 Pedro Alves <palves@redhat.com>
|
||||
|
||||
PR server/18081
|
||||
* gdb.server/non-existing-program.exp: New file.
|
||||
|
||||
2015-05-05 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* gdb.ada/out_of_line_in_inlined.exp: Add run and "bt" tests.
|
||||
|
63
gdb/testsuite/gdb.server/non-existing-program.exp
Normal file
63
gdb/testsuite/gdb.server/non-existing-program.exp
Normal file
@ -0,0 +1,63 @@
|
||||
# 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/>.
|
||||
|
||||
# Test starting gdbserver passing it the name of a non-existing
|
||||
# program.
|
||||
|
||||
load_lib gdbserver-support.exp
|
||||
|
||||
standard_testfile
|
||||
|
||||
if { [skip_gdbserver_tests] } {
|
||||
return 0
|
||||
}
|
||||
|
||||
set gdbserver [find_gdbserver]
|
||||
if { $gdbserver == "" } {
|
||||
fail "could not find gdbserver"
|
||||
return
|
||||
}
|
||||
|
||||
# Fire off gdbserver. The port doesn't really matter, gdbserver tries
|
||||
# to spawn the program before opening the connection.
|
||||
set spawn_id [remote_spawn target "$gdbserver stdio non-existing-program"]
|
||||
|
||||
set msg "gdbserver exits cleanly"
|
||||
set saw_exiting 0
|
||||
expect {
|
||||
# This is what we get on ptrace-based targets.
|
||||
-re "stdin/stdout redirected.*No program to debug\r\nExiting\r\n$" {
|
||||
set saw_exiting 1
|
||||
exp_continue
|
||||
}
|
||||
# This is what we get on Windows.
|
||||
-re "Error creating process\r\n\r\nExiting\r\n$" {
|
||||
set saw_exiting 1
|
||||
exp_continue
|
||||
}
|
||||
-re "A problem internal to GDBserver has been detected" {
|
||||
fail "$msg (GDBserver internal error)"
|
||||
wait
|
||||
}
|
||||
eof {
|
||||
gdb_assert $saw_exiting $msg
|
||||
wait
|
||||
}
|
||||
timeout {
|
||||
fail "$msg (timeout)"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user