Rebase to released FSF GDB 7.11.1.
This commit is contained in:
parent
6b46b9b395
commit
8e7b06e27c
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +1,2 @@
|
||||
/gdb-libstdc++-v3-python-r225521.tar.xz
|
||||
/gdb-7.11.tar.xz
|
||||
/gdb-7.11.1.tar.xz
|
||||
|
@ -1,230 +0,0 @@
|
||||
http://post-office.corp.redhat.com/archives/debug-list/2016-April/msg00003.html
|
||||
|
||||
>From cb8bfeaa21a2df484d3c4c35cc6ea1c4b32cefc8 Mon Sep 17 00:00:00 2001
|
||||
From: Pedro Alves <palves@redhat.com>
|
||||
Date: Wed, 6 Apr 2016 15:07:49 +0100
|
||||
Subject: [PATCH] Fix PR gdb/19828: gdb -p <process from a container>: internal
|
||||
error
|
||||
|
||||
When GDB attaches to a process, it looks at the /proc/PID/task/ dir
|
||||
for all clone threads of that process, and attaches to each of them.
|
||||
|
||||
Usually, if there is more than one clone thread, it means the program
|
||||
is multi threaded and linked with pthreads. Thus when GDB soon after
|
||||
attaching finds and loads a libthread_db matching the process, it'll
|
||||
add a thread to the thread list for each of the initially found
|
||||
lower-level LWPs.
|
||||
|
||||
If, however, GDB fails to find/load a matching libthread_db, nothing
|
||||
is adding the LWPs to the thread list. And because of that, "detach"
|
||||
hits an internal error:
|
||||
|
||||
(gdb) PASS: gdb.threads/clone-attach-detach.exp: fg attach 1: attach
|
||||
info threads
|
||||
Id Target Id Frame
|
||||
* 1 LWP 6891 "clone-attach-de" 0x00007f87e5fd0790 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:84
|
||||
(gdb) FAIL: gdb.threads/clone-attach-detach.exp: fg attach 1: info threads shows two LWPs
|
||||
detach
|
||||
.../src/gdb/thread.c:1010: internal-error: is_executing: Assertion `tp' failed.
|
||||
A problem internal to GDB has been detected,
|
||||
further debugging may prove unreliable.
|
||||
Quit this debugging session? (y or n)
|
||||
FAIL: gdb.threads/clone-attach-detach.exp: fg attach 1: detach (GDB internal error)
|
||||
|
||||
>From here:
|
||||
|
||||
...
|
||||
#8 0x00000000007ba7cc in internal_error (file=0x98ea68 ".../src/gdb/thread.c", line=1010, fmt=0x98ea30 "%s: Assertion `%s' failed.")
|
||||
at .../src/gdb/common/errors.c:55
|
||||
#9 0x000000000064bb83 in is_executing (ptid=...) at .../src/gdb/thread.c:1010
|
||||
#10 0x00000000004c23bb in get_pending_status (lp=0x12c5cc0, status=0x7fffffffdc0c) at .../src/gdb/linux-nat.c:1235
|
||||
#11 0x00000000004c2738 in detach_callback (lp=0x12c5cc0, data=0x0) at .../src/gdb/linux-nat.c:1317
|
||||
#12 0x00000000004c1a2a in iterate_over_lwps (filter=..., callback=0x4c2599 <detach_callback>, data=0x0) at .../src/gdb/linux-nat.c:899
|
||||
#13 0x00000000004c295c in linux_nat_detach (ops=0xe7bd30, args=0x0, from_tty=1) at .../src/gdb/linux-nat.c:1358
|
||||
#14 0x000000000068284d in delegate_detach (self=0xe7bd30, arg1=0x0, arg2=1) at .../src/gdb/target-delegates.c:34
|
||||
#15 0x0000000000694141 in target_detach (args=0x0, from_tty=1) at .../src/gdb/target.c:2241
|
||||
#16 0x0000000000630582 in detach_command (args=0x0, from_tty=1) at .../src/gdb/infcmd.c:2975
|
||||
...
|
||||
|
||||
Tested on x86-64 Fedora 23. Also confirmed the test passes against
|
||||
gdbserver with with "maint set target-non-stop".
|
||||
|
||||
gdb/ChangeLog:
|
||||
yyyy-mm-dd Pedro Alves <palves@redhat.com>
|
||||
|
||||
* linux-nat.c (attach_proc_task_lwp_callback): Add the thread to
|
||||
GDB's thread list.
|
||||
|
||||
testsuite/ChangeLog:
|
||||
yyyy-mm-dd Pedro Alves <palves@redhat.com>
|
||||
|
||||
* gdb.threads/clone-attach-detach.c: New file.
|
||||
* gdb.threads/clone-attach-detach.exp: New file.
|
||||
---
|
||||
gdb/linux-nat.c | 5 ++
|
||||
gdb/testsuite/gdb.threads/clone-attach-detach.c | 66 +++++++++++++++++++++++
|
||||
gdb/testsuite/gdb.threads/clone-attach-detach.exp | 63 ++++++++++++++++++++++
|
||||
3 files changed, 134 insertions(+)
|
||||
create mode 100644 gdb/testsuite/gdb.threads/clone-attach-detach.c
|
||||
create mode 100644 gdb/testsuite/gdb.threads/clone-attach-detach.exp
|
||||
|
||||
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
|
||||
index 0829bcb..2025c19 100644
|
||||
--- a/gdb/linux-nat.c
|
||||
+++ b/gdb/linux-nat.c
|
||||
@@ -1088,6 +1088,11 @@ attach_proc_task_lwp_callback (ptid_t ptid)
|
||||
/* We need to wait for a stop before being able to make the
|
||||
next ptrace call on this LWP. */
|
||||
lp->must_set_ptrace_flags = 1;
|
||||
+
|
||||
+ /* Also add the LWP to gdb's thread list, in case a
|
||||
+ matching libthread_db is not found (or the process uses
|
||||
+ raw clone). */
|
||||
+ add_thread (lp->ptid);
|
||||
}
|
||||
|
||||
return 1;
|
||||
diff --git a/gdb/testsuite/gdb.threads/clone-attach-detach.c b/gdb/testsuite/gdb.threads/clone-attach-detach.c
|
||||
new file mode 100644
|
||||
index 0000000..daa8f1f
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.threads/clone-attach-detach.c
|
||||
@@ -0,0 +1,66 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2016 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/>.
|
||||
+*/
|
||||
+
|
||||
+#define _GNU_SOURCE
|
||||
+#include <sched.h>
|
||||
+#include <assert.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <sys/types.h>
|
||||
+#include <sys/wait.h>
|
||||
+#include <unistd.h>
|
||||
+
|
||||
+#define STACK_SIZE 0x1000
|
||||
+
|
||||
+int clone_pid;
|
||||
+
|
||||
+static int
|
||||
+clone_fn (void *unused)
|
||||
+{
|
||||
+ /* Wait for alarm. */
|
||||
+ while (1)
|
||||
+ sleep (1);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (int argc, char **argv)
|
||||
+{
|
||||
+ unsigned char *stack;
|
||||
+ int res;
|
||||
+
|
||||
+ alarm (300);
|
||||
+
|
||||
+ stack = malloc (STACK_SIZE);
|
||||
+ assert (stack != NULL);
|
||||
+
|
||||
+#define CLONE_FLAGS (CLONE_THREAD | CLONE_SIGHAND | CLONE_VM)
|
||||
+
|
||||
+#ifdef __ia64__
|
||||
+ clone_pid = __clone2 (clone_fn, stack, STACK_SIZE, CLONE_FLAGS, NULL);
|
||||
+#else
|
||||
+ clone_pid = clone (clone_fn, stack + STACK_SIZE, CLONE_FLAGS, NULL);
|
||||
+#endif
|
||||
+
|
||||
+ assert (clone_pid > 0);
|
||||
+
|
||||
+ /* Wait for alarm. */
|
||||
+ while (1)
|
||||
+ sleep (1);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/gdb/testsuite/gdb.threads/clone-attach-detach.exp b/gdb/testsuite/gdb.threads/clone-attach-detach.exp
|
||||
new file mode 100644
|
||||
index 0000000..0652108
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.threads/clone-attach-detach.exp
|
||||
@@ -0,0 +1,63 @@
|
||||
+# This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+# Copyright 2016 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 attach / detach from a process that uses raw clone. We use raw
|
||||
+# clone as proxy for when libthread_db is not available.
|
||||
+
|
||||
+# This only works on targets with the Linux kernel.
|
||||
+if ![istarget *-*-linux*] {
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+if {![can_spawn_for_attach]} {
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+standard_testfile
|
||||
+
|
||||
+if [prepare_for_testing "failed to prepare" $testfile $srcfile {debug}] {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+clean_restart ${binfile}
|
||||
+
|
||||
+set test_spawn_id [spawn_wait_for_attach $binfile]
|
||||
+set testpid [spawn_id_get_pid $test_spawn_id]
|
||||
+
|
||||
+# Native/gdbserver.
|
||||
+set thread_re "(LWP $decimal|Thread )"
|
||||
+
|
||||
+# Try attach / detach a few times, in case GDB ends up with stale
|
||||
+# state after detaching.
|
||||
+
|
||||
+set attempts 3
|
||||
+for {set attempt 1} {$attempt <= $attempts} {incr attempt} {
|
||||
+ with_test_prefix "fg attach $attempt" {
|
||||
+
|
||||
+ gdb_test "attach $testpid" \
|
||||
+ "Attaching to program.*process $testpid.*" \
|
||||
+ "attach"
|
||||
+
|
||||
+ gdb_test "info threads" \
|
||||
+ "1.*${thread_re}.*\r\n.*2.*${thread_re}.*" \
|
||||
+ "info threads shows two LWPs"
|
||||
+
|
||||
+ gdb_test "detach" "Detaching from .*, process $testpid"
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+kill_wait_spawned_process $test_spawn_id
|
||||
--
|
||||
2.5.5
|
||||
|
2733
gdb-upstream.patch
2733
gdb-upstream.patch
File diff suppressed because it is too large
Load Diff
15
gdb.spec
15
gdb.spec
@ -23,11 +23,11 @@ Name: %{?scl_prefix}gdb
|
||||
# See timestamp of source gnulib installed into gdb/gnulib/ .
|
||||
%global snapgnulib 20150822
|
||||
%global tarname gdb-%{version}
|
||||
Version: 7.11
|
||||
Version: 7.11.1
|
||||
|
||||
# The release always contains a leading reserved number, start it at 1.
|
||||
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||
Release: 74%{?dist}
|
||||
Release: 75%{?dist}
|
||||
|
||||
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain and GFDL
|
||||
Group: Development/Debuggers
|
||||
@ -241,7 +241,7 @@ Patch231: gdb-6.3-bz202689-exec-from-pthread-test.patch
|
||||
|
||||
# Backported fixups post the source tarball.
|
||||
#Xdrop: Just backports.
|
||||
Patch232: gdb-upstream.patch
|
||||
#Patch232: gdb-upstream.patch
|
||||
|
||||
# Testcase for PPC Power6/DFP instructions disassembly (BZ 230000).
|
||||
#=fedoratest+ppc
|
||||
@ -558,9 +558,6 @@ Patch1119: gdb-testsuite-readline63-sigint-revert.patch
|
||||
#=fedoratest
|
||||
Patch1113: gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch
|
||||
|
||||
# Fix non-stop gdb -p <container>: internal error (pedro Alves, RH BZ 1318049).
|
||||
Patch1117: gdb-rhbz1318049-gdb-p-container-internal-error.patch
|
||||
|
||||
# Add messages suggesting more recent RHEL gdbserver (RH BZ 1321114).
|
||||
Patch1118: gdb-container-rh-pkg.patch
|
||||
|
||||
@ -763,7 +760,7 @@ find -name "*.info*"|xargs rm -f
|
||||
# Match the Fedora's version info.
|
||||
%patch2 -p1
|
||||
|
||||
%patch232 -p1
|
||||
#patch232 -p1
|
||||
%patch349 -p1
|
||||
%patch1058 -p1
|
||||
%patch1059 -p1
|
||||
@ -882,7 +879,6 @@ find -name "*.info*"|xargs rm -f
|
||||
%patch337 -p1
|
||||
%patch331 -p1
|
||||
%patch1113 -p1
|
||||
%patch1117 -p1
|
||||
%patch1118 -p1
|
||||
%patch1120 -p1
|
||||
%patch1123 -p1
|
||||
@ -1407,6 +1403,9 @@ then
|
||||
fi
|
||||
|
||||
%changelog
|
||||
* Mon Jun 6 2016 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.11.1-75.fc24
|
||||
- Rebase to released FSF GDB 7.11.1.
|
||||
|
||||
* Mon May 30 2016 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.11-74.fc24
|
||||
- Import bare DW_TAG_lexical_block (RH BZ 1325396).
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user