From 1cc6257895e15caeddd74d18425e2ef37971e3f8ed180a2a065d5aef3bc439b1 Mon Sep 17 00:00:00 2001 From: OBS User unknown Date: Thu, 12 Apr 2007 15:24:26 +0000 Subject: [PATCH] OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/gdb?expand=0&rev=14 --- gdb.changes | 5 +++ gdb.spec | 4 +- gstack.patch | 107 +++++++++++++++++++++++++++++---------------------- 3 files changed, 70 insertions(+), 46 deletions(-) diff --git a/gdb.changes b/gdb.changes index 96d58b9..55704ad 100644 --- a/gdb.changes +++ b/gdb.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Wed Apr 11 17:16:45 CEST 2007 - schwab@suse.de + +- Handle non-threaded processes in gstack [#262694]. + ------------------------------------------------------------------- Sun Apr 1 21:32:33 CEST 2007 - schwab@suse.de diff --git a/gdb.spec b/gdb.spec index e7ed920..e0f8143 100644 --- a/gdb.spec +++ b/gdb.spec @@ -21,7 +21,7 @@ Group: Development/Tools/Debuggers Autoreqprov: on PreReq: %{install_info_prereq} Version: 6.6 -Release: 26 +Release: 29 Summary: The GNU Debugger Source: gdb-%{version}.tar.bz2 Patch1: gdb-misc.patch @@ -151,6 +151,8 @@ rm -rf $RPM_BUILD_ROOT %endif %changelog +* Wed Apr 11 2007 - schwab@suse.de +- Handle non-threaded processes in gstack [#262694]. * Sun Apr 01 2007 - schwab@suse.de - Properly decode CR register number. * Thu Mar 29 2007 - schwab@suse.de diff --git a/gstack.patch b/gstack.patch index c2ce547..2422459 100644 --- a/gstack.patch +++ b/gstack.patch @@ -4,37 +4,6 @@ to install and uninstall. * gstack.sh: New file. ---- gdb/gstack.sh 1969-12-31 19:00:00.000000000 -0500 -+++ gdb/gstack.sh 2004-11-23 13:34:48.000000000 -0500 -@@ -0,0 +1,28 @@ -+#!/bin/sh -+ -+if test $# -ne 1; then -+ echo "Usage: $0 " 1>&2 -+ exit 1 -+fi -+ -+if test ! -r /proc/$1; then -+ echo "Process $1 not found." 1>&2 -+ exit 1 -+fi -+ -+GDB=${GDB:-gdb} -+ -+if $GDB -nx --quiet --batch --readnever > /dev/null 2>&1; then -+ readnever=--readnever -+else -+ readnever= -+fi -+ -+# Run GDB, strip out unwanted noise. -+$GDB --quiet $readnever -nx /proc/$1/exe $1 <&1 | -+thread apply all bt -+EOF -+sed -n \ -+ -e 's/^(gdb) //' \ -+ -e '/^#/p' \ -+ -e '/^Thread/p' --- gdb/Makefile.in 2004-11-23 13:31:03.000000000 -0500 +++ gdb/Makefile.in 2004-11-23 15:06:34.623389592 -0500 @@ -970,7 +970,7 @@ @@ -55,14 +24,14 @@ +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) ; \ ++ 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) ; \ -uninstall: force $(CONFIG_UNINSTALL) @@ -78,12 +47,60 @@ +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) ++ if test "x$$transformed_name" = x; then \ ++ transformed_name=$(GSTACK) ; \ ++ else \ ++ true ; \ ++ fi ; \ ++ rm -f $(DESTDIR)$(bindir)/$$transformed_name$(EXEEXT) # We do this by grepping through sources. If that turns out to be too slow, # maybe we could just require every .o file to have an initialization routine +--- /dev/null 2005-04-09 23:51:05.027867440 -0400 ++++ gdb/gstack.sh 2005-04-08 18:00:49.000000000 -0400 +@@ -0,0 +1,45 @@ ++#!/bin/sh ++ ++if test $# -ne 1; then ++ echo "Usage: `basename $0 .sh` " 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 `ls /proc/$1/task | 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 grep -e libpthread /proc/$1/maps > /dev/null 2>&1 ; then ++ backtrace="thread apply all bt" ++ fi ++fi ++ ++GDB=${GDB:-gdb} ++ ++if $GDB -nx --quiet --batch --readnever > /dev/null 2>&1; then ++ readnever=--readnever ++else ++ readnever= ++fi ++ ++# Run GDB, strip out unwanted noise. ++$GDB --quiet $readnever -nx /proc/$1/exe $1 <&1 | ++$backtrace ++EOF ++sed -n \ ++ -e 's/^(gdb) //' \ ++ -e '/^#/p' \ ++ -e '/^Thread/p'