This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [patch] Support inferior events in python
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: sami wagiaalla <swagiaal at redhat dot com>
- Cc: Pedro Alves <pedro at codesourcery dot com>, gdb-patches at sourceware dot org, Tom Tromey <tromey at redhat dot com>
- Date: Wed, 6 Jul 2011 21:37:42 +0200
- Subject: Re: [patch] Support inferior events in python
- References: <m37he0g95v.fsf@fleche.redhat.com> <20110209163022.GA16069@host1.dyn.jankratochvil.net> <4D55559B.1090004@redhat.com> <201102111556.42026.pedro@codesourcery.com> <4D59662D.30101@redhat.com> <20110216111054.GA3594@host1.dyn.jankratochvil.net>
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"
- }
}