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

[RFA] Testsuite addition for x86 linux GDB and SIGALRM fix


Here's the test I promised Andrew a while ago for the fix for the
problem reported by Jonathan Larmour:

   http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00803.html

The fix has already been checked in, the problem is still mentioned in
the TODO file (let's keep it there until this test has been added).

I verified that some of these tests (the "stepi" and "nexti" tests)
do fail without my fix to infrun.c.

I'm not sure to what extent the use of setitimer() is portable.
However, it is hard to come up with a test that doesn't use it.


2000-05-20  Mark Kettenis  <kettenis@gnu.org>

	Add tests for stepping with pending signals.
	* gdb.base/step-alarm.exp: New file.
	* gdb.base/step-alarm.c: New file.


--- /dev/null	Thu Feb 19 16:30:24 1998
+++ testsuite/gdb.base/step-alarm.exp	Sat May 20 01:09:56 2000
@@ -0,0 +1,226 @@
+# Copyright (C) 1997, 1998, 1999, 2000 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@gnu.org
+
+# use this to debug:
+#
+#log_user 1
+
+# step-alarm.exp -- Expect script to test stepping in gdb
+#                   with a pending signals
+
+# Most of this script is copied over from step-test.exp.  We run (almost)
+# the same tests, except that we set a timer and install a SIGALRM signal
+# handler.  The addition of these tests was prompted by the following fix:
+#
+# 2000-05-01  Mark Kettenis  <kettenis@gnu.org>
+#
+#	* infrun.c (handle_inferior_event): Add missing call to keep_going
+#	and missing return when handling an ordinary signal from the
+#	inferior.
+#
+# for a problem where "stepi" didn't make any progress if a signal
+# was pending. 
+
+if $tracelevel then {
+    strace $tracelevel
+}
+
+set testfile step-alarm
+set srcfile ${srcdir}/${subdir}/${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+remote_exec build "rm -f ${binfile}"
+if { [gdb_compile "${srcfile}" "${binfile}" executable {debug}] != "" } {
+     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+if ![runto_main] then {
+   fail "Can't run to main"
+   return 0
+}
+
+# Make sure that the signal handler is installed, and the timer is set.
+#
+gdb_test "break [gdb_get_line_number "w = 0"]" \
+         ".*Breakpoint.* at .*" \
+         "set breakpoint after timer activation"
+gdb_test "continue" \
+	 ".*Breakpoint ${decimal},.*w = 0.*" \
+	 "run until timer is activated"
+
+
+# Set a breakpoint at line 57, if stepi then finish fails, we would
+# run to the end of the program, which would mess up the rest of the tests.
+  
+# Vanilla step/next
+#
+gdb_test "next" ".*${decimal}.*x = 1;.*" "next 1"
+gdb_test "step" ".*${decimal}.*y = 2;.*" "step 1"
+
+# With count
+#
+gdb_test "next 2" ".*${decimal}.*w = w.*2;.*" "next 2"
+gdb_test "step 3" ".*${decimal}.*z = z.*5;.*" "step 3"
+gdb_test "next" ".*${decimal}.*callee.*OVER.*" "next 3"
+
+# Step over call
+#
+gdb_test "next" ".*${decimal}.*callee.*INTO.*" "next over"
+
+# Step into call
+#
+gdb_test "step" ".*${decimal}.*myglob.*"   "step into"
+
+# Step out of call
+#
+# I wonder if this is really portable.  Are there any caller-saves
+# platforms, on which `finish' will return you to some kind of pop
+# instruction, which is attributed to the line containing the function
+# call?
+
+# On PA64, we end up at a different instruction than PA32.
+# On IA-64, we also end up on callee instead of on the next line due
+# to the restoration of the global pointer (which is a caller-save).
+if { [istarget "hppa2.0w-hp-hpux*"] || [istarget "ia64-*-*"]} {
+    send_gdb "finish\n"
+    gdb_expect {
+        -re ".*${decimal}.*a.*5.*= a.*3.*$gdb_prompt $" { pass "step out 1" }
+        -re ".*${decimal}.*callee.*INTO.*$gdb_prompt $" { pass "step out 2" }
+        timeout { fail "step out" }
+    }
+} else {
+    gdb_test "finish" ".*${decimal}.*a.*5.*= a.*3.*" "step out"
+}
+
+### Testing nexti and stepi.
+###
+### test_i NAME COMMAND HERE THERE
+###
+### Send COMMAND to gdb over and over, while the output matches the
+### regexp HERE, followed by the gdb prompt.  Pass if the output
+### eventually matches the regexp THERE, followed by the gdb prompt;
+### fail if we have to iterate more than a hundred times, we time out
+### talking to gdb, or we get output which is neither HERE nor THERE.  :)
+###
+### Use NAME as the name of the test.
+###
+### The exact regexps used are "$HERE.*$gdb_prompt $"
+###                        and "$THERE.*$gdb_prompt $"
+### 
+proc test_i {name command here there} {
+    global gdb_prompt
+    
+    set i 0
+    while 1 {
+	send_gdb "${command}\n"
+	gdb_expect {
+	    -re "$here.*$gdb_prompt $" {
+		# Okay, we're still on the same line.  Just step again.
+	    }
+	    -re "$there.*$gdb_prompt $" {
+		# We've reached the next line.  Rah.
+		pass "$name"
+		return
+	    }
+	    -re "$gdb_prompt $" {
+		# We got something else.  Fail.
+		fail "$name"
+		return
+	    }
+	    timeout {
+		fail "$name (timeout)"
+		return
+	    }
+	}
+
+	# Have we gone for too many steps without seeing any progress?
+	if {[incr i] >= 100} {
+	    fail "$name (no progress after 100 steps)"
+	    return
+	}
+    }
+}
+
+test_i "stepi to next line" "stepi" \
+       ".*${decimal}.*a.*5.* = a.*3" \
+       ".*${decimal}.*callee.*STEPI"
+
+test_i "stepi into function" "stepi" \
+       ".*${decimal}.*callee.*STEPI" \
+       ".*callee \\(\\) at .*step-alarm\\.c" 
+
+# Continue to step until we reach the function's body.  This makes it
+# more likely that we've actually completed the prologue, so "finish"
+# will work.
+test_i "stepi into function's first source line" "stepi" \
+	".*${decimal}.*\\{" \
+	".*${decimal}.*myglob"
+
+# Have to be careful here, if the finish does not work, 
+# then we may run to the end of the program, which
+# will cause erroneous failures in the rest of the tests
+send_gdb "finish\n"
+gdb_expect {
+  -re ".*(Program received|Program exited).*$gdb_prompt $" {
+    # Oops... We ran to the end of the program...  Better reset     
+    if {![runto_main]} then {
+      fail "Can't run to main"
+      return 0
+    }
+    if {![runto step-alarm.c:57]} {
+      fail "Can't run to line 57"
+      return 0
+    }
+    fail "stepi: finish call"
+  }
+  -re ".*${decimal}.*callee.*NEXTI.*$gdb_prompt $" {
+    pass "stepi: finish call"
+  }
+  -re ".*${decimal}.*callee.*STEPI.*$gdb_prompt $" {
+    # On PA64, we end up at a different instruction than PA32.
+    # On IA-64, we end up on callee instead of on the following line due
+    # to the restoration of the global pointer.
+    if { [istarget "hppa2.0w-hp-hpux*"] || [istarget "ia64-*-*"] } {
+        pass "stepi: finish call 2"
+    } else {
+	fail "stepi: finish call 2"
+        return
+    }
+  }
+  -re "$gdb_prompt $" {
+    # We got something else.  Fail.
+    fail "stepi: finish call"
+    return
+  }
+  timeout {
+    fail "stepi: finish call (timeout)"
+    return
+  }
+}
+
+test_i "nexti over function" "nexti" \
+       ".*${decimal}.*callee.*NEXTI" \
+       ".*${decimal}.*y = w \\+ z;"
+
+return 0
--- /dev/null	Thu Feb 19 16:30:24 1998
+++ testsuite/gdb.base/step-alarm.c	Sat May 20 01:01:21 2000
@@ -0,0 +1,65 @@
+#include <signal.h>
+#include <stdio.h>
+#include <sys/time.h>
+
+/* Test stepping with a pending signal.  */
+
+int myglob = 0;
+
+int callee (void)
+{
+  myglob++;
+  return 0;
+}
+
+static void
+handler (int signum)
+{
+}
+
+int
+main (void)
+{
+  struct sigaction sa;
+  struct itimerval it;
+  int w, x, y, z;
+  int a[10];
+
+  sa.sa_handler = handler;
+  sigemptyset (&sa.sa_mask);
+  sa.sa_flags = 0;
+  sigaction (SIGALRM, &sa, NULL);
+
+  it.it_interval.tv_usec = 5000;
+  it.it_interval.tv_sec = 0;
+  it.it_value.tv_usec = 5000;
+  it.it_value.tv_sec = 0;
+  setitimer (ITIMER_REAL, &it, NULL);
+
+  /* Test "next" and "step" */
+  w = 0;
+  x = 1;
+  y = 2;
+  z = 3;
+  w = w + 2;
+  x = x + 3;
+  y = y + 4;
+  z = z + 5;
+
+  /* Test that "next" goes over a call */
+  callee(); /* OVER */
+
+  /* Test that "step" doesn't */
+  callee(); /* INTO */
+
+  /* Test "stepi"  */
+  a[5] = a[3] - a[4];
+  callee(); /* STEPI */
+
+  /* Test "nexti" */
+  callee(); /* NEXTI */
+  
+  y = w + z;
+
+  exit (0);
+}

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