- Fix a race during attaching to dying threads; backport (BZ 209445).

- Testcase of unwinding has now marked its unsolvable cases (for BZ
    140532).
- Resolves: rhbz#209445
- Related: rhbz#140532
This commit is contained in:
Jan Kratochvil 2007-02-05 08:28:49 +00:00
parent dfe7fd4669
commit 2a21fb50ae
3 changed files with 183 additions and 2 deletions

View File

@ -51,7 +51,7 @@ diff -u -rupN gdb-6.5-ppc/gdb/testsuite/gdb.base/bt-ppc.c gdb-6.5/gdb/testsuite/
diff -u -rupN gdb-6.5-ppc/gdb/testsuite/gdb.base/bt-ppc.exp gdb-6.5/gdb/testsuite/gdb.base/bt-ppc.exp
--- gdb-6.5-ppc/gdb/testsuite/gdb.base/bt-ppc.exp 1969-12-31 19:00:00.000000000 -0500
+++ gdb-6.5/gdb/testsuite/gdb.base/bt-ppc.exp 2007-01-12 21:27:25.000000000 -0500
@@ -0,0 +1,87 @@
@@ -0,0 +1,99 @@
+# Copyright 2006, 2007 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
@ -122,6 +122,18 @@ diff -u -rupN gdb-6.5-ppc/gdb/testsuite/gdb.base/bt-ppc.exp gdb-6.5/gdb/testsuit
+ # `\\.?' prefixes are needed for ppc64 without `debug' (another bug).
+
+ set show [concat $opts $addons]
+ if [regexp {^-fno-asynchronous-unwind-tables (-fpie -pie )?-O2$} $show] {
+ # We get correct unwind but with two excessive "??" entries
+ # due to undetectable inserted alignment entry.
+ # With -fa-u-t we have correct FDE, without -O2 we have frame pointer.
+ # 1 0x0000003acb631980 in abort () from /lib64/libc.so.6
+ # 2 0x0000000000400489 in func0 ()
+ # 3 0x00000000004004d0 in ?? ()
+ # 4 0x0000000000400499 in func1 ()
+ # 5 0x00007fffc5442410 in ?? ()
+ # 6 0x00000000004004b9 in main ()
+ setup_xfail "x86_64-*-*"
+ }
+ gdb_test_multiple "bt" "Correct unwind for: $show" {
+ -re "\r\n#\[0-9\]\[^\r\n\]* in \\.?func0 \\(\[^\r\n\]*\r\n#\[0-9\]\[^\r\n\]* in \\.?func1 \\(\[^\r\n\]*\r\n#\[0-9\]\[^\r\n\]* in \\.?main \\(\[^\r\n\]*\r\n$gdb_prompt $" {
+ pass "Correct unwind for: $show"

View File

@ -333,3 +333,168 @@ https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=224128
#
# test "set variable" for type "short *"
#
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=209445
[ backported ]
2006-12-31 Daniel Jacobowitz <dan@codesourcery.com>
* linux-nat.c (lin_lwp_attach_lwp): Return a status. Do not
add the LWP to our list until we are attached. Warn instead
of erroring if the attach fails.
* linux-nat.h (lin_lwp_attach_lwp): New prototype.
* linux-thread-db.c (attach_thread): Call lin_lwp_attach_lwp
directly. Do not add the thread to our list until we are
successfully attached.
* config/nm-linux.h (lin_lwp_attach_lwp, ATTACH_LWP): Delete.
--- ./gdb/linux-nat.c 20 Nov 2006 21:47:06 -0000 1.51
+++ ./gdb/linux-nat.c 31 Dec 2006 21:04:51 -0000 1.52
@@ -915,12 +915,13 @@ exit_lwp (struct lwp_info *lp)
/* Attach to the LWP specified by PID. If VERBOSE is non-zero, print
a message telling the user that a new LWP has been added to the
- process. */
+ process. Return 0 if successful or -1 if the new LWP could not
+ be attached. */
-void
+int
lin_lwp_attach_lwp (ptid_t ptid, int verbose)
{
- struct lwp_info *lp, *found_lp;
+ struct lwp_info *lp;
gdb_assert (is_lwp (ptid));
@@ -932,12 +933,7 @@ lin_lwp_attach_lwp (ptid_t ptid, int ver
sigprocmask (SIG_BLOCK, &blocked_mask, NULL);
}
- if (verbose)
- printf_filtered (_("[New %s]\n"), target_pid_to_str (ptid));
-
- found_lp = lp = find_lwp_pid (ptid);
- if (lp == NULL)
- lp = add_lwp (ptid);
+ lp = find_lwp_pid (ptid);
/* We assume that we're already attached to any LWP that has an id
equal to the overall process id, and to any LWP that is already
@@ -945,14 +941,25 @@ lin_lwp_attach_lwp (ptid_t ptid, int ver
and we've had PID wraparound since we last tried to stop all threads,
this assumption might be wrong; fortunately, this is very unlikely
to happen. */
- if (GET_LWP (ptid) != GET_PID (ptid) && found_lp == NULL)
+ if (GET_LWP (ptid) != GET_PID (ptid) && lp == NULL)
{
pid_t pid;
int status;
if (ptrace (PTRACE_ATTACH, GET_LWP (ptid), 0, 0) < 0)
- error (_("Can't attach %s: %s"), target_pid_to_str (ptid),
- safe_strerror (errno));
+ {
+ /* If we fail to attach to the thread, issue a warning,
+ but continue. One way this can happen is if thread
+ creation is interrupted; as of Linux 2.6.19, a kernel
+ bug may place threads in the thread list and then fail
+ to create them. */
+ warning (_("Can't attach %s: %s"), target_pid_to_str (ptid),
+ safe_strerror (errno));
+ return -1;
+ }
+
+ if (lp == NULL)
+ lp = add_lwp (ptid);
if (debug_linux_nat)
fprintf_unfiltered (gdb_stdlog,
@@ -990,8 +997,15 @@ lin_lwp_attach_lwp (ptid_t ptid, int ver
threads. Note that this won't have already been done since
the main thread will have, we assume, been stopped by an
attach from a different layer. */
+ if (lp == NULL)
+ lp = add_lwp (ptid);
lp->stopped = 1;
}
+
+ if (verbose)
+ printf_filtered (_("[New %s]\n"), target_pid_to_str (ptid));
+
+ return 0;
}
static void
--- ./gdb/linux-nat.h 20 Nov 2006 21:47:06 -0000 1.13
+++ ./gdb/linux-nat.h 31 Dec 2006 21:04:51 -0000 1.14
@@ -80,6 +80,8 @@ extern void linux_enable_event_reporting
extern ptid_t linux_handle_extended_wait (int pid, int status,
struct target_waitstatus *ourstatus);
+extern int lin_lwp_attach_lwp (ptid_t ptid, int verbose);
+
/* Iterator function for lin-lwp's lwp list. */
struct lwp_info *iterate_over_lwps (int (*callback) (struct lwp_info *,
void *),
--- ./gdb/config/nm-linux.h 28 Nov 2006 19:45:07 -0000 1.27
+++ ./gdb/config/nm-linux.h 31 Dec 2006 21:04:51 -0000 1.28
@@ -1,6 +1,6 @@
/* Native support for GNU/Linux.
- Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
+ Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GDB.
@@ -25,9 +25,6 @@ struct target_ops;
/* GNU/Linux is SVR4-ish but its /proc file system isn't. */
#undef USE_PROC_FS
-extern void lin_lwp_attach_lwp (ptid_t ptid, int verbose);
-#define ATTACH_LWP(ptid, verbose) lin_lwp_attach_lwp ((ptid), (verbose))
-
extern void lin_thread_get_thread_signals (sigset_t *mask);
#define GET_THREAD_SIGNALS(mask) lin_thread_get_thread_signals (mask)
--- gdb-6.6/gdb-orig/linux-thread-db.c 2007-01-30 14:10:38.000000000 -0500
+++ gdb-6.6/gdb/linux-thread-db.c 2007-01-30 14:16:22.000000000 -0500
@@ -678,6 +678,13 @@
check_thread_signals ();
+ if (ti_p->ti_state == TD_THR_UNKNOWN || ti_p->ti_state == TD_THR_ZOMBIE)
+ return; /* A zombie thread -- do not attach. */
+
+ /* Under GNU/Linux, we have to attach to each and every thread. */
+ if (lin_lwp_attach_lwp (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid)), 0) < 0)
+ return;
+
/* Add the thread to GDB's thread list. */
tp = add_thread (ptid);
tp->private = xmalloc (sizeof (struct private_thread_info));
@@ -686,20 +693,10 @@
if (verbose)
printf_unfiltered (_("[New %s]\n"), target_pid_to_str (ptid));
- if (ti_p->ti_state == TD_THR_UNKNOWN || ti_p->ti_state == TD_THR_ZOMBIE)
- return; /* A zombie thread -- do not attach. */
-
- new_ptid = BUILD_LWP (ti_p->ti_lid, GET_PID (ptid));
-
- /* Under GNU/Linux, we have to attach to each and every thread. */
-#ifdef ATTACH_LWP
- ATTACH_LWP (new_ptid, 0);
-#endif
-
/* Notify any observers of a new linux thread. This
would include any linux platforms that have to insert hardware
watchpoints on every thread. */
- observer_notify_linux_new_thread (new_ptid);
+ observer_notify_linux_new_thread (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid)));
/* Enable thread event reporting for this thread. */
err = td_thr_event_enable_p (th_p, 1);

View File

@ -11,7 +11,7 @@ Name: gdb
Version: 6.6
# The release always contains a leading reserved number, start it at 1.
Release: 2%{?dist}
Release: 3%{?dist}
License: GPL
Group: Development/Debuggers
@ -591,6 +591,10 @@ fi
# don't include the files in include, they are part of binutils
%changelog
* Mon Feb 5 2007 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.6-3
- Fix a race during attaching to dying threads; backport (BZ 209445).
- Testcase of unwinding has now marked its unsolvable cases (for BZ 140532).
* Fri Jan 26 2007 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.6-2
- Backported post gdb-6.6 release PPC `show endian' fixup.
- Fix displaying of numeric char arrays as strings (BZ 224128).