gdb tests: Allow for "LWP" or "process" in thread IDs from info threads
Several tests assume that the first word after a thread ID in 'info threads' output is "Thread". However, several targets use "LWP" instead such as the FreeBSD and NetBSD native targets. The Linux native target also uses "LWP" if libthread_db is not being used. Targets that do not support threads use "process" as the first word via normal_pid_to_str. Add a tdlabel_re global variable as a regular-expression for a thread label in `info threads' that matches either "process", "Thread", or "LWP". Some other tests in the tree don't require a specific word, and some targets may use other first words (e.g. OpenBSD uses "thread" and Ravenscar threads use "Ravenscar Thread").
This commit is contained in:
parent
efd58a4379
commit
467a34bb9e
24 changed files with 62 additions and 53 deletions
|
@ -50,7 +50,7 @@ proc test_thread_find {} {
|
||||||
}
|
}
|
||||||
set any "\[^\r\n\]*"
|
set any "\[^\r\n\]*"
|
||||||
gdb_test_multiple "info threads" "collect thread id" {
|
gdb_test_multiple "info threads" "collect thread id" {
|
||||||
-re ". ($decimal).$decimal (Thread ${any}) \"threadname_\[0-9\]+\" $any" {
|
-re ". ($decimal).$decimal (${tdlabel_re} ${any}) \"threadname_\[0-9\]+\" $any" {
|
||||||
set thr_num $expect_out(1,string)
|
set thr_num $expect_out(1,string)
|
||||||
set target_id($thr_num) $expect_out(2,string)
|
set target_id($thr_num) $expect_out(2,string)
|
||||||
exp_continue
|
exp_continue
|
||||||
|
|
|
@ -63,7 +63,7 @@ gdb_test "continue" \
|
||||||
# reported in the "Id" column.
|
# reported in the "Id" column.
|
||||||
|
|
||||||
gdb_test "info threads" \
|
gdb_test "info threads" \
|
||||||
{.*[\r\n]+\* +([0-9]+) +Thread[^\r\n]* do_something \(n=\1\) at.*}
|
[format {.*[\r\n]+\* +([0-9]+) +%s[^\r\n]* do_something \(n=\1\) at.*} $tdlabel_re]
|
||||||
|
|
||||||
# Check for expected results when passing a valid thread handle to
|
# Check for expected results when passing a valid thread handle to
|
||||||
# thread_from_handle().
|
# thread_from_handle().
|
||||||
|
|
|
@ -84,13 +84,13 @@ proc run_test { target_non_stop disable_feature } {
|
||||||
|
|
||||||
# There should be only one thread listed at this point.
|
# There should be only one thread listed at this point.
|
||||||
gdb_test_multiple "info threads" "" {
|
gdb_test_multiple "info threads" "" {
|
||||||
-re "2 Thread.*$gdb_prompt $" {
|
-re "2 ${tdlabel_re}.*$gdb_prompt $" {
|
||||||
fail $gdb_test_name
|
fail $gdb_test_name
|
||||||
}
|
}
|
||||||
-re "has terminated.*$gdb_prompt $" {
|
-re "has terminated.*$gdb_prompt $" {
|
||||||
fail $gdb_test_name
|
fail $gdb_test_name
|
||||||
}
|
}
|
||||||
-re "\\\* 1\[\t \]*Thread\[^\r\n\]*\r\n$gdb_prompt $" {
|
-re "\\\* 1\[\t \]*${tdlabel_re}\[^\r\n\]*\r\n$gdb_prompt $" {
|
||||||
pass $gdb_test_name
|
pass $gdb_test_name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ proc run_test { target_non_stop disable_feature } {
|
||||||
|
|
||||||
# There should be two threads at this point with thread 1 selected.
|
# There should be two threads at this point with thread 1 selected.
|
||||||
gdb_test "info threads" \
|
gdb_test "info threads" \
|
||||||
"\\\* 1\[\t \]*Thread\[^\r\n\]*\r\n 2\[\t \]*Thread\[^\r\n\]*" \
|
"\\\* 1\[\t \]*${tdlabel_re}\[^\r\n\]*\r\n 2\[\t \]*${tdlabel_re}\[^\r\n\]*" \
|
||||||
"second thread should now exist"
|
"second thread should now exist"
|
||||||
|
|
||||||
# Switch threads.
|
# Switch threads.
|
||||||
|
@ -124,7 +124,7 @@ proc run_test { target_non_stop disable_feature } {
|
||||||
|
|
||||||
# Check that thread 2 is still selected.
|
# Check that thread 2 is still selected.
|
||||||
gdb_test "info threads" \
|
gdb_test "info threads" \
|
||||||
" 1\[\t \]*Thread\[^\r\n\]*\r\n\\\* 2\[\t \]*Thread\[^\r\n\]*" \
|
" 1\[\t \]*${tdlabel_re}\[^\r\n\]*\r\n\\\* 2\[\t \]*${tdlabel_re}\[^\r\n\]*" \
|
||||||
"second thread should still be selected after stepi"
|
"second thread should still be selected after stepi"
|
||||||
|
|
||||||
# Turn scheduler locking off again so that when we continue all
|
# Turn scheduler locking off again so that when we continue all
|
||||||
|
|
|
@ -43,7 +43,7 @@ gdb_test "b [gdb_get_line_number "breakpoint here"]" \
|
||||||
|
|
||||||
gdb_test "continue" ".*breakpoint here.*" "continue to exec"
|
gdb_test "continue" ".*breakpoint here.*" "continue to exec"
|
||||||
|
|
||||||
gdb_test "info threads" "1 *Thread.*2 *Thread.*3 *Thread.*" "info threads before exec"
|
gdb_test "info threads" "1 *${tdlabel_re}.*2 *${tdlabel_re}.*3 *${tdlabel_re}.*" "info threads before exec"
|
||||||
|
|
||||||
# Work around PR25656, where the breakpoint above sets 2 breakpoint locations:
|
# Work around PR25656, where the breakpoint above sets 2 breakpoint locations:
|
||||||
# - one on gdb.threads/execl.c:$linenumber, and
|
# - one on gdb.threads/execl.c:$linenumber, and
|
||||||
|
@ -58,11 +58,11 @@ gdb_test "continue" ".*Breakpoint 1, main.*" \
|
||||||
"continue across exec"
|
"continue across exec"
|
||||||
|
|
||||||
gdb_test_multiple "info threads" "info threads after exec" {
|
gdb_test_multiple "info threads" "info threads after exec" {
|
||||||
-re "2 *Thread .*$gdb_prompt $" {
|
-re "2 *${tdlabel_re} .*$gdb_prompt $" {
|
||||||
# Old threads left behind.
|
# Old threads left behind.
|
||||||
fail "$gdb_test_name"
|
fail "$gdb_test_name"
|
||||||
}
|
}
|
||||||
-re "4 *Thread .*$gdb_prompt $" {
|
-re "4 *${tdlabel_re} .*$gdb_prompt $" {
|
||||||
# New threads registered.
|
# New threads registered.
|
||||||
fail "$gdb_test_name"
|
fail "$gdb_test_name"
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,4 +44,4 @@ gdb_test "continue" "Breakpoint 2, start.*" "get to the spawned thread"
|
||||||
# * 3 Thread 0x40a00950 (LWP 5553) start (arg=0x0) at ../.././gdb/testsuite/gdb.threads/fork-child-threads.c:28
|
# * 3 Thread 0x40a00950 (LWP 5553) start (arg=0x0) at ../.././gdb/testsuite/gdb.threads/fork-child-threads.c:28
|
||||||
# 2 Thread 0x2aaaaaac3000 (LWP 5552) 0x00000031674076dd in pthread_join (threadid=<optimized out>, thread_return=<optimized out>) at pthread_join.c:89
|
# 2 Thread 0x2aaaaaac3000 (LWP 5552) 0x00000031674076dd in pthread_join (threadid=<optimized out>, thread_return=<optimized out>) at pthread_join.c:89
|
||||||
|
|
||||||
gdb_test "info threads" " Thread .* Thread .*" "two threads found"
|
gdb_test "info threads" " ${tdlabel_re} .* ${tdlabel_re} .*" "two threads found"
|
||||||
|
|
|
@ -37,7 +37,7 @@ gdb_breakpoint "start" "" "1, set breakpoint at start"
|
||||||
|
|
||||||
gdb_test "continue" "Catchpoint.*" "1, get to the fork event"
|
gdb_test "continue" "Catchpoint.*" "1, get to the fork event"
|
||||||
|
|
||||||
gdb_test "info threads" " Thread .* Thread .* Thread .* Thread .*" "1, multiple threads found"
|
gdb_test "info threads" " ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .*" "1, multiple threads found"
|
||||||
|
|
||||||
gdb_test "thread 1" ".*" "1, switched away from event thread"
|
gdb_test "thread 1" ".*" "1, switched away from event thread"
|
||||||
|
|
||||||
|
@ -45,10 +45,10 @@ gdb_test "continue" "Not resuming.*" "1, refused to resume"
|
||||||
|
|
||||||
set test "1, followed to the child, found one thread"
|
set test "1, followed to the child, found one thread"
|
||||||
gdb_test_multiple "info threads" "metest" {
|
gdb_test_multiple "info threads" "metest" {
|
||||||
-re " Thread .* Thread .*$gdb_prompt $" {
|
-re " ${tdlabel_re} .* ${tdlabel_re} .*$gdb_prompt $" {
|
||||||
fail "$test"
|
fail "$test"
|
||||||
}
|
}
|
||||||
-re " Thread .*$gdb_prompt $" {
|
-re " ${tdlabel_re} .*$gdb_prompt $" {
|
||||||
pass "$test"
|
pass "$test"
|
||||||
}
|
}
|
||||||
-re "$gdb_prompt $" {
|
-re "$gdb_prompt $" {
|
||||||
|
@ -63,10 +63,10 @@ gdb_test "continue" "Breakpoint 3, start.*" "1, get to the spawned thread in for
|
||||||
|
|
||||||
set test "1, followed to the child, found two threads"
|
set test "1, followed to the child, found two threads"
|
||||||
gdb_test_multiple "info threads" "$test" {
|
gdb_test_multiple "info threads" "$test" {
|
||||||
-re " Thread .* Thread .* Thread .*$gdb_prompt $" {
|
-re " ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .*$gdb_prompt $" {
|
||||||
fail "$test"
|
fail "$test"
|
||||||
}
|
}
|
||||||
-re " Thread .* Thread .*$gdb_prompt $" {
|
-re " ${tdlabel_re} .* ${tdlabel_re} .*$gdb_prompt $" {
|
||||||
pass "$test"
|
pass "$test"
|
||||||
}
|
}
|
||||||
-re "$gdb_prompt $" {
|
-re "$gdb_prompt $" {
|
||||||
|
@ -90,16 +90,16 @@ gdb_breakpoint "start"
|
||||||
|
|
||||||
gdb_test "continue" "Catchpoint.*" "2, get to the fork event"
|
gdb_test "continue" "Catchpoint.*" "2, get to the fork event"
|
||||||
|
|
||||||
gdb_test "info threads" " Thread .* Thread .* Thread .* Thread .*" "2, multiple threads found"
|
gdb_test "info threads" " ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .*" "2, multiple threads found"
|
||||||
|
|
||||||
gdb_test "continue" "Breakpoint 3, start.*" "2, get to the spawned thread in fork child"
|
gdb_test "continue" "Breakpoint 3, start.*" "2, get to the spawned thread in fork child"
|
||||||
|
|
||||||
set test "2, followed to the child, found two threads"
|
set test "2, followed to the child, found two threads"
|
||||||
gdb_test_multiple "info threads" "$test" {
|
gdb_test_multiple "info threads" "$test" {
|
||||||
-re " Thread .* Thread .* Thread .*$gdb_prompt $" {
|
-re " ${tdlabel_re} .* ${tdlabel_re} .* ${tdlabel_re} .*$gdb_prompt $" {
|
||||||
fail "$test"
|
fail "$test"
|
||||||
}
|
}
|
||||||
-re " Thread .* Thread .*$gdb_prompt $" {
|
-re " ${tdlabel_re} .* ${tdlabel_re} .*$gdb_prompt $" {
|
||||||
pass "$test"
|
pass "$test"
|
||||||
}
|
}
|
||||||
-re "$gdb_prompt $" {
|
-re "$gdb_prompt $" {
|
||||||
|
|
|
@ -43,8 +43,8 @@ gdb_test "list $line" \
|
||||||
gdb_test "info threads" \
|
gdb_test "info threads" \
|
||||||
[multi_line \
|
[multi_line \
|
||||||
"\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*" \
|
"\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*" \
|
||||||
" 1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
|
" 1 *${tdlabel_re} \[^\r\n\]* .* \[^\r\n\]*" \
|
||||||
"\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*"] \
|
"\\* 2 *${tdlabel_re} \[^\r\n\]* at \[^\r\n\]*"] \
|
||||||
"info threads before break"
|
"info threads before break"
|
||||||
|
|
||||||
# Check that "break" is still operating on the same file by default.
|
# Check that "break" is still operating on the same file by default.
|
||||||
|
@ -53,8 +53,8 @@ gdb_test "break $line" ".*${srcfile2}.*" "break on line"
|
||||||
gdb_test "info threads" \
|
gdb_test "info threads" \
|
||||||
[multi_line \
|
[multi_line \
|
||||||
"\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*" \
|
"\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*" \
|
||||||
" 1 *Thread \[^\r\n\]* .* \[^\r\n\]*" \
|
" 1 *${tdlabel_re} \[^\r\n\]* .* \[^\r\n\]*" \
|
||||||
"\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*"] \
|
"\\* 2 *${tdlabel_re} \[^\r\n\]* at \[^\r\n\]*"] \
|
||||||
"info threads before list"
|
"info threads before list"
|
||||||
|
|
||||||
# And that so is "list".
|
# And that so is "list".
|
||||||
|
|
|
@ -74,6 +74,7 @@ proc test_one_iteration {} {
|
||||||
global gdb_prompt
|
global gdb_prompt
|
||||||
global NUM_THREADS
|
global NUM_THREADS
|
||||||
global decimal
|
global decimal
|
||||||
|
global tdlabel_re
|
||||||
|
|
||||||
set saw_continuing 0
|
set saw_continuing 0
|
||||||
set test "continue -a &"
|
set test "continue -a &"
|
||||||
|
@ -145,7 +146,7 @@ proc test_one_iteration {} {
|
||||||
set running_count 0
|
set running_count 0
|
||||||
set test "all threads are stopped"
|
set test "all threads are stopped"
|
||||||
return_if_nonzero [gdb_test_multiple "info threads" $test {
|
return_if_nonzero [gdb_test_multiple "info threads" $test {
|
||||||
-re "Thread \[^\r\n\]* \\(running\\)" {
|
-re "${tdlabel_re} \[^\r\n\]* \\(running\\)" {
|
||||||
incr running_count
|
incr running_count
|
||||||
exp_continue
|
exp_continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ gdb_breakpoint [gdb_get_line_number "break-here"]
|
||||||
gdb_continue_to_breakpoint "break-here" ".* break-here .*"
|
gdb_continue_to_breakpoint "break-here" ".* break-here .*"
|
||||||
|
|
||||||
gdb_test "info threads" \
|
gdb_test "info threads" \
|
||||||
"\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*" \
|
"\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *${tdlabel_re} \[^\r\n\]* at \[^\r\n\]*" \
|
||||||
"single thread has been left"
|
"single thread has been left"
|
||||||
|
|
||||||
# Test that ctrl-c works even if the leader has exited.
|
# Test that ctrl-c works even if the leader has exited.
|
||||||
|
|
|
@ -112,7 +112,7 @@ interrupt_and_wait "stop threads 1"
|
||||||
set cmd "info threads"
|
set cmd "info threads"
|
||||||
set ok 0
|
set ok 0
|
||||||
gdb_test_multiple $cmd $cmd {
|
gdb_test_multiple $cmd $cmd {
|
||||||
-re " 1 *Thread " {
|
-re " 1 *${tdlabel_re} " {
|
||||||
set ok 1
|
set ok 1
|
||||||
exp_continue
|
exp_continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ gdb_test "continue" \
|
||||||
"continue stops when thread 2 exits"
|
"continue stops when thread 2 exits"
|
||||||
|
|
||||||
gdb_test "info threads" \
|
gdb_test "info threads" \
|
||||||
"\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n *1 *Thread \[^\r\n\]* \[^\r\n\]*\[\r\n\]*The current thread <Thread ID 2> has terminated.*" \
|
"\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n *1 *${tdlabel_re} \[^\r\n\]* \[^\r\n\]*\[\r\n\]*The current thread <Thread ID 2> has terminated.*" \
|
||||||
"only main thread left, thread 2 terminated"
|
"only main thread left, thread 2 terminated"
|
||||||
|
|
||||||
# Select the main thread, let the third thread start, and stop at the
|
# Select the main thread, let the third thread start, and stop at the
|
||||||
|
@ -63,7 +63,7 @@ gdb_test "continue" \
|
||||||
"continue stops when the main thread exits"
|
"continue stops when the main thread exits"
|
||||||
|
|
||||||
gdb_test "info threads" \
|
gdb_test "info threads" \
|
||||||
"\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n *3 *Thread \[^\r\n\]* \[^\r\n\]*\[\r\n\]*The current thread <Thread ID 1> has terminated.*" \
|
"\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n *3 *${tdlabel_re} \[^\r\n\]* \[^\r\n\]*\[\r\n\]*The current thread <Thread ID 1> has terminated.*" \
|
||||||
"only thread 3 left, main thread terminated"
|
"only thread 3 left, main thread terminated"
|
||||||
|
|
||||||
# Make sure thread apply all works when we have exited threads in the
|
# Make sure thread apply all works when we have exited threads in the
|
||||||
|
|
|
@ -26,6 +26,7 @@ if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executab
|
||||||
|
|
||||||
proc do_test { lock_sched nonstop } {
|
proc do_test { lock_sched nonstop } {
|
||||||
global executable
|
global executable
|
||||||
|
global tdlabel_re
|
||||||
|
|
||||||
save_vars { GDBFLAGS } {
|
save_vars { GDBFLAGS } {
|
||||||
append GDBFLAGS " -ex \"set non-stop $nonstop\""
|
append GDBFLAGS " -ex \"set non-stop $nonstop\""
|
||||||
|
@ -44,7 +45,7 @@ proc do_test { lock_sched nonstop } {
|
||||||
}
|
}
|
||||||
|
|
||||||
gdb_test "info threads" \
|
gdb_test "info threads" \
|
||||||
"\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*" \
|
"\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *${tdlabel_re} \[^\r\n\]* at \[^\r\n\]*" \
|
||||||
"single thread left"
|
"single thread left"
|
||||||
|
|
||||||
# Also test with sched-lock to make sure we can follow the
|
# Also test with sched-lock to make sure we can follow the
|
||||||
|
|
|
@ -123,11 +123,12 @@ proc test_startup {} {
|
||||||
global srcdir srcfile gdb_prompt expect_out
|
global srcdir srcfile gdb_prompt expect_out
|
||||||
global horiz
|
global horiz
|
||||||
global main_id thread1_id thread2_id
|
global main_id thread1_id thread2_id
|
||||||
|
global tdlabel_re
|
||||||
|
|
||||||
# We should be able to do an info threads before starting any others.
|
# We should be able to do an info threads before starting any others.
|
||||||
set return_me 1
|
set return_me 1
|
||||||
gdb_test_multiple "info threads" "info threads" {
|
gdb_test_multiple "info threads" "info threads" {
|
||||||
-re ".*Thread.*main.*$gdb_prompt $" {
|
-re ".*${tdlabel_re}.*main.*$gdb_prompt $" {
|
||||||
pass "info threads"
|
pass "info threads"
|
||||||
set return_me 0
|
set return_me 0
|
||||||
}
|
}
|
||||||
|
@ -142,7 +143,7 @@ proc test_startup {} {
|
||||||
|
|
||||||
# Extract the thread id number of main thread from "info threads" output.
|
# Extract the thread id number of main thread from "info threads" output.
|
||||||
gdb_test_multiple "info threads" "get main thread id" {
|
gdb_test_multiple "info threads" "get main thread id" {
|
||||||
-re "(\[0-9\]+)(${horiz}Thread${horiz}main.*)($gdb_prompt $)" {
|
-re "(\[0-9\]+)(${horiz}${tdlabel_re}${horiz}main.*)($gdb_prompt $)" {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +158,7 @@ proc test_startup {} {
|
||||||
|
|
||||||
# Extract the thread id number of thread 1 from "info threads" output.
|
# Extract the thread id number of thread 1 from "info threads" output.
|
||||||
gdb_test_multiple "info threads" "get thread 1 id" {
|
gdb_test_multiple "info threads" "get thread 1 id" {
|
||||||
-re "(\[0-9\]+)(${horiz}Thread${horiz}thread1.*)($gdb_prompt $)" {
|
-re "(\[0-9\]+)(${horiz}${tdlabel_re}${horiz}thread1.*)($gdb_prompt $)" {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,7 +173,7 @@ proc test_startup {} {
|
||||||
|
|
||||||
# Extract the thread id number of thread 2 from "info threads" output.
|
# Extract the thread id number of thread 2 from "info threads" output.
|
||||||
gdb_test_multiple "info threads" "get thread 2 id" {
|
gdb_test_multiple "info threads" "get thread 2 id" {
|
||||||
-re "(\[0-9\]+)(${horiz}Thread${horiz}thread2.*)($gdb_prompt $)" {
|
-re "(\[0-9\]+)(${horiz}${tdlabel_re}${horiz}thread2.*)($gdb_prompt $)" {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
|
||||||
# request a signal be delivered with the "signal" command.
|
# request a signal be delivered with the "signal" command.
|
||||||
|
|
||||||
proc test { step_over } {
|
proc test { step_over } {
|
||||||
global srcfile binfile
|
global srcfile binfile tdlabel_re
|
||||||
|
|
||||||
with_test_prefix "step-over $step_over" {
|
with_test_prefix "step-over $step_over" {
|
||||||
clean_restart ${binfile}
|
clean_restart ${binfile}
|
||||||
|
@ -59,7 +59,7 @@ proc test { step_over } {
|
||||||
|
|
||||||
gdb_test "thread 1" "Switching to thread 1.*"
|
gdb_test "thread 1" "Switching to thread 1.*"
|
||||||
|
|
||||||
set pattern "\\\* 1\[ \t\]+Thread.*"
|
set pattern "\\\* 1\[ \t\]+${tdlabel_re}.*"
|
||||||
|
|
||||||
gdb_test "info threads" $pattern "thread 1 selected"
|
gdb_test "info threads" $pattern "thread 1 selected"
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
|
||||||
# scheduler-locking) of the test to perform.
|
# scheduler-locking) of the test to perform.
|
||||||
|
|
||||||
proc test { schedlock } {
|
proc test { schedlock } {
|
||||||
global srcfile binfile
|
global srcfile binfile tdlabel_re
|
||||||
|
|
||||||
with_test_prefix "schedlock $schedlock" {
|
with_test_prefix "schedlock $schedlock" {
|
||||||
clean_restart ${binfile}
|
clean_restart ${binfile}
|
||||||
|
@ -60,7 +60,7 @@ proc test { schedlock } {
|
||||||
gdb_test "continue" "all_threads_signalled.*" \
|
gdb_test "continue" "all_threads_signalled.*" \
|
||||||
"continue to all_threads signalled"
|
"continue to all_threads signalled"
|
||||||
|
|
||||||
gdb_test "info threads" "\\\* 1\[ \t\]+Thread.*" "thread 1 selected"
|
gdb_test "info threads" "\\\* 1\[ \t\]+${tdlabel_re}.*" "thread 1 selected"
|
||||||
|
|
||||||
# With schedlock still enabled, let each thread report its
|
# With schedlock still enabled, let each thread report its
|
||||||
# signal.
|
# signal.
|
||||||
|
|
|
@ -26,7 +26,7 @@ if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
|
||||||
# with "signal 0" or "continue".
|
# with "signal 0" or "continue".
|
||||||
|
|
||||||
proc test { command } {
|
proc test { command } {
|
||||||
global srcfile binfile
|
global srcfile binfile tdlabel_re
|
||||||
|
|
||||||
with_test_prefix "$command" {
|
with_test_prefix "$command" {
|
||||||
clean_restart ${binfile}
|
clean_restart ${binfile}
|
||||||
|
@ -39,7 +39,7 @@ proc test { command } {
|
||||||
|
|
||||||
gdb_test "continue" "Thread 2 .*received signal SIGUSR1.*" "stop with SIGUSR1"
|
gdb_test "continue" "Thread 2 .*received signal SIGUSR1.*" "stop with SIGUSR1"
|
||||||
|
|
||||||
set pattern "\\\* 2\[ \t\]+Thread.*"
|
set pattern "\\\* 2\[ \t\]+${tdlabel_re}.*"
|
||||||
|
|
||||||
gdb_test "info threads" $pattern "thread 2 intercepted signal"
|
gdb_test "info threads" $pattern "thread 2 intercepted signal"
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ if {[build_executable "failed to prepare" $testfile $srcfile \
|
||||||
# SIGTRAP.
|
# SIGTRAP.
|
||||||
|
|
||||||
proc test { sigtrap_thread } {
|
proc test { sigtrap_thread } {
|
||||||
global srcfile binfile
|
global srcfile binfile tdlabel_re
|
||||||
|
|
||||||
with_test_prefix "sigtrap thread $sigtrap_thread" {
|
with_test_prefix "sigtrap thread $sigtrap_thread" {
|
||||||
clean_restart ${binfile}
|
clean_restart ${binfile}
|
||||||
|
@ -38,7 +38,7 @@ proc test { sigtrap_thread } {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
set pattern "\\\* 2\[ \t\]+Thread.*"
|
set pattern "\\\* 2\[ \t\]+${tdlabel_re}.*"
|
||||||
gdb_test "info threads" $pattern "thread 2 hit breakpoint"
|
gdb_test "info threads" $pattern "thread 2 hit breakpoint"
|
||||||
|
|
||||||
gdb_test "break sigtrap_handler" "Breakpoint .* at .*$srcfile.*"
|
gdb_test "break sigtrap_handler" "Breakpoint .* at .*$srcfile.*"
|
||||||
|
@ -54,7 +54,7 @@ proc test { sigtrap_thread } {
|
||||||
"Continuing with signal SIGTRAP.*Breakpoint .* sigtrap_handler .*" \
|
"Continuing with signal SIGTRAP.*Breakpoint .* sigtrap_handler .*" \
|
||||||
"signal SIGTRAP reaches handler"
|
"signal SIGTRAP reaches handler"
|
||||||
|
|
||||||
set pattern "\\\* $sigtrap_thread\[ \t\]+Thread.*"
|
set pattern "\\\* $sigtrap_thread\[ \t\]+${tdlabel_re}.*"
|
||||||
gdb_test "info threads" $pattern "right thread got the signal"
|
gdb_test "info threads" $pattern "right thread got the signal"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ gdb_test "continue" " .*sem_post .*" "handle $sig helps"
|
||||||
|
|
||||||
set test "info threads"
|
set test "info threads"
|
||||||
gdb_test_multiple "info threads" "$test" {
|
gdb_test_multiple "info threads" "$test" {
|
||||||
-re " Thread .*$gdb_prompt " {
|
-re " ${tdlabel_re} .*$gdb_prompt " {
|
||||||
pass "$test"
|
pass "$test"
|
||||||
}
|
}
|
||||||
-re "$gdb_prompt " {
|
-re "$gdb_prompt " {
|
||||||
|
|
|
@ -29,11 +29,12 @@ if {[gdb_compile_pthreads \
|
||||||
|
|
||||||
proc get_thread_id {func} {
|
proc get_thread_id {func} {
|
||||||
global gdb_prompt
|
global gdb_prompt
|
||||||
|
global tdlabel_re
|
||||||
|
|
||||||
set thre -1
|
set thre -1
|
||||||
set test "get $func thread id"
|
set test "get $func thread id"
|
||||||
gdb_test_multiple "info threads" $test {
|
gdb_test_multiple "info threads" $test {
|
||||||
-re "(\[0-9\]+)\[^\n\r\]*Thread\[^\n\r\]*$func.*$gdb_prompt $" {
|
-re "(\[0-9\]+)\[^\n\r\]*${tdlabel_re}\[^\n\r\]*$func.*$gdb_prompt $" {
|
||||||
# Get the thread's id.
|
# Get the thread's id.
|
||||||
set thre $expect_out(1,string)
|
set thre $expect_out(1,string)
|
||||||
pass $test
|
pass $test
|
||||||
|
|
|
@ -28,6 +28,7 @@ if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executab
|
||||||
proc get_thread_list { } {
|
proc get_thread_list { } {
|
||||||
global gdb_prompt
|
global gdb_prompt
|
||||||
global expect_out
|
global expect_out
|
||||||
|
global tdlabel_re
|
||||||
|
|
||||||
set thr_list ""
|
set thr_list ""
|
||||||
|
|
||||||
|
@ -41,11 +42,11 @@ proc get_thread_list { } {
|
||||||
-re "^ *Id *Target Id\[^\n\]*\n" {
|
-re "^ *Id *Target Id\[^\n\]*\n" {
|
||||||
exp_continue
|
exp_continue
|
||||||
}
|
}
|
||||||
-re "^\\* *(\[0-9\]*) *Thread \[^\n\]*main\[^\n\]*\n" {
|
-re "^\\* *(\[0-9\]*) *${tdlabel_re} \[^\n\]*main\[^\n\]*\n" {
|
||||||
set thr_list "$expect_out(1,string) $thr_list"
|
set thr_list "$expect_out(1,string) $thr_list"
|
||||||
exp_continue
|
exp_continue
|
||||||
}
|
}
|
||||||
-re "^ *(\[0-9\]*) *Thread \[^\n\]*\n" {
|
-re "^ *(\[0-9\]*) *${tdlabel_re} \[^\n\]*\n" {
|
||||||
lappend thr_list $expect_out(1,string)
|
lappend thr_list $expect_out(1,string)
|
||||||
exp_continue
|
exp_continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -207,19 +207,19 @@ gdb_expect {
|
||||||
timeout { fail "continue to first thread (timeout)" }
|
timeout { fail "continue to first thread (timeout)" }
|
||||||
}
|
}
|
||||||
|
|
||||||
gdb_test "info thread" ".*Thread.*spin.*" \
|
gdb_test "info thread" ".*${tdlabel_re}.*spin.*" \
|
||||||
"at least one th in spin while stopped at first th"
|
"at least one th in spin while stopped at first th"
|
||||||
|
|
||||||
check_thread_local "first"
|
check_thread_local "first"
|
||||||
|
|
||||||
gdb_test "continue" ".*Breakpoint 2.*tls value.*" "continue to second thread"
|
gdb_test "continue" ".*Breakpoint 2.*tls value.*" "continue to second thread"
|
||||||
gdb_test "info thread" "Thread.*spin.*" \
|
gdb_test "info thread" "${tdlabel_re}.*spin.*" \
|
||||||
"at least one th in spin while stopped at second th"
|
"at least one th in spin while stopped at second th"
|
||||||
|
|
||||||
check_thread_local "second"
|
check_thread_local "second"
|
||||||
|
|
||||||
gdb_test "continue" ".*Breakpoint 2.*tls value.*" "continue to third thread"
|
gdb_test "continue" ".*Breakpoint 2.*tls value.*" "continue to third thread"
|
||||||
gdb_test "info thread" ".*Thread.*spin.*" \
|
gdb_test "info thread" ".*${tdlabel_re}.*spin.*" \
|
||||||
"at least one th in spin while stopped at third th"
|
"at least one th in spin while stopped at third th"
|
||||||
|
|
||||||
check_thread_local "third"
|
check_thread_local "third"
|
||||||
|
@ -229,7 +229,7 @@ gdb_test "continue" ".*Breakpoint 3.*still alive.*" "continue to synch point"
|
||||||
set no_of_threads 0
|
set no_of_threads 0
|
||||||
send_gdb "info thread\n"
|
send_gdb "info thread\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re "^info thread\[ \t\r\n\]+ *Id .*Frame\[ \t\r\n\]+.*(\[0-9\]+) *Thread\[^\r\n\]+\r\n$gdb_prompt $" {
|
-re "^info thread\[ \t\r\n\]+ *Id .*Frame\[ \t\r\n\]+.*(\[0-9\]+) *${tdlabel_re}\[^\r\n\]+\r\n$gdb_prompt $" {
|
||||||
set no_of_threads $expect_out(1,string)
|
set no_of_threads $expect_out(1,string)
|
||||||
pass "get number of threads"
|
pass "get number of threads"
|
||||||
}
|
}
|
||||||
|
@ -280,10 +280,10 @@ gdb_test "continue" ".*Breakpoint 4.*before exit.*" "threads exited"
|
||||||
|
|
||||||
send_gdb "info thread\n"
|
send_gdb "info thread\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re ".* 1 *Thread.*2 *Thread.*$gdb_prompt $" {
|
-re ".* 1 *${tdlabel_re}.*2 *${tdlabel_re}.*$gdb_prompt $" {
|
||||||
fail "too many threads left at end"
|
fail "too many threads left at end"
|
||||||
}
|
}
|
||||||
-re ".*\\\* 1 *Thread.*main.*$gdb_prompt $" {
|
-re ".*\\\* 1 *${tdlabel_re}.*main.*$gdb_prompt $" {
|
||||||
pass "expect only base thread at end"
|
pass "expect only base thread at end"
|
||||||
}
|
}
|
||||||
-re ".*No stack.*$gdb_prompt $" {
|
-re ".*No stack.*$gdb_prompt $" {
|
||||||
|
|
|
@ -380,7 +380,7 @@ proc use_collected_data { data_source } {
|
||||||
|
|
||||||
# There is always a thread of an inferior, either a live one or
|
# There is always a thread of an inferior, either a live one or
|
||||||
# a faked one.
|
# a faked one.
|
||||||
gdb_test "info threads" "\\* ${decimal} (process|Thread) \[0-9\.\]+\[ \t\].*"
|
gdb_test "info threads" "\\* ${decimal} ${tdlabel_re} \[0-9\.\]+\[ \t\].*"
|
||||||
gdb_test "info inferiors" "\\* 1 process ${decimal} \[ \t\]+\[^\r\n\]*\[ \t\]+${binfile}.*"
|
gdb_test "info inferiors" "\\* 1 process ${decimal} \[ \t\]+\[^\r\n\]*\[ \t\]+${binfile}.*"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,7 +139,7 @@ proc strace_info_marker { } {
|
||||||
# List all the thread. It is expected to get three threads without
|
# List all the thread. It is expected to get three threads without
|
||||||
# any errors.
|
# any errors.
|
||||||
gdb_test_multiple "info threads 3 2 1" "info threads" {
|
gdb_test_multiple "info threads 3 2 1" "info threads" {
|
||||||
-re "3\[ \t\]+Thread .*2\[ \t\]+Thread .*1\[ \t\]+Thread .*${gdb_prompt} $" {
|
-re "3\[ \t\]+${tdlabel_re} .*2\[ \t\]+${tdlabel_re} .*1\[ \t\]+${tdlabel_re} .*${gdb_prompt} $" {
|
||||||
pass "info threads"
|
pass "info threads"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -289,6 +289,10 @@ set octal "\[0-7\]+"
|
||||||
|
|
||||||
set inferior_exited_re "(?:\\\[Inferior \[0-9\]+ \\(\[^\n\r\]*\\) exited)"
|
set inferior_exited_re "(?:\\\[Inferior \[0-9\]+ \\(\[^\n\r\]*\\) exited)"
|
||||||
|
|
||||||
|
# A regular expression that matches the first word of a thread
|
||||||
|
# description after the thread number info 'info threads'
|
||||||
|
set tdlabel_re "(process|Thread|LWP)"
|
||||||
|
|
||||||
# A regular expression that matches a value history number.
|
# A regular expression that matches a value history number.
|
||||||
# E.g., $1, $2, etc.
|
# E.g., $1, $2, etc.
|
||||||
set valnum_re "\\\$$decimal"
|
set valnum_re "\\\$$decimal"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue