From 1f75a6516a4b480b5521dfb4e1a0721887ab5cdc Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 24 Oct 2017 10:43:35 +0100 Subject: [PATCH] Drop /proc/PID/status polling from gdb.threads/attach-into-signal.exp I noticed that the 'with_test_prefix "stoppedtry $stoppedtry"' prefix in this testcase is unnecessary, because inside that block there are no pass/fail calls. In fact the block includes a comment saying: # No PASS message as we may be looping in multiple # attempts. but looking deeper at this I noticed a few odd things with this code block: 1. This code is assuming that the second line in the /proc/PID/status files is the "State:" line, which may have been true when this was originally written, but is not true on my machine at least (Linux 4.8.13). $ cat /proc/self/status Name: cat Umask: 0002 State: R (running) So nowadays, that 'string match "*(stopped)*"' is running against the "Umask:" line and thus always returns false, meaning the loop always breaks on $stoppedtry == 0. 2. The loop seems to be waiting for the process to become "(stopped)", but if so then that 'if {![string match]}' check is reversed, it should be checking 'if {[string match]}' instead, because "string match" returns true if the string matches, not 0. 3. But if we fixed all that, we'd still run into the simple fact that nothing is actually stopping the test's inferior process before GDB attaches... The top of the testcase says: # This test was created by modifying attach-stopped.exp. ... and attach-stopped.exp does have: # Stop the program remote_exec build "kill -s STOP ${testpid}" but then attach-stopped.exp doesn't have an equivalent /proc/PID/status poll loop... (Maybe it could.) So remove this whole loop as useless. gdb/testsuite/ChangeLog: 2017-10-24 Pedro Alves * gdb.threads/attach-into-signal.exp: Remove whole "stoppedtry" loop. --- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.threads/attach-into-signal.exp | 27 ------------------------ 2 files changed, 5 insertions(+), 27 deletions(-) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 0038a0c..25dcd06 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2017-10-24 Pedro Alves + * gdb.threads/attach-into-signal.exp: Remove whole "stoppedtry" + loop. + +2017-10-24 Pedro Alves + * gdb.threads/attach-into-signal.exp (corefunc): Remove "attach $attempt" and "stoppedtry $stoppedtry" test prefixes. diff --git a/gdb/testsuite/gdb.threads/attach-into-signal.exp b/gdb/testsuite/gdb.threads/attach-into-signal.exp index 7502479..ab80e82 100644 --- a/gdb/testsuite/gdb.threads/attach-into-signal.exp +++ b/gdb/testsuite/gdb.threads/attach-into-signal.exp @@ -56,33 +56,6 @@ proc corefunc { threadtype executable } { set attempt 1 set passes 1 while { $passes < 3 && $attempt <= $attempts } { - set stoppedtry 0 - while { $stoppedtry < 10 } { - with_test_prefix "stoppedtry $stoppedtry" { - if [catch {open /proc/${testpid}/status r} fileid] { - set stoppedtry 10 - break - } - gets $fileid line1 - gets $fileid line2 - close $fileid - - if {![string match "*(stopped)*" $line2]} { - # No PASS message as we may be looping in multiple - # attempts. - break - } - sleep 1 - set stoppedtry [expr $stoppedtry + 1] - } - } - if { $stoppedtry >= 10 } { - verbose -log $line2 - set test "process is still running on the attempt # $attempt of $attempts" - break - } - - # Main test: set test "attach (pass $passes), pending signal catch" if {[gdb_test_multiple "attach $testpid" $test { -re "Attaching to program.*`?$escapedbinfile'?, process $testpid.* received signal SIGALRM.*$gdb_prompt $" { -- 2.7.4