diff options
author | Daniel Jacobowitz <drow@false.org> | 2009-01-20 15:33:14 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2009-01-20 15:33:14 +0000 |
commit | a12cc160ab21c29ef00ab4e2377e01ae85b9de35 (patch) | |
tree | 45b01b887cd8f98b667a2efc7e5defa8452fb2a4 /gdb | |
parent | 6f3b91a62110eaea42cd7df18d6f9293f5d60fa2 (diff) | |
download | gdb-a12cc160ab21c29ef00ab4e2377e01ae85b9de35.zip gdb-a12cc160ab21c29ef00ab4e2377e01ae85b9de35.tar.gz gdb-a12cc160ab21c29ef00ab4e2377e01ae85b9de35.tar.bz2 |
PR gdb/9346
* infcmd.c (signal_command): Do not specify a resume PC.
testsuite/
PR gdb/9346
* gdb.base/interrupt.c (sigint_handler): New.
(main): Install a SIGINT handler if SIGNALS is defined. Exit
on error.
* gdb.base/interrupt.exp: Define SIGNALS unless gdb,nosignals.
Test "signal SIGINT".
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/infcmd.c | 6 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/interrupt.c | 18 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/interrupt.exp | 38 |
5 files changed, 68 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 03c1159..a474390 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2008-01-20 Daniel Jacobowitz <dan@codesourcery.com> + + PR gdb/9346 + * infcmd.c (signal_command): Do not specify a resume PC. + 2009-01-19 Doug Evans <dje@google.com> * dummy-frame.c (dummy_frame): Replace regcache member with diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 2cd583c..3696f79 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1145,11 +1145,7 @@ signal_command (char *signum_exp, int from_tty) } clear_proceed_status (); - /* "signal 0" should not get stuck if we are stopped at a breakpoint. - FIXME: Neither should "signal foo" but when I tried passing - (CORE_ADDR)-1 unconditionally I got a testsuite failure which I haven't - tried to track down yet. */ - proceed (oursig == TARGET_SIGNAL_0 ? (CORE_ADDR) -1 : stop_pc, oursig, 0); + proceed ((CORE_ADDR) -1, oursig, 0); } /* Proceed until we reach a different source line with pc greater than diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 052c500..2eb1ee0 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2009-01-20 Daniel Jacobowitz <dan@codesourcery.com> + + PR gdb/9346 + * gdb.base/interrupt.c (sigint_handler): New. + (main): Install a SIGINT handler if SIGNALS is defined. Exit + on error. + * gdb.base/interrupt.exp: Define SIGNALS unless gdb,nosignals. + Test "signal SIGINT". + 2009-01-19 Doug Evans <dje@google.com> * gdb.base/break.exp: Update expected gdb output. diff --git a/gdb/testsuite/gdb.base/interrupt.c b/gdb/testsuite/gdb.base/interrupt.c index a895d4b..80b9060 100644 --- a/gdb/testsuite/gdb.base/interrupt.c +++ b/gdb/testsuite/gdb.base/interrupt.c @@ -2,6 +2,16 @@ #include <stdio.h> #include <unistd.h> #include <stdlib.h> + +#ifdef SIGNALS +#include <signal.h> + +static void +sigint_handler (int signo) +{ +} +#endif + int main () { @@ -11,6 +21,9 @@ main () set_debug_traps(); breakpoint(); #endif +#ifdef SIGNALS + signal (SIGINT, sigint_handler); +#endif printf ("talk to me baby\n"); while (1) { @@ -20,7 +33,10 @@ main () #ifdef EINTR if (errno != EINTR) #endif - perror (""); + { + perror (""); + return 1; + } } else if (nbytes == 0) { diff --git a/gdb/testsuite/gdb.base/interrupt.exp b/gdb/testsuite/gdb.base/interrupt.exp index 037902b..beee0cf 100644 --- a/gdb/testsuite/gdb.base/interrupt.exp +++ b/gdb/testsuite/gdb.base/interrupt.exp @@ -34,7 +34,13 @@ set bug_id 0 set testfile interrupt set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + +set options { debug } +if { ! [target_info exists gdb,nosignals] } { + lappend options "additional_flags=-DSIGNALS" +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $options] != "" } { untested interrupt.exp return -1 } @@ -165,7 +171,35 @@ if ![file exists $binfile] then { eof { fail "echo data (eof)" } } - setup_xfail "i*86-pc-linux*-gnu*" + if { ! [target_info exists gdb,nosignals] } { + # Wait until the program is in the read system call again. + sleep 2 + + # Stop the program for another test. + set msg "Send Control-C, second time" + send_gdb "\003" + gdb_test_multiple "" "$msg" { + -re "Program received signal SIGINT.*$gdb_prompt $" { + pass "$msg" + } + } + + # The "signal" command should deliver the correct signal and + # return to the loop. + set msg "signal SIGINT" + gdb_test_multiple "signal SIGINT" "$msg" { + -re "^signal SIGINT\r\nContinuing with signal SIGINT.\r\n(\r\n|)$" { pass "$msg" } + } + + # We should be back in the loop. + send_gdb "more data\n" + gdb_expect { + -re "^(\r\n|)more data\r\n(|more data\r\n)$" { pass "echo more data" } + timeout { fail "echo more data (timeout)" } + eof { fail "echo more data (eof)" } + } + } + send_gdb "\004" gdb_expect { -re "end of file.*Program exited normally.*$gdb_prompt $" { |