This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] New thread test to exercise Daniel's Patch


Jeff Johnston wrote:
Daniel Jacobowitz wrote:

On Thu, Mar 25, 2004 at 03:22:13PM -0500, Jeff Johnston wrote:

Daniel Jacobowitz wrote:

On Wed, Mar 24, 2004 at 11:39:50PM -0500, Daniel Jacobowitz wrote:


Do you have any code for PTRACE_EVENT_CLONE yet, or should I put
something together in the morning to verify whether that's the problem?



Here you go. Again, this patch is obviously not ready to go into GDB, but I have not been able to make it misbehave yet. I don't know if all the bits it needs work right in RHEL3, or if my testing was conclusive.

The highlights:
- Includes most of the previous patch
- Uses PTRACE_EVENT_CLONE to attach to new threads
- Moves handling of events closer to the waitpid call

There are some potential races but I haven't hit any of them in
practice.  I suspect that with a heavy fork or vfork load (not clone)
you could produce interesting failure modes.

Give it a try, please. If it works I'll clean it up.


Works great. I was unable to get it to misbehave on RHEL3. Please go ahead cleaning it up.



Here's the final patch. The description of the patch is unchanged from the above. The background, for those who did not read the whole discussion: in NPTL, a signal delivered to the process when any thread is not attached is likely to terminate the process. So we need to be careful to: - know when threads have exited, so that we can attach to new threads which reuse the same thread ID - attach to threads as early as possible

Both of these could cause problems in LinuxThreads, but they were less
drastic.

Tested with both LinuxThreads and NPTL.  I'll commit this to HEAD on
Monday, barring objections.  We've missed the boat for GDB 6.1 at this
point.

The testcase you posted has credits in it, so we can't just grab it for
the testsuite.  But all we should need to test this is a loop that
creates short-lived threads, and then verifying that we can send C-c,
get a prompt, issue info threads, and continue a couple of times
without seeing anyting matching "error:".  Interested in writing that
test? :)


Sure. Just tried debugging eclipse today with this patch applied and it works as well.


-- Jeff J.



See the attached test. There was some stuff in pthreads.exp about Crtl-C and alpha-*-osf*. Do I need to account for this platform?


2004-03-26 Jeff Johnston <jjohnstn@redhat.com>

        * gdb.threads/manythreads.c: New testcase.
        * gdb.threads/manythreads.exp: Ditto.


-- Jeff J.
Index: manythreads.exp
===================================================================
RCS file: manythreads.exp
diff -N manythreads.exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ manythreads.exp	26 Mar 2004 21:03:17 -0000
@@ -0,0 +1,116 @@
+# manythreads.exp -- Expect script to test stopping many threads
+# Copyright (C) 2004 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 2 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@prep.ai.mit.edu
+
+# This file was written by Jeff Johnston. (jjohnstn@redhat.com)
+
+if $tracelevel then {
+	strace $tracelevel
+}
+
+set prms_id 0
+set bug_id 0
+
+# This only works with native configurations
+if ![isnative] then {
+    return
+}
+
+set testfile "manythreads"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug libs=-lpthread}] != ""} {
+    return -1
+}
+
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $"
+runto_main
+
+# We'll need this when we send_gdb a ^C to GDB.  Need to do it before we
+# run the program and gdb starts saving and restoring tty states.
+# On Ultrix, we don't need it and it is really slow (because shell_escape
+# doesn't use vfork).
+if ![istarget "*-*-ultrix*"] then {
+    gdb_test "shell stty intr '^C'" ""
+}
+
+send_gdb "continue\n"
+gdb_expect {
+  -re "Continuing"
+    { pass "first continue" }
+  timeout
+    { fail "first continue (timeout)" }
+}
+
+# Send a Ctrl-C and verify that we can do info threads and continue
+after 100 {send_gdb "\003"}
+gdb_expect {
+  -re "Program received signal SIGINT.*$gdb_prompt $"
+    {
+      pass "stop threads"
+    }
+  timeout
+    {
+      fail "stop threads (timeout)"
+    }
+} 
+
+gdb_test "info threads" ".*1 Thread.*.LWP.*"
+
+send_gdb "continue\n"
+gdb_expect {
+  -re "Continuing"
+    { pass "second continue" }
+  timeout
+    { fail "second continue (timeout)" }
+}
+
+# Send another Ctrl-C and verify that we can do info threads and quit
+after 100 {send_gdb "\003"}
+gdb_expect {
+  -re "Program received signal SIGINT.*$gdb_prompt $"
+    {
+      pass "stop threads"
+    }
+  timeout
+    {
+      fail "stop threads (timeout)"
+    }
+} 
+
+send_gdb "quit\n"
+gdb_expect {
+    -re "The program is running.  Exit anyway\\? \\(y or n\\) $" {
+        send_gdb "y\n"
+        exp_continue
+    }
+    eof {
+        pass "GDB exits after stopping multithreaded program"
+    }
+    default {
+        fail "GDB exits after stopping multithreaded program"
+    }
+    timeout {
+        fail "GDB exits after stopping multithreaded program (timeout)"
+    }
+}
+
Index: manythreads.c
===================================================================
RCS file: manythreads.c
diff -N manythreads.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ manythreads.c	26 Mar 2004 21:03:17 -0000
@@ -0,0 +1,42 @@
+#include <pthread.h>
+#include <stdio.h>
+
+void *
+thread_function (void *arg)
+{
+  int x = (int)arg;
+
+  printf ("Thread <%d> executing\n", x);
+
+  return NULL;
+}
+
+int 
+main (int argc, char **argv)
+{
+  pthread_attr_t attr;
+  pthread_t threads[256];
+  int i, j;
+
+  pthread_attr_init (&attr);
+
+  /* Create a ton of quick-executing threads, then wait for them to
+     complete.  */
+  for (i = 0; i < 1000; ++i) 
+    {
+      for (j = 0; j < 256; ++j)
+	{
+	  pthread_create (&threads[j], &attr, thread_function, 
+			  (void *)(i * 1000 + j));
+	}
+
+      for (j = 0; j < 256; ++j)
+	{
+	  pthread_join (threads[j], NULL);
+	}
+    }
+
+  pthread_attr_destroy (&attr);
+
+  return 0;
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]