This is the mail archive of the gdb-patches@sourceware.org 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]

[patch] testsuite: Remove post-PTRACE_DETACH SIGSTOP checking testcases


Hi,

with Linux kernel-3.1.x+ the kernel behavior has changed and formerly racy
testcases have started to always FAIL:

-PASS: gdb.threads/attach-stopped.exp: nonthreaded: attach2 stop interrupt
-PASS: gdb.threads/attach-stopped.exp: nonthreaded: attach2, exit leaves process sleeping
+FAIL: gdb.threads/attach-stopped.exp: nonthreaded: attach2 stop interrupt
+FAIL: gdb.threads/attach-stopped.exp: nonthreaded: attach2, exit leaves process sleeping
-PASS: gdb.threads/attach-stopped.exp: threaded: attach2 stop interrupt
-PASS: gdb.threads/attach-stopped.exp: threaded: attach2, exit leaves process sleeping
+FAIL: gdb.threads/attach-stopped.exp: threaded: attach2 stop interrupt
+FAIL: gdb.threads/attach-stopped.exp: threaded: attach2, exit leaves process sleeping
-PASS: gdb.threads/attachstop-mt.exp: attach4 stop by interrupt
-PASS: gdb.threads/attachstop-mt.exp: attach4, exit leaves process sleeping
+FAIL: gdb.threads/attachstop-mt.exp: attach4 stop by interrupt (timeout)
+FAIL: gdb.threads/attachstop-mt.exp: attach4, exit leaves process sleeping

The ptrace testsuite
	http://sourceware.org/systemtap/wiki/utrace/tests
is more intended for the Linux kernel behavior testing.  There are also now
two testcases (see *-3x.c) selective for pre vs. post Linux kernels 3.x.

Therefore I have just removed those testcases.  I was preparing to port the
GDB patches from Fedora/RHEL into FSF GDB after the Fedora/RHEL kernel SIGSTOP
changes get upstreamed.  Formerly GDB was doing PTRACE_DETACH with SIGSTOP but
that is now ignored and Linux kernel just remembers if the inferior was
T (Stopped) before PTRACE_ATTACH and restores that state after PTRACE_DETACH.

Fedora/RHEL GDB was also selectively keeping process stopped/resumed depending
on whether one did a `continue' in between.  This behavior is abandoned, whole
gdb.threads/attachstop-mt.exp no longer makes sense for FSF GDB and upstream
Linux kernels, if it ever made.


I will remove these tests in some time.  I have also pending cleanup patch for
gdb.threads/attach-stopped.{exp,c} afterwards.

Tested on x86_64,x86_64-m32,i686-fedora16-linux-gnu,
kernel-3.1.2-1.fc16.x86_64.


Thanks,
Jan


2011-12-05  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.threads/attach-stopped.exp (continue (*: attach2 continue))
	(*: attach2 stop interrupt, *: attach2, exit leaves process sleeping):
	Remove.
	* gdb.threads/attachstop-mt.c: Remove.
	* gdb.threads/attachstop-mt.exp: Remove.

--- a/gdb/testsuite/gdb.threads/attach-stopped.exp
+++ b/gdb/testsuite/gdb.threads/attach-stopped.exp
@@ -78,61 +68,16 @@ proc corefunc { threadtype } {
     } else {
 	gdb_test "bt" ".*sleep.*main.*" "$threadtype: attach2 to stopped bt"
     }
-    # This breakpoint is there for old/non-x86 kernels not restarting syscalls.
-    gdb_breakpoint $srcfile:[gdb_get_line_number "Second sleep"]
-    set test "$threadtype: attach2 continue"
-    gdb_test_multiple "continue" "continue ($test)" {
-	-re "Continuing" {
-	    pass "continue ($test)"
-	}
-    }
-
-    # For this to work we must be sure to consume the "Continuing."
-    # message first, or GDB's signal handler may not be in place.
-    after 1000 {send_gdb "\003"}
-    set test "$threadtype: attach2 stop interrupt"
-    gdb_expect 10 {
-      -re "Program received signal SIGINT.*$gdb_prompt $"
-	{
-	  pass $test
-	}
-      -re "Breakpoint \[0-9\].*$srcfile.*$gdb_prompt $"
-	{
-	  pass $test
-	}
-      timeout
-	{
-	  fail $test
-	}
-    }
 
     gdb_exit
 
     # Avoid some race:
     sleep 2
 
-    # At this point, the process should be sleeping
+    # At this point, the process may be sleeping or T (Stopped) depending on
+    # the Linux kernel version.  The behavior is not tested as it is not
+    # dependent on GDB.
 
-    if [catch {open /proc/${testpid}/status r} fileid2] {
-	set line2 "NOTFOUND"
-    } else {
-	gets $fileid2 line1;
-	gets $fileid2 line2;
-	close $fileid2;
-    }
-
-    set test "$threadtype: attach2, exit leaves process sleeping"
-    if {[string match "*(sleeping)*" $line2]} {
-      pass $test
-    } else {
-      fail $test
-    }
-
-    # Make sure we don't leave a process around to confuse
-    # the next test run (and prevent the compile by keeping
-    # the text file busy), in case the "set should_exit" didn't
-    # work.
-       
     remote_exec build "kill -9 ${testpid}"
 }
 
--- a/gdb/testsuite/gdb.threads/attachstop-mt.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* This testcase is part of GDB, the GNU debugger.
-
-   Copyright 2008, 2009, 2010, 2011 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/>.  */
-
-/* This program is intended to be started outside of gdb, then
-   manually stopped via a signal.  */
-
-#include <unistd.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <string.h>
-
-/* Red Hat BZ PR 197584.c */
-
-void *func (void *arg)
-{
-  sleep (10000);  /* Ridiculous time, but we will eventually kill it.  */
-  sleep (10000);	/* RHEL3U8 kernel-2.4.21-47.EL will cut the sleep time.  */
-
-  return NULL;	/* thread-sleep */
-}
-
-int main ()
-{
-  pthread_t t1,t2;
-  int ret;
-
-  ret = pthread_create (&t1, NULL, func, NULL);
-  if (ret)
-    fprintf(stderr, "pthread_create(): %s", strerror (ret));
-  ret = pthread_create (&t2, NULL, func, NULL);
-  if (ret)
-    fprintf(stderr, "pthread_create(): %s", strerror (ret));
-
-  ret = pthread_join (t1, NULL);
-  if (ret)	/* first-join */
-    fprintf(stderr, "pthread_join(): %s", strerror (ret));
-  ret = pthread_join (t2, NULL);
-  if (ret)
-    fprintf(stderr, "pthread_join(): %s", strerror (ret));
-
-  return 0;
-}
--- a/gdb/testsuite/gdb.threads/attachstop-mt.exp
+++ /dev/null
@@ -1,266 +0,0 @@
-# Copyright 2008, 2009, 2010, 2011 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/>.
-
-# This test is based on gdb.base/attach.exp with modifications by Jeff Johnston
-# <jjohnstn@redhat.com> and Jan Kratochvil <jan.kratochvil@redhat.com>.
-
-# This test only works on Linux
-if { ![isnative] || [is_remote host] || [target_info exists use_gdb_stub]
-     || ![istarget *-linux*] } {
-    continue
-}
-
-set testfile "attachstop-mt"
-set srcfile  ${testfile}.c
-set binfile  ${objdir}/${subdir}/${testfile}
-set escapedbinfile  [string_to_regexp ${objdir}/${subdir}/${testfile}]
-
-#execute_anywhere "rm -f ${binfile}"
-remote_exec build "rm -f ${binfile}"
-# For debugging this test
-#
-#log_user 1
-
-# build the test case
-#
-if  { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
-    untested attachstop-mt.exp
-    return -1
-}
-
-if [get_compiler_info ${binfile}] {
-    return -1
-}
-
-# Start the program running and then wait for a bit, to be sure
-# that it can be attached to.
-
-set testpid [eval exec $binfile &]
-
-# No race
-sleep 2
-
-# The testcase has three threads, find some other thread TID for $testpid2.
-set tids [exec sh -c "echo /proc/$testpid/task/*"]
-regsub -all /proc/$testpid/task/ $tids {} tids
-if {$tids == "*"} {
-    unresolved "/proc/PID/task is not supported (kernel-2.4?)"
-    remote_exec build "kill -9 ${testpid}"
-    return -1
-}
-set tids [lsort -integer [split $tids]]
-if {[llength $tids] != 3 || [lindex $tids 0] != $testpid} {
-    verbose -log "Invalid TIDs <$tids> for PID $testpid"
-    fail "Invalid TIDs found"
-    remote_exec build "kill -9 ${testpid}"
-    return -1
-}
-set testpid2 [lindex $tids 2]
-
-# Initial sanity test it is normally sleeping
-set status2 /proc/${testpid}/task/${testpid2}/status
-set fileid0 [open $status2 r];
-gets $fileid0 line1;
-gets $fileid0 line2;
-close $fileid0;
-
-set test "attach0, initial sanity check of the sleeping state"
-if {[string match "*(sleeping)*" $line2]} {
-  pass $test
-} else {
-  fail $test
-}
-
-# Sttach and detach to test it will not become stopped
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
-set test "attach0 to sleeping"
-gdb_test_multiple "attach $testpid" "$test" {
-    -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
-        pass "$test"
-    }
-}
-
-gdb_test "gcore /dev/null" ".*aved corefile.*" "attach0 to sleeping gcore invocation"
-
-gdb_test "thread 2" ".*witching to thread 2 .*" "attach0 to sleeping switch thread"
-
-gdb_test "bt" ".*sleep.*func.*" "attach0 to sleeping bt"
-
-# Exit and detach the process.
-
-gdb_exit
-
-# No race
-sleep 2
-
-# Check it did not get stopped by our gdb
-set fileid1 [open $status2 r];
-gets $fileid1 line1;
-gets $fileid1 line2;
-close $fileid1;
-
-set test "attach1, post-gdb sanity check of the sleeping state - Red Hat BZ 197584"
-if {[string match "*(sleeping)*" $line2]} {
-  pass $test
-} else {
-  fail $test
-}
-
-# Stop the program 
-remote_exec build "kill -s STOP ${testpid}"
-
-# No race
-sleep 2
-
-# Check it really got stopped by kill(1)
-set fileid2 [open $status2 r];
-gets $fileid2 line1;
-gets $fileid2 line2;
-close $fileid2;
-
-set test "attach2, initial sanity check of the stopped state"
-if {[string match "*(stopped)*" $line2]} {
-  pass $test
-} else {
-  fail $test
-}
-
-# Start with clean gdb
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
-# Verify that we can attach to the process by first giving its
-# executable name via the file command, and using attach with the
-# process ID.
-
-set test "set file, before attach3 to stopped process"
-gdb_test_multiple "file $binfile" "$test" {
-   -re "Load new symbol table from.*y or n. $" {
-        gdb_test "y" "Reading symbols from $escapedbinfile\.\.\.*done." \
-		"$test (re-read)"
-    }
-    -re "Reading symbols from $escapedbinfile\.\.\.*done.*$gdb_prompt $" {
-        pass "$test"
-    }
-}
-
-set test "attach3 to stopped, after setting file"
-gdb_test_multiple "attach $testpid" "$test" {
-    -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
-        pass "$test"
-    }
-}
-
-# We may be already after the threads phase.
-# `thread 2' command is important for the test to switch the current thread to
-# a non-primary one for the detach process.
-
-gdb_test "thread 2" ".*(witching to thread 2 |hread ID 2 not known).*" "attach3 to stopped switch thread"
-gdb_test "bt" ".*sleep.*(func|main).*" "attach3 to stopped bt"
-
-# Exit and detach the process.
-gdb_exit
-
-# Stop the program 
-remote_exec build "kill -s STOP ${testpid}"
-
-# No race
-sleep 2
-
-# Continue the test as we would hit another expected bug regarding
-# 	Program received signal SIGSTOP, Stopped (signal).
-# across NPTL threads.
-
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-
-# Verify that we can attach to the process just by giving the
-# process ID.
-   
-set test "attach4 to stopped, after setting file"
-gdb_test_multiple "attach $testpid" "$test" {
-    -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.*$gdb_prompt $" {
-        pass "$test"
-    }
-}
-
-# We may be already after the threads phase.
-# `thread 2' command is important for the test to switch the current thread to
-# a non-primary one for the detach process.
-
-gdb_test "thread 2" ".*(witching to thread 2 |hread ID 2 not known).*" "attach4 to stopped switch thread"
-gdb_test "bt" ".*sleep.*(func|main).*" "attach4 to stopped bt"
-
-# RHEL3U8 kernel-2.4.21-47.EL will not return SIGINT but only shorten the sleep.
-gdb_breakpoint $srcfile:[gdb_get_line_number "Ridiculous time"]
-gdb_breakpoint $srcfile:[gdb_get_line_number "cut the sleep time"]
-set test "attach4 continue"
-gdb_test_multiple "continue" "continue ($test)" {
-    -re "Continuing" {
-	pass "continue ($test)"
-    }
-}
-
-# For this to work we must be sure to consume the "Continuing."
-# message first, or GDB's signal handler may not be in place.
-after 1000 {send_gdb "\003"}
-set test "attach4 stop by interrupt"
-gdb_expect {
-  -re "Program received signal SIGINT.*$gdb_prompt $"
-    {
-      pass $test
-    }
-  -re "Breakpoint \[0-9\].*$srcfile.*$gdb_prompt $"
-    {
-      pass $test
-    }
-  timeout
-    {
-      fail "$test (timeout)"
-    }
-}
-
-gdb_exit
-
-# No race
-sleep 2
-
-# At this point, the process should be sleeping
-
-set fileid4 [open $status2 r];
-gets $fileid4 line1;
-gets $fileid4 line2;
-close $fileid4;
-
-set test "attach4, exit leaves process sleeping"
-if {[string match "*(sleeping)*" $line2]} {
-  pass $test
-} else {
-  fail $test
-}
-
-# Make sure we don't leave a process around to confuse
-# the next test run (and prevent the compile by keeping
-# the text file busy), in case the "set should_exit" didn't
-# work.
-   
-remote_exec build "kill -9 ${testpid}"
-
-return 0


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