Commit | Line | Data |
---|---|---|
ecd75fc8 | 1 | # Copyright 2011-2014 Free Software Foundation, Inc. |
60f98dde MS |
2 | |
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
5 | # the Free Software Foundation; either version 3 of the License, or | |
6 | # (at your option) any later version. | |
7 | # | |
8 | # This program is distributed in the hope that it will be useful, | |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
12 | # | |
13 | # You should have received a copy of the GNU General Public License | |
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
15 | ||
16 | # Please email any bugs, comments, and/or additions to this file to: | |
17 | # bug-gdb@gnu.org | |
18 | ||
0efbbabc | 19 | standard_testfile linux-dp.c |
60f98dde MS |
20 | if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != ""} { |
21 | return -1 | |
22 | } | |
23 | ||
0efbbabc | 24 | clean_restart ${binfile} |
60f98dde MS |
25 | gdb_test_no_output "set print sevenbit-strings" |
26 | runto_main | |
27 | ||
28 | # Run until there are some threads. | |
29 | gdb_breakpoint [gdb_get_line_number "linuxthreads.exp: info threads 2"] | |
30 | gdb_continue_to_breakpoint "main thread's sleep" | |
31 | ||
d4f5bbb9 UW |
32 | # Make sure thread list is up-to-date (in case remote targets have not yet |
33 | # reported thread creation events) | |
34 | gdb_test "info threads" | |
35 | ||
60f98dde MS |
36 | # Create thread names. |
37 | gdb_test "thread apply 1 thread name threadname_1" \ | |
38 | "Thread 1 .*" \ | |
39 | "name thread 1" | |
40 | ||
41 | gdb_test "thread apply 2 thread name threadname_2" \ | |
42 | "Thread 2 .*" \ | |
43 | "name thread 2" | |
44 | ||
45 | gdb_test "thread apply 3 thread name threadname_3" \ | |
46 | "Thread 3 .*" \ | |
47 | "name thread 3" | |
48 | ||
49 | gdb_test "thread apply 4 thread name threadname_4" \ | |
50 | "Thread 4 .*" \ | |
51 | "name thread 4" | |
52 | ||
53 | gdb_test "thread apply 5 thread name threadname_5" \ | |
54 | "Thread 5 .*" \ | |
55 | "name thread 5" | |
56 | ||
57 | gdb_test "thread apply 6 thread name threadname_6" \ | |
58 | "Thread 6 .*" \ | |
59 | "name thread 6" | |
60 | ||
61 | # Collect thread ids, if any. | |
62 | gdb_test_multiple "info threads" "collect thread id" { | |
63 | -re ". 6 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_6\" \[^\r\n\]*" { | |
64 | set thread6 $expect_out(1,string) | |
65 | exp_continue | |
66 | } | |
67 | -re ". 5 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_5\" \[^\r\n\]*" { | |
68 | set thread5 $expect_out(1,string) | |
69 | exp_continue | |
70 | } | |
71 | -re ". 4 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_4\" \[^\r\n\]*" { | |
72 | set thread4 $expect_out(1,string) | |
73 | exp_continue | |
74 | } | |
75 | -re ". 3 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_3\" \[^\r\n\]*" { | |
76 | set thread3 $expect_out(1,string) | |
77 | exp_continue | |
78 | } | |
79 | -re ". 2 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_2\" \[^\r\n\]*" { | |
80 | set thread2 $expect_out(1,string) | |
81 | exp_continue | |
82 | } | |
83 | -re ". 1 .*\[Tt\]hread (\[0-9a-fA-Fx\]+).* \"threadname_1\" \[^\r\n\]*" { | |
84 | set thread1 $expect_out(1,string) | |
85 | exp_continue | |
86 | } | |
87 | -re ".*$gdb_prompt $" { | |
88 | pass "collect thread id" | |
89 | } | |
90 | } | |
91 | ||
92 | if { [info exists thread6] } then { | |
93 | gdb_test "echo $thread6\\n" "$thread6" "got thread ids" | |
94 | } | |
95 | ||
96 | # Collect process ids, if any. | |
97 | gdb_test_multiple "info threads" "collect thread id" { | |
98 | -re ". 6 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_6\" \[^\r\n\]*" { | |
99 | set process6 $expect_out(1,string) | |
100 | exp_continue | |
101 | } | |
102 | -re ". 5 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_5\" \[^\r\n\]*" { | |
103 | set process5 $expect_out(1,string) | |
104 | exp_continue | |
105 | } | |
106 | -re ". 4 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_4\" \[^\r\n\]*" { | |
107 | set process4 $expect_out(1,string) | |
108 | exp_continue | |
109 | } | |
110 | -re ". 3 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_3\" \[^\r\n\]*" { | |
111 | set process3 $expect_out(1,string) | |
112 | exp_continue | |
113 | } | |
114 | -re ". 2 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_2\" \[^\r\n\]*" { | |
115 | set process2 $expect_out(1,string) | |
116 | exp_continue | |
117 | } | |
118 | -re ". 1 .*\[Pp\]rocess (\[0-9a-fA-Fx\]+).* \"threadname_1\" \[^\r\n\]*" { | |
119 | set process1 $expect_out(1,string) | |
120 | exp_continue | |
121 | } | |
122 | -re ".*$gdb_prompt $" { | |
123 | pass "collect process id" | |
124 | } | |
125 | } | |
126 | ||
127 | if { [info exists process6] } then { | |
128 | gdb_test "echo $process6\\n" "$process6" "got process ids" | |
129 | } | |
130 | ||
131 | # Collect lwp ids, if any. | |
132 | gdb_test_multiple "info threads" "collect thread id" { | |
133 | -re ". 6 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_6\" \[^\r\n\]*" { | |
134 | set lwp6 $expect_out(1,string) | |
135 | exp_continue | |
136 | } | |
137 | -re ". 5 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_5\" \[^\r\n\]*" { | |
138 | set lwp5 $expect_out(1,string) | |
139 | exp_continue | |
140 | } | |
141 | -re ". 4 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_4\" \[^\r\n\]*" { | |
142 | set lwp4 $expect_out(1,string) | |
143 | exp_continue | |
144 | } | |
145 | -re ". 3 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_3\" \[^\r\n\]*" { | |
146 | set lwp3 $expect_out(1,string) | |
147 | exp_continue | |
148 | } | |
149 | -re ". 2 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_2\" \[^\r\n\]*" { | |
150 | set lwp2 $expect_out(1,string) | |
151 | exp_continue | |
152 | } | |
153 | -re ". 1 .*LWP (\[0-9a-fA-Fx\]+).* \"threadname_1\" \[^\r\n\]*" { | |
154 | set lwp1 $expect_out(1,string) | |
155 | exp_continue | |
156 | } | |
157 | -re ".*$gdb_prompt $" { | |
158 | pass "collect lwp id" | |
159 | } | |
160 | } | |
161 | ||
162 | if { [info exists lwp6] } then { | |
163 | gdb_test "echo $lwp6\\n" "$lwp6" "got lwp ids" | |
164 | } | |
165 | ||
166 | # | |
167 | # Now: test 'thread find' with names. | |
168 | # | |
169 | ||
170 | gdb_test "thread find threadname_6" \ | |
171 | "Thread 6 has name 'threadname_6'" "find thread name 6" | |
172 | gdb_test "thread find threadname_5" \ | |
173 | "Thread 5 has name 'threadname_5'" "find thread name 5" | |
174 | gdb_test "thread find threadname_4" \ | |
175 | "Thread 4 has name 'threadname_4'" "find thread name 4" | |
176 | gdb_test "thread find threadname_3" \ | |
177 | "Thread 3 has name 'threadname_3'" "find thread name 3" | |
178 | gdb_test "thread find threadname_2" \ | |
179 | "Thread 2 has name 'threadname_2'" "find thread name 2" | |
180 | gdb_test "thread find threadname_1" \ | |
181 | "Thread 1 has name 'threadname_1'" "find thread name 1" | |
182 | ||
183 | # | |
184 | # Test 'thread find' with thread ids, if any. | |
185 | # | |
186 | ||
187 | if { [info exists thread6] } then { | |
188 | gdb_test "thread find $thread6" \ | |
189 | "Thread 6 has .*$thread6.*" "find thread id 6" | |
190 | gdb_test "thread find $thread5" \ | |
191 | "Thread 5 has .*$thread5.*" "find thread id 5" | |
192 | gdb_test "thread find $thread4" \ | |
193 | "Thread 4 has .*$thread4.*" "find thread id 4" | |
194 | gdb_test "thread find $thread3" \ | |
195 | "Thread 3 has .*$thread3.*" "find thread id 3" | |
196 | gdb_test "thread find $thread2" \ | |
197 | "Thread 2 has .*$thread2.*" "find thread id 2" | |
198 | gdb_test "thread find $thread1" \ | |
199 | "Thread 1 has .*$thread1.*" "find thread id 1" | |
200 | } | |
201 | ||
202 | # | |
203 | # Test 'thread find' with process ids, if any. | |
204 | # | |
205 | ||
206 | if { [info exists process6] } then { | |
207 | gdb_test "thread find $process6" \ | |
208 | "Thread 6 has .*$process6.*" "find process id 6" | |
209 | gdb_test "thread find $process5" \ | |
210 | "Thread 5 has .*$process5.*" "find process id 5" | |
211 | gdb_test "thread find $process4" \ | |
212 | "Thread 4 has .*$process4.*" "find process id 4" | |
213 | gdb_test "thread find $process3" \ | |
214 | "Thread 3 has .*$process3.*" "find process id 3" | |
215 | gdb_test "thread find $process2" \ | |
216 | "Thread 2 has .*$process2.*" "find process id 2" | |
217 | gdb_test "thread find $process1" \ | |
218 | "Thread 1 has .*$process1.*" "find process id 1" | |
219 | } | |
220 | ||
221 | # | |
222 | # Test 'thread find' with lwp ids, if any. | |
223 | # | |
224 | ||
225 | if { [info exists lwp6] } then { | |
226 | gdb_test "thread find $lwp6" \ | |
227 | "Thread 6 has .*$lwp6.*" "find lwp id 6" | |
228 | gdb_test "thread find $lwp5" \ | |
229 | "Thread 5 has .*$lwp5.*" "find lwp id 5" | |
230 | gdb_test "thread find $lwp4" \ | |
231 | "Thread 4 has .*$lwp4.*" "find lwp id 4" | |
232 | gdb_test "thread find $lwp3" \ | |
233 | "Thread 3 has .*$lwp3.*" "find lwp id 3" | |
234 | gdb_test "thread find $lwp2" \ | |
235 | "Thread 2 has .*$lwp2.*" "find lwp id 2" | |
236 | gdb_test "thread find $lwp1" \ | |
237 | "Thread 1 has .*$lwp1.*" "find lwp id 1" | |
238 | } | |
239 | ||
240 | # Test no match. | |
241 | ||
242 | gdb_test "thread find foobarbaz" "No threads match .*" "no thread" | |
243 | ||
244 | # | |
245 | # Test regular expression | |
246 | # | |
247 | ||
248 | set see1 0 | |
249 | set see2 0 | |
250 | set see3 0 | |
251 | set see4 0 | |
252 | set see5 0 | |
253 | set see6 0 | |
254 | ||
255 | gdb_test_multiple "thread find threadname_\[345\]" "test regular exp" { | |
256 | -re "Thread 6 has name \[^\r\n\]*" { | |
257 | set see6 1 | |
258 | exp_continue | |
259 | } | |
260 | -re "Thread 5 has name \[^\r\n\]*" { | |
261 | set see5 1 | |
262 | exp_continue | |
263 | } | |
264 | -re "Thread 4 has name \[^\r\n\]*" { | |
265 | set see4 1 | |
266 | exp_continue | |
267 | } | |
268 | -re "Thread 3 has name \[^\r\n\]*" { | |
269 | set see3 1 | |
270 | exp_continue | |
271 | } | |
272 | -re "Thread 2 has name \[^\r\n\]*" { | |
273 | set see2 1 | |
274 | exp_continue | |
275 | } | |
276 | -re "Thread 1 has name \[^\r\n\]*" { | |
277 | set see1 1 | |
278 | exp_continue | |
279 | } | |
280 | -re ".*$gdb_prompt $" { | |
281 | if { $see3 && $see4 && $see5 && !$see1 && !$see2 && !$see6 } then { | |
282 | pass "test regular exp" | |
283 | } else { | |
284 | fail "test regular exp" | |
285 | } | |
286 | } | |
287 | } | |
288 | ||
289 | # | |
290 | # Test info threads on a subset of threads | |
291 | # | |
292 | ||
293 | set see1 0 | |
294 | set see2 0 | |
295 | set see3 0 | |
296 | set see4 0 | |
297 | set see5 0 | |
298 | set see6 0 | |
299 | ||
300 | gdb_test_multiple "info threads 2 4 6" "info threads 2 4 6" { | |
aea5b279 MS |
301 | -re ". 6 \[^\r\n\]*\"threadname_6\" \[^\r\n\]*" { |
302 | set see6 1 | |
60f98dde MS |
303 | exp_continue |
304 | } | |
aea5b279 MS |
305 | -re ". 5 \[^\r\n\]*\"threadname_5\" \[^\r\n\]*" { |
306 | set see5 1 | |
60f98dde MS |
307 | exp_continue |
308 | } | |
e338d953 MS |
309 | -re ". 4 \[^\r\n\]*\"threadname_4\" \[^\r\n\]*" { |
310 | set see4 1 | |
60f98dde MS |
311 | exp_continue |
312 | } | |
aea5b279 MS |
313 | -re ". 3 \[^\r\n\]*\"threadname_3\" \[^\r\n\]*" { |
314 | set see3 1 | |
60f98dde MS |
315 | exp_continue |
316 | } | |
aea5b279 MS |
317 | -re ". 2 \[^\r\n\]*\"threadname_2\" \[^\r\n\]*" { |
318 | set see2 1 | |
319 | exp_continue | |
320 | } | |
321 | -re ". 1 \[^\r\n\]*\"threadname_1\" \[^\r\n\]*" { | |
322 | set see1 1 | |
60f98dde MS |
323 | exp_continue |
324 | } | |
e338d953 | 325 | -re "$gdb_prompt $" { |
60f98dde MS |
326 | if { $see2 && $see4 && $see6 && !$see1 && !$see3 && !$see5 } then { |
327 | pass "info threads 2 4 6" | |
328 | } else { | |
329 | fail "info threads 2 4 6" | |
330 | } | |
331 | } | |
332 | } | |
333 | ||
334 | # | |
335 | # Test info threads on a range | |
336 | # | |
337 | ||
338 | set see1 0 | |
339 | set see2 0 | |
340 | set see3 0 | |
341 | set see4 0 | |
342 | set see5 0 | |
343 | set see6 0 | |
344 | ||
345 | gdb_test_multiple "info threads 3-5" "info threads 3-5" { | |
aea5b279 MS |
346 | -re ". 6 .*\"threadname_6\" \[^\r\n\]*" { |
347 | set see6 1 | |
60f98dde MS |
348 | exp_continue |
349 | } | |
aea5b279 MS |
350 | -re ". 5 .*\"threadname_5\" \[^\r\n\]*" { |
351 | set see5 1 | |
60f98dde MS |
352 | exp_continue |
353 | } | |
e338d953 MS |
354 | -re ". 4 .*\"threadname_4\" \[^\r\n\]*" { |
355 | set see4 1 | |
60f98dde MS |
356 | exp_continue |
357 | } | |
aea5b279 MS |
358 | -re ". 3 .*\"threadname_3\" \[^\r\n\]*" { |
359 | set see3 1 | |
60f98dde MS |
360 | exp_continue |
361 | } | |
aea5b279 MS |
362 | -re ". 2 .*\"threadname_2\" \[^\r\n\]*" { |
363 | set see2 1 | |
364 | exp_continue | |
365 | } | |
366 | -re ". 1 .*\"threadname_1\" \[^\r\n\]*" { | |
367 | set see1 1 | |
60f98dde MS |
368 | exp_continue |
369 | } | |
e338d953 | 370 | -re "$gdb_prompt $" { |
60f98dde MS |
371 | if { $see3 && $see4 && $see5 && !$see1 && !$see2 && !$see6 } then { |
372 | pass "info threads 3-5" | |
373 | } else { | |
374 | fail "info threads 3-5" | |
375 | } | |
376 | } | |
377 | } | |
378 | ||
379 | # Test inverted range | |
380 | ||
381 | gdb_test "info threads 5-3" "inverted range" "test inverted range" | |
382 | ||
383 | # Test degenerate range | |
384 | ||
385 | set see1 0 | |
386 | set see2 0 | |
387 | set see3 0 | |
388 | set see4 0 | |
389 | set see5 0 | |
390 | set see6 0 | |
391 | ||
392 | gdb_test_multiple "info threads 3-3" "info threads 3-3" { | |
e338d953 | 393 | -re ". 6 .*\"threadname_6\" \[^\r\n\]*" { |
60f98dde MS |
394 | set see6 1 |
395 | exp_continue | |
396 | } | |
e338d953 | 397 | -re ". 5 .*\"threadname_5\" \[^\r\n\]*" { |
60f98dde MS |
398 | set see5 1 |
399 | exp_continue | |
400 | } | |
e338d953 | 401 | -re ". 4 .*\"threadname_4\" \[^\r\n\]*" { |
60f98dde MS |
402 | set see4 1 |
403 | exp_continue | |
404 | } | |
e338d953 | 405 | -re ". 3 .*\"threadname_3\" \[^\r\n\]*" { |
60f98dde MS |
406 | set see3 1 |
407 | exp_continue | |
408 | } | |
e338d953 | 409 | -re ". 2 .*\"threadname_2\" \[^\r\n\]*" { |
60f98dde MS |
410 | set see2 1 |
411 | exp_continue | |
412 | } | |
e338d953 | 413 | -re ". 1 .*\"threadname_1\" \[^\r\n\]*" { |
60f98dde MS |
414 | set see1 1 |
415 | exp_continue | |
416 | } | |
417 | -re ".*$gdb_prompt $" { | |
418 | if { $see3 && !$see1 && !$see2 && !$see4 && !$see5 && !$see6 } then { | |
419 | pass "info threads 3-3" | |
420 | } else { | |
421 | fail "info threads 3-3" | |
422 | } | |
423 | } | |
424 | } | |
425 | ||
79ba84ca MS |
426 | # Test bad input |
427 | ||
428 | gdb_test "info thread foo" \ | |
429 | "Args must be numbers or '.' variables." \ | |
430 | "info thread foo" | |
431 | ||
432 | gdb_test "info thread foo -1" \ | |
433 | "Args must be numbers or '.' variables." \ | |
434 | "info thread foo -1" |