diff options
author | Tom de Vries <tdevries@suse.de> | 2018-07-03 17:08:42 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2018-07-26 00:56:41 +0200 |
commit | 9e7f3bbbbf5a13e879a4cc3cfa958412ffac0d9d (patch) | |
tree | 1ec1b56f2d5f3784a42a4bcbaaaf0409abe11126 /gdb | |
parent | 4a1b91eabbe77f4d906a0895121d76a0653c3cf3 (diff) | |
download | gdb-9e7f3bbbbf5a13e879a4cc3cfa958412ffac0d9d.zip gdb-9e7f3bbbbf5a13e879a4cc3cfa958412ffac0d9d.tar.gz gdb-9e7f3bbbbf5a13e879a4cc3cfa958412ffac0d9d.tar.bz2 |
[gdb/breakpoints] Fix sigsegv in info prog at exec catchpoint
With the test-case contained in this patch and compiled for debug we run into
a segfault with trunk gdb:
...
$ gdb catch-follow-exec -batch -ex "catch exec" \
-ex "set follow-exec-mode new" -ex "run" -ex "info prog"
Catchpoint 1 (exec)
process xxx is executing new program: /usr/bin/ls
[New inferior 2 (process 0)]
[New process xxx]
Thread 2.1 "ls" hit Catchpoint 1 (exec'd /usr/bin/ls), in _start () from
/lib64/ld-linux-x86-64.so.2
Segmentation fault (core dumped)
...
The patch fixes the segfault by returning an error in info_program_command
if get_last_target_status returns minus_one_ptid.
The test-case is non-standard, because the standard approach runs into
PR23368, a problem with gdb going to the background.
Build and reg-tested on x86_64-linux.
2018-07-26 Tom de Vries <tdevries@suse.de>
PR breakpoints/23366
* infcmd.c (info_program_command): Handle ptid == minus_one_ptid.
* gdb.base/catch-follow-exec.c: New test.
* gdb.base/catch-follow-exec.exp: New file.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/infcmd.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/catch-follow-exec.c | 10 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/catch-follow-exec.exp | 58 |
5 files changed, 80 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ee5c9ea..605aeef 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2018-07-26 Tom de Vries <tdevries@suse.de> + PR breakpoints/23366 + * infcmd.c (info_program_command): Handle ptid == minus_one_ptid. + +2018-07-26 Tom de Vries <tdevries@suse.de> + * dwarf2read.c (read_subrange_type): Warn if DW_AT_upper_bound or DW_AT_count can't be translated to a dynamic prop. diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 821bcc6..74d5956 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -2091,7 +2091,7 @@ info_program_command (const char *args, int from_tty) get_last_target_status (&ptid, &ws); } - if (ptid == null_ptid) + if (ptid == null_ptid || ptid == minus_one_ptid) error (_("No selected thread.")); thread_info *tp = find_thread_ptid (ptid); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ab50f70..aa8b06a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-07-26 Tom de Vries <tdevries@suse.de> + + PR breakpoints/23366 + * gdb.base/catch-follow-exec.c: New test. + * gdb.base/catch-follow-exec.exp: New file. + 2018-07-25 Tom de Vries <tdevries@suse.de> * gdb.base/vla-optimized-out-o3.exp: New file. Reuse diff --git a/gdb/testsuite/gdb.base/catch-follow-exec.c b/gdb/testsuite/gdb.base/catch-follow-exec.c new file mode 100644 index 0000000..fa68a2a --- /dev/null +++ b/gdb/testsuite/gdb.base/catch-follow-exec.c @@ -0,0 +1,10 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +int +main (void) +{ + char *exec_args[] = { "/bin/ls", "ppp", NULL }; + execve (exec_args[0], exec_args, NULL); +} diff --git a/gdb/testsuite/gdb.base/catch-follow-exec.exp b/gdb/testsuite/gdb.base/catch-follow-exec.exp new file mode 100644 index 0000000..0e32ed4 --- /dev/null +++ b/gdb/testsuite/gdb.base/catch-follow-exec.exp @@ -0,0 +1,58 @@ +# 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/>. + +# Check whether finish respects the print pretty user setting when printing the +# function result. + +standard_testfile + +if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} { + return -1 +} + +if { ![remote_file target exists /bin/bash] } { + unsupported "no bash" + return +} + +if { ![remote_file target exists /bin/ls] } { + unsupported "no ls" + return +} + +proc catch_follow_exec { } { + global binfile + global GDB + + set test "catch-follow-exec" + + append FLAGS " \"$binfile\"" + append FLAGS " -batch" + append FLAGS " -ex \"catch exec\"" + append FLAGS " -ex \"set follow-exec-mode new\"" + append FLAGS " -ex \"run\"" + append FLAGS " -ex \"info prog\"" + + catch {exec /bin/bash -c "$GDB $FLAGS"} catchlog + send_log "$catchlog\n" + + if { [regexp {No selected thread} $catchlog] } { + pass $test + } else { + fail $test + } +} + +catch_follow_exec |