9cd9368e86
Adjust build-id related patches. Drop backported patches which are no longer relevant. Bump 'snapgnulib' date. Backport upstream patch which papers over Fortran lexical analyzer bug (RHBZ 2012976, Tom de Vries).
259 lines
7.4 KiB
Diff
259 lines
7.4 KiB
Diff
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
|
From: Andrew Cagney <cagney@gnu.org>
|
|
Date: Fri, 27 Oct 2017 21:07:50 +0200
|
|
Subject: gdb-6.3-gstack-20050411.patch
|
|
|
|
;; Add a wrapper script to GDB that implements pstack using the
|
|
;; --readnever option.
|
|
;;=push
|
|
|
|
2004-11-23 Andrew Cagney <cagney@redhat.com>
|
|
|
|
* Makefile.in (uninstall-gstack, install-gstack): New rules, add
|
|
to install and uninstall.
|
|
* gstack.sh, gstack.1: New files.
|
|
|
|
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
|
|
--- a/gdb/Makefile.in
|
|
+++ b/gdb/Makefile.in
|
|
@@ -1753,7 +1753,7 @@ info install-info clean-info dvi pdf install-pdf html install-html: force
|
|
install: all
|
|
@$(MAKE) $(FLAGS_TO_PASS) install-only
|
|
|
|
-install-only: $(CONFIG_INSTALL)
|
|
+install-only: install-gstack $(CONFIG_INSTALL)
|
|
transformed_name=`t='$(program_transform_name)'; \
|
|
echo gdb | sed -e "$$t"` ; \
|
|
if test "x$$transformed_name" = x; then \
|
|
@@ -1802,7 +1802,25 @@ install-guile:
|
|
install-python:
|
|
$(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(GDB_DATADIR)/python/gdb
|
|
|
|
-uninstall: force $(CONFIG_UNINSTALL)
|
|
+GSTACK=gstack
|
|
+.PHONY: install-gstack
|
|
+install-gstack:
|
|
+ transformed_name=`t='$(program_transform_name)'; \
|
|
+ echo $(GSTACK) | sed -e "$$t"` ; \
|
|
+ if test "x$$transformed_name" = x; then \
|
|
+ transformed_name=$(GSTACK) ; \
|
|
+ else \
|
|
+ true ; \
|
|
+ fi ; \
|
|
+ $(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(bindir) ; \
|
|
+ $(INSTALL_PROGRAM) $(srcdir)/$(GSTACK).sh \
|
|
+ $(DESTDIR)$(bindir)/$$transformed_name$(EXEEXT) ; \
|
|
+ : $(SHELL) $(srcdir)/../mkinstalldirs \
|
|
+ $(DESTDIR)$(man1dir) ; \
|
|
+ : $(INSTALL_DATA) $(srcdir)/gstack.1 \
|
|
+ $(DESTDIR)$(man1dir)/$$transformed_name.1
|
|
+
|
|
+uninstall: force uninstall-gstack $(CONFIG_UNINSTALL)
|
|
transformed_name=`t='$(program_transform_name)'; \
|
|
echo gdb | sed -e $$t` ; \
|
|
if test "x$$transformed_name" = x; then \
|
|
@@ -1825,6 +1843,18 @@ uninstall: force $(CONFIG_UNINSTALL)
|
|
fi
|
|
@$(MAKE) DO=uninstall "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do
|
|
|
|
+.PHONY: uninstall-gstack
|
|
+uninstall-gstack:
|
|
+ transformed_name=`t='$(program_transform_name)'; \
|
|
+ echo $(GSTACK) | sed -e $$t` ; \
|
|
+ if test "x$$transformed_name" = x; then \
|
|
+ transformed_name=$(GSTACK) ; \
|
|
+ else \
|
|
+ true ; \
|
|
+ fi ; \
|
|
+ rm -f $(DESTDIR)$(bindir)/$$transformed_name$(EXEEXT) \
|
|
+ $(DESTDIR)$(man1dir)/$$transformed_name.1
|
|
+
|
|
# The C++ name parser can be built standalone for testing.
|
|
test-cp-name-parser.o: cp-name-parser.c
|
|
$(COMPILE) -DTEST_CPNAMES cp-name-parser.c
|
|
diff --git a/gdb/gstack.sh b/gdb/gstack.sh
|
|
new file mode 100644
|
|
--- /dev/null
|
|
+++ b/gdb/gstack.sh
|
|
@@ -0,0 +1,43 @@
|
|
+#!/bin/sh
|
|
+
|
|
+if test $# -ne 1; then
|
|
+ echo "Usage: `basename $0 .sh` <process-id>" 1>&2
|
|
+ exit 1
|
|
+fi
|
|
+
|
|
+if test ! -r /proc/$1; then
|
|
+ echo "Process $1 not found." 1>&2
|
|
+ exit 1
|
|
+fi
|
|
+
|
|
+# GDB doesn't allow "thread apply all bt" when the process isn't
|
|
+# threaded; need to peek at the process to determine if that or the
|
|
+# simpler "bt" should be used.
|
|
+
|
|
+backtrace="bt"
|
|
+if test -d /proc/$1/task ; then
|
|
+ # Newer kernel; has a task/ directory.
|
|
+ if test `/bin/ls /proc/$1/task | /usr/bin/wc -l` -gt 1 2>/dev/null ; then
|
|
+ backtrace="thread apply all bt"
|
|
+ fi
|
|
+elif test -f /proc/$1/maps ; then
|
|
+ # Older kernel; go by it loading libpthread.
|
|
+ if /bin/grep -e libpthread /proc/$1/maps > /dev/null 2>&1 ; then
|
|
+ backtrace="thread apply all bt"
|
|
+ fi
|
|
+fi
|
|
+
|
|
+GDB=${GDB:-gdb}
|
|
+
|
|
+# Run GDB, strip out unwanted noise.
|
|
+# --readnever is no longer used since .gdb_index is now in use.
|
|
+$GDB --quiet -nx $GDBARGS /proc/$1/exe $1 <<EOF 2>&1 |
|
|
+set width 0
|
|
+set height 0
|
|
+set pagination no
|
|
+$backtrace
|
|
+EOF
|
|
+/bin/sed -n \
|
|
+ -e 's/^\((gdb) \)*//' \
|
|
+ -e '/^#/p' \
|
|
+ -e '/^Thread/p'
|
|
diff --git a/gdb/testsuite/gdb.base/gstack.c b/gdb/testsuite/gdb.base/gstack.c
|
|
new file mode 100644
|
|
--- /dev/null
|
|
+++ b/gdb/testsuite/gdb.base/gstack.c
|
|
@@ -0,0 +1,43 @@
|
|
+/* This testcase is part of GDB, the GNU debugger.
|
|
+
|
|
+ Copyright 2005, 2007, 2008, 2009 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 <stdio.h>
|
|
+#include <unistd.h>
|
|
+#include <string.h>
|
|
+
|
|
+void
|
|
+func (void)
|
|
+{
|
|
+ const char msg[] = "looping\n";
|
|
+
|
|
+ /* Use the most simple notification not to get caught by attach on exiting
|
|
+ the function. */
|
|
+ write (1, msg, strlen (msg));
|
|
+
|
|
+ for (;;);
|
|
+}
|
|
+
|
|
+int
|
|
+main (void)
|
|
+{
|
|
+ alarm (60);
|
|
+ nice (100);
|
|
+
|
|
+ func ();
|
|
+
|
|
+ return 0;
|
|
+}
|
|
diff --git a/gdb/testsuite/gdb.base/gstack.exp b/gdb/testsuite/gdb.base/gstack.exp
|
|
new file mode 100644
|
|
--- /dev/null
|
|
+++ b/gdb/testsuite/gdb.base/gstack.exp
|
|
@@ -0,0 +1,84 @@
|
|
+# Copyright (C) 2012 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 gstack
|
|
+set executable ${testfile}
|
|
+set binfile [standard_output_file $executable]
|
|
+if {[build_executable ${testfile} ${executable} "" {debug}] == -1} {
|
|
+ return -1
|
|
+}
|
|
+
|
|
+set test "spawn inferior"
|
|
+set command "${binfile}"
|
|
+set res [remote_spawn host $command];
|
|
+if { $res < 0 || $res == "" } {
|
|
+ perror "Spawning $command failed."
|
|
+ fail $test
|
|
+ return
|
|
+}
|
|
+
|
|
+# The spawn id of the test inferior.
|
|
+set test_spawn_id $res
|
|
+
|
|
+set use_gdb_stub 1
|
|
+set pid [exp_pid -i $res]
|
|
+gdb_expect {
|
|
+ -re "looping\r\n" {
|
|
+ pass $test
|
|
+ }
|
|
+ eof {
|
|
+ fail "$test (eof)"
|
|
+ return
|
|
+ }
|
|
+ timeout {
|
|
+ fail "$test (timeout)"
|
|
+ return
|
|
+ }
|
|
+}
|
|
+
|
|
+# Testcase uses the most simple notification not to get caught by attach on
|
|
+# exiting the function. Still we could retry the gstack command if we fail.
|
|
+
|
|
+set test "spawn gstack"
|
|
+set command "sh -c GDB=$GDB\\ GDBARGS=-data-directory\\\\\\ $BUILD_DATA_DIRECTORY\\ sh\\ ${srcdir}/../gstack.sh\\ $pid\\;echo\\ GSTACK-END"
|
|
+set res [remote_spawn host $command];
|
|
+if { $res < 0 || $res == "" } {
|
|
+ perror "Spawning $command failed."
|
|
+ fail $test
|
|
+}
|
|
+
|
|
+set gdb_spawn_id $res
|
|
+
|
|
+gdb_test_multiple "" $test {
|
|
+ -re "^#0 +(0x\[0-9a-f\]+ in )?\\.?func \\(\\) at \[^\r\n\]*\r\n#1 +0x\[0-9a-f\]+ in \\.?main \\(\\) at \[^\r\n\]*\r\nGSTACK-END\r\n\$" {
|
|
+ pass $test
|
|
+ }
|
|
+}
|
|
+
|
|
+gdb_test_multiple "" "gstack exits" {
|
|
+ eof {
|
|
+ set result [wait -i $gdb_spawn_id]
|
|
+ verbose $result
|
|
+
|
|
+ gdb_assert { [lindex $result 2] == 0 } "gstack exits with no error"
|
|
+ gdb_assert { [lindex $result 3] == 0 } "gstack's exit status is 0"
|
|
+
|
|
+ remote_close host
|
|
+ clear_gdb_spawn_id
|
|
+ }
|
|
+}
|
|
+
|
|
+# Kill the test inferior.
|
|
+kill_wait_spawned_process $test_spawn_id
|