diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2018-06-22 20:39:26 +0100 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2018-08-08 13:14:45 +0100 |
commit | 9d4a934ce604afea155c39f06834cdbc47e92a6e (patch) | |
tree | cd9eb8f646f081bae3a5978fa8b7790c4094d4c0 /gdb/testsuite/gdb.server/extended-remote-restart.c | |
parent | ff36536c9273734af6f84832b583c10f44c5010e (diff) | |
download | binutils-9d4a934ce604afea155c39f06834cdbc47e92a6e.zip binutils-9d4a934ce604afea155c39f06834cdbc47e92a6e.tar.gz binutils-9d4a934ce604afea155c39f06834cdbc47e92a6e.tar.bz2 |
gdb: Fix assert for extended-remote target (PR gdb/18050)
Consider the following GDB session:
(gdb) target extended-remote :2347
(gdb) file /path/to/exe
(gdb) set remote exec-file /path/to/exe
(gdb) set detach-on-fork off
(gdb) break breakpt
(gdb) run
# ... hits breakpoint
(gdb) info inferiors
Num Description Executable
* 1 process 17001 /path/to/exe
2 process 17002 /path/to/exe
(gdb) kill
(gdb) info inferiors
Num Description Executable
* 1 <null> /path/to/exe
2 process 17002 /path/to/exe
(gdb) target extended-remote :2348
../../src/gdb/thread.c:660: internal-error: thread_info* any_thread_of_process(int): Assertion `pid != 0' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Or, from bug PR gdb/18050:
(gdb) start
(gdb) add-inferior -exec /path/to/exe
(gdb) target extended-remote :2347
../../src/gdb/thread.c:660: internal-error: thread_info* any_thread_of_process(int): Assertion `pid != 0' failed.
A problem internal to GDB has been detected,
further debugging may prove unreliable.
The issue is calling target.c:dispose_inferior with a killed inferior in
the inferior list. This assertion is fixed in this commit.
The new test for this issue only runs on platforms that support
'detach-on-fork', and when using
'--target_board=native-extended-gdbserver'.
gdb/ChangeLog:
PR gdb/18050:
* target.c (dispose_inferior): Don't dispose of inferiors that are
already killed.
gdb/testsuite/ChangeLog:
PR gdb/18050:
* gdb.server/extended-remote-restart.c: New file.
* gdb.server/extended-remote-restart.exp: New file.
Diffstat (limited to 'gdb/testsuite/gdb.server/extended-remote-restart.c')
-rw-r--r-- | gdb/testsuite/gdb.server/extended-remote-restart.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.server/extended-remote-restart.c b/gdb/testsuite/gdb.server/extended-remote-restart.c new file mode 100644 index 0000000..e195f48 --- /dev/null +++ b/gdb/testsuite/gdb.server/extended-remote-restart.c @@ -0,0 +1,60 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 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 <unistd.h> +#include <stdlib.h> + +static void +breakpt () +{ + asm ("" ::: "memory"); +} + +static void +go_child () +{ + breakpt (); + + while (1) + sleep (1); +} + +static void +go_parent () +{ + breakpt (); + + while (1) + sleep (1); +} + +int +main () +{ + pid_t pid; + + pid = fork (); + if (pid == -1) + abort (); + + if (pid == 0) + go_child (); + else + go_parent (); + + exit (EXIT_SUCCESS); +} |