xref: /openbsd-src/gnu/usr.bin/binutils/gdb/testsuite/gdb.threads/print-threads.exp (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
1*b725ae77Skettenis# Copyright (C) 1996, 1997, 2002, 2003 Free Software Foundation, Inc.
2*b725ae77Skettenis
3*b725ae77Skettenis# This program is free software; you can redistribute it and/or modify
4*b725ae77Skettenis# it under the terms of the GNU General Public License as published by
5*b725ae77Skettenis# the Free Software Foundation; either version 2 of the License, or
6*b725ae77Skettenis# (at your option) any later version.
7*b725ae77Skettenis#
8*b725ae77Skettenis# This program is distributed in the hope that it will be useful,
9*b725ae77Skettenis# but WITHOUT ANY WARRANTY; without even the implied warranty of
10*b725ae77Skettenis# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11*b725ae77Skettenis# GNU General Public License for more details.
12*b725ae77Skettenis#
13*b725ae77Skettenis# You should have received a copy of the GNU General Public License
14*b725ae77Skettenis# along with this program; if not, write to the Free Software
15*b725ae77Skettenis# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16*b725ae77Skettenis
17*b725ae77Skettenis# Please email any bugs, comments, and/or additions to this file to:
18*b725ae77Skettenis# bug-gdb@prep.ai.mit.edu
19*b725ae77Skettenis
20*b725ae77Skettenis# This file was written by Daniel Jacobowitz <drow@mvista.com>
21*b725ae77Skettenis# (parts based on pthreads.exp by Fred Fish (fnf@cygnus.com).
22*b725ae77Skettenis#
23*b725ae77Skettenis# It tests miscellaneous actions with multiple threads, including
24*b725ae77Skettenis# handling for thread exit.
25*b725ae77Skettenis
26*b725ae77Skettenisif $tracelevel then {
27*b725ae77Skettenis	strace $tracelevel
28*b725ae77Skettenis}
29*b725ae77Skettenis
30*b725ae77Skettenisset prms_id 0
31*b725ae77Skettenisset bug_id 0
32*b725ae77Skettenis
33*b725ae77Skettenisset testfile "print-threads"
34*b725ae77Skettenisset srcfile ${testfile}.c
35*b725ae77Skettenisset binfile ${objdir}/${subdir}/${testfile}
36*b725ae77Skettenis
37*b725ae77Skettenis# regexp for "horizontal" text (i.e. doesn't include newline or
38*b725ae77Skettenis# carriage return)
39*b725ae77Skettenisset horiz "\[^\n\r\]*"
40*b725ae77Skettenis
41*b725ae77Skettenisif {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}"]] != "" } {
42*b725ae77Skettenis    return -1
43*b725ae77Skettenis}
44*b725ae77Skettenis
45*b725ae77Skettenis# Now we can proceed with the real testing.
46*b725ae77Skettenis
47*b725ae77Skettenis# Start with a fresh gdb.
48*b725ae77Skettenis
49*b725ae77Skettenisgdb_exit
50*b725ae77Skettenisgdb_start
51*b725ae77Skettenisgdb_reinitialize_dir $srcdir/$subdir
52*b725ae77Skettenisgdb_load ${binfile}
53*b725ae77Skettenis
54*b725ae77Skettenisgdb_test "set print sevenbit-strings" ""
55*b725ae77Skettenis#gdb_test "set print address off" ""
56*b725ae77Skettenisgdb_test "set width 0" ""
57*b725ae77Skettenis
58*b725ae77Skettenis# We'll need this when we send_gdb a ^C to GDB.  Need to do it before we
59*b725ae77Skettenis# run the program and gdb starts saving and restoring tty states.
60*b725ae77Skettenis# On Ultrix, we don't need it and it is really slow (because shell_escape
61*b725ae77Skettenis# doesn't use vfork).
62*b725ae77Skettenisif ![istarget "*-*-ultrix*"] then {
63*b725ae77Skettenis    gdb_test "shell stty intr '^C'" ""
64*b725ae77Skettenis}
65*b725ae77Skettenis
66*b725ae77Skettenisproc test_all_threads { name kill } {
67*b725ae77Skettenis    global gdb_prompt
68*b725ae77Skettenis
69*b725ae77Skettenis    set i 0
70*b725ae77Skettenis    set j 0
71*b725ae77Skettenis    send_gdb "continue\n"
72*b725ae77Skettenis    gdb_expect {
73*b725ae77Skettenis	-re "Breakpoint \[0-9\]+, thread_function \\(arg=.*\\) at .*print-threads.c:\[0-9\]+.*$gdb_prompt" {
74*b725ae77Skettenis	    set i [expr $i + 1]
75*b725ae77Skettenis	    pass "Hit thread_function breakpoint, $i ($name)"
76*b725ae77Skettenis	    send_gdb "continue\n"
77*b725ae77Skettenis	    exp_continue
78*b725ae77Skettenis	}
79*b725ae77Skettenis	-re "Breakpoint \[0-9\]+, .* kill \\(.*\\) .*$gdb_prompt" {
80*b725ae77Skettenis	    set j [expr $j + 1]
81*b725ae77Skettenis	    if { $kill == 1 } {
82*b725ae77Skettenis		pass "Hit kill breakpoint, $j ($name)"
83*b725ae77Skettenis	    } else {
84*b725ae77Skettenis		fail "Hit kill breakpoint, $j ($name) (unexpected)"
85*b725ae77Skettenis	    }
86*b725ae77Skettenis	    send_gdb "continue\n"
87*b725ae77Skettenis	    exp_continue
88*b725ae77Skettenis	}
89*b725ae77Skettenis	-re "Program exited normally\\.\[\r\n\]+$gdb_prompt" {
90*b725ae77Skettenis	    pass "program exited normally"
91*b725ae77Skettenis	    if {$i == 5} {
92*b725ae77Skettenis		pass "all threads ran once ($name)"
93*b725ae77Skettenis	    } else {
94*b725ae77Skettenis		fail "all threads ran once ($name) (total $i threads ran)"
95*b725ae77Skettenis	    }
96*b725ae77Skettenis	}
97*b725ae77Skettenis	-re "Program received signal SIGTRAP.*(Thread \[0-9\]* \\(zombie\\)|0x00000000 in ).*$gdb_prompt $" {
98*b725ae77Skettenis	    if { $kill == 1 } {
99*b725ae77Skettenis		kfail "gdb/1265" "Running threads ($name) (zombie thread)"
100*b725ae77Skettenis	    } else {
101*b725ae77Skettenis		fail "Running threads ($name) (unknown output)"
102*b725ae77Skettenis	    }
103*b725ae77Skettenis	}
104*b725ae77Skettenis	-re "$gdb_prompt" {
105*b725ae77Skettenis	    fail "Running threads ($name) (unknown output)"
106*b725ae77Skettenis	}
107*b725ae77Skettenis	timeout {
108*b725ae77Skettenis	    fail "Running threads ($name) (timeout)"
109*b725ae77Skettenis	}
110*b725ae77Skettenis    }
111*b725ae77Skettenis}
112*b725ae77Skettenis
113*b725ae77Skettenisrunto_main
114*b725ae77Skettenisgdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\."
115*b725ae77Skettenisgdb_test "set var slow = 0" ""
116*b725ae77Skettenistest_all_threads "fast" 0
117*b725ae77Skettenis
118*b725ae77Skettenisrunto_main
119*b725ae77Skettenisgdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\." "break thread_function (2)"
120*b725ae77Skettenisgdb_test "set var slow = 1" ""
121*b725ae77Skettenistest_all_threads "slow" 0
122*b725ae77Skettenis
123*b725ae77Skettenisrunto_main
124*b725ae77Skettenisgdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\." "break thread_function (3)"
125*b725ae77Skettenisgdb_test "set var slow = 1" "" "set var slow = 1 (2)"
126*b725ae77Skettenisgdb_test "break kill" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+"
127*b725ae77Skettenistest_all_threads "slow with kill breakpoint" 1
128*b725ae77Skettenis
129*b725ae77Skettenisreturn 0
130