Re: [patch] Support inferior events in python

Jan Kratochvil
2011-07-06T19:38:17Z

Hi Sami,

the testcase had some problems where multiple asynchronous events could happen
at the same time. This is difficult to parse without any new framework in the
.exp code.

As Pedro asked
http://sourceware.org/ml/gdb-patches/2011-02/msg00213.html
> Actually, do you really need non-stop?

I also do not think the testcases should / need to test the non-stop mode.
But currently it cannot test thread id in all-stop/sync mode, therefore I have
filed it as PR and kept the testcases in non-stop/async mode:
http://sourceware.org/bugzilla/show_bug.cgi?id=12967

Due to the difficulty of parsing events which can happen at the same time in
various order I have changed also the .c file so that only event can happen at
any time. I hope I did not lower the testcase coverage.

Another KFAIL has been filed as:
python threads incompatible with gdbserver
http://sourceware.org/bugzilla/show_bug.cgi?id=12966

I will check it in in some time without any comments.

Thanks,
Jan

2011-07-06 Sami Wagiaalla <swagiaal@redhat.com>
Jan Kratochvil <jan.kratochvil@redhat.com>

* gdb.python/py-events.exp: Remove pretty printing comment.
* gdb.python/py-evsignal.exp: New file.
* gdb.python/py-evthreads.c: Include signal.h.
(thread3): Remove variable count3. Remove variable bad and use raise
instead.
(thread2): Remove variable count2. Move thread3 pthread_create here,
merge pthread_join to a single line.
(main): Remove variable count1. Merge pthread_join with pthread_create
to a single line.
* gdb.python/py-evthreads.exp: Remove pretty printing comment. New
KFAIL python/12966 for gdbserver. Test return value of
gdb_compile_pthreads. Use gdb_run_cmd. Replace send_gdb and
gdb_expect by gdb_test and gdb_test_multiple.
(thread 2, thread 3): New tests.

--- a/gdb/testsuite/gdb.python/py-events.exp
+++ b/gdb/testsuite/gdb.python/py-events.exp
@@ -13,11 +13,6 @@
# 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 file is part of the GDB testsuite. It tests Python-based
-# pretty-printing for the CLI.
-
-# Skip all tests if Python scripting is not enabled.
-
if $tracelevel then {
strace $tracelevel
}
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-evsignal.exp
@@ -0,0 +1,54 @@
+# Copyright (C) 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/>.
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+if {[is_remote target]} {
+ # RuntimeError: Could not find event thread
+ kfail "python/12966" "Signal Thread 3"
+ return -1
+}
+
+load_lib gdb-python.exp
+
+set testfile "py-evsignal"
+set srcfile py-evthreads.c
+set binfile ${objdir}/${subdir}/${testfile}
+set pyfile ${srcdir}/${subdir}/py-events.py
+
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+ return -1
+}
+clean_restart $testfile
+
+if { [skip_python_tests] } { continue }
+
+gdb_test_no_output "python execfile ('${pyfile}')" ""
+
+gdb_test "Test_Events" "Event testers registered."
+gdb_test_no_output "set non-stop on"
+gdb_test_no_output "set target-async on"
+
+gdb_run_cmd
+gdb_test_multiple "" "Signal Thread 3" {
+ -re "event type: stop\r\nstop reason: signal\r\nstop signal: SIGUSR1\r\nthread num: 3\r\nevent type: stop\r\n$gdb_prompt $" {
+ pass "thread 3 was signaled"
+ }
+ -re "The target does not support running in non-stop mode" {
+ unsupported "non-stop mode is unsupported"
+ }
+}
--- a/gdb/testsuite/gdb.python/py-evthreads.c
+++ b/gdb/testsuite/gdb.python/py-evthreads.c
@@ -19,37 +19,35 @@
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
+#include <signal.h>

pthread_t thread2_id;
pthread_t thread3_id;

void* thread3 (void* d)
{
- int count3 = 0;
- count3++;
-
- int *bad;
- *bad = 1;
+ raise (SIGUSR1);

return NULL;
}

void* thread2 (void* d)
{
- int count2 = 0;
- count2++;
+ /* Do not quit thread3 asynchronously wrt thread2 stop - wait first on
+ thread3_id to stop. It would complicate testcase receiption of the
+ events. */
+
+ pthread_create (&thread3_id, NULL, thread3, NULL); pthread_join (thread3_id, NULL);
+
return NULL;
}

-int main (){
-
- pthread_create (&thread2_id, NULL, thread2, NULL);
- pthread_create (&thread3_id, NULL, thread3, NULL);
+int main (void)
+{
+ /* Use single line to not to race whether `thread2' breakpoint or `next' over
+ pthread_create will stop first. */

- int count1 = 0; // stop1
- count1++;
+ pthread_create (&thread2_id, NULL, thread2, NULL); pthread_join (thread2_id, NULL);

- pthread_join (thread2_id, NULL);
- pthread_join (thread3_id, NULL);
return 12;
}
--- a/gdb/testsuite/gdb.python/py-evthreads.exp
+++ b/gdb/testsuite/gdb.python/py-evthreads.exp
@@ -13,15 +13,16 @@
# 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 file is part of the GDB testsuite. It tests Python-based
-# pretty-printing for the CLI.
-
-# Skip all tests if Python scripting is not enabled.
-
if $tracelevel then {
strace $tracelevel
}

+if {[is_remote target]} {
+ # RuntimeError: Could not find event thread
+ kfail "python/12966" "Run to breakpoint 1"
+ return -1
+}
+
load_lib gdb-python.exp

set testfile "py-evthreads"
@@ -29,7 +30,9 @@ set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
set pyfile ${srcdir}/${subdir}/py-events.py

-gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}
+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+ return -1
+}
clean_restart $testfile

if { [skip_python_tests] } { continue }
@@ -44,76 +47,37 @@ gdb_breakpoint "main"
gdb_breakpoint "thread2"
gdb_breakpoint "thread3"

-send_gdb "run\n"
-gdb_expect {
- -re "event type: stop.*
-.*stop reason: breakpoint.*
-.*breakpoint number: 1.*
-.*thread num: 1.*" {
- pass "reached breakpoint 1"
+gdb_run_cmd
+set test "Run to breakpoint 1"
+gdb_test_multiple "" $test {
+ -re "event type: stop\r\nstop reason: breakpoint\r\nbreakpoint number: 1\r\nthread num: 1\r\n$gdb_prompt $" {
+ pass $test
}
- timeout {
- fail "did not reach breakpoint 1"
- }
-}
-
-send_gdb "next\n"
-gdb_expect {
- -re "event type: stop.*
-.*stop reason: breakpoint.*
-.*breakpoint number: 2.*
-.*thread num: 2.*" {
- pass "reached breakpoint 2"
+ -re "The target does not support running in non-stop mode" {
+ unsupported "non-stop mode is unsupported"
+ return
}
- timeout {
- fail "did not reach breakpoint 2"
- }
}

-send_gdb "next\n"
-gdb_expect {
- -re "event type: stop.*
-.*stop reason: breakpoint.*
-.*breakpoint number: 3.*
-.*thread num: 3.*" {
- pass "reached breakpoint 3"
- }
- timeout {
- fail "did not reach breakpoint 3"
- }
-}
+gdb_test "next" "event type: stop\r\nstop reason: breakpoint\r\nbreakpoint number: 2\r\nthread num: 2" "reached breakpoint 2"

-send_gdb "continue&\n"
-gdb_expect {
- -re ".*event type: continue.*
-.*thread num: 1.*\r\n$gdb_prompt " {
- pass "continue thread 1"
- }
- timeout {
- fail "continue thread 1 failed"
- }
-}
+gdb_test "thread 2" {\[Switching to thread 2 .*}
+
+gdb_test "next" "event type: stop\r\nstop reason: breakpoint\r\nbreakpoint number: 3\r\nthread num: 3" "reached breakpoint 3"
+
+gdb_test "thread 3" {\[Switching to thread 3 .*}

-gdb_test "thread 2" ".*Switching to thread 2.*"
-send_gdb "continue&\n"
-gdb_expect {
- -re ".*event type: continue.*
-.*thread num: 2.*" {
- pass "continue thread 2"
+set test "continue thread 1"
+gdb_test_multiple "continue&" $test {
+ -re "event type: continue\r\nthread num: 3\r\n$gdb_prompt " {
+ # This expect string must not expect the end-of-buffer '$'.
+ pass $test
}
- timeout {
- fail "continue thread 2 failed"
- }
}

-send_gdb "continue -a\n"
-gdb_expect {
- -re ".*stop reason: signal.*
-.*stop signal: SIGSEGV.*
-.*thread num: 3.*" {
- pass "thread 3 was signalled"
+set test "thread 3 was signaled"
+gdb_test_multiple "" $test {
+ -re "event type: stop\r\nstop reason: signal\r\nstop signal: SIGUSR1\r\nthread num: 3\r\nevent type: stop\r\n$" {
+ pass $test
}
- timeout {
- fail "thread 3 was not signalled"
- }
}