aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.multi
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2016-01-15 21:46:22 +0000
committerPedro Alves <palves@redhat.com>2016-01-15 21:46:22 +0000
commit3f5b7598805c8253c43c989a540a2408c8b685ad (patch)
tree74f71dc4893338da7d523e24e80a635aa48ce2cc /gdb/testsuite/gdb.multi
parent9c03a84f6cc54af01d4fe655f6e0a0aa13d8ef74 (diff)
downloadgdb-3f5b7598805c8253c43c989a540a2408c8b685ad.zip
gdb-3f5b7598805c8253c43c989a540a2408c8b685ad.tar.gz
gdb-3f5b7598805c8253c43c989a540a2408c8b685ad.tar.bz2
Fix "thread apply $conv_var" and misc other related problems
This fixes a few bugs in "thread apply". While this works: (gdb) thread apply 1 p 1234 Thread 1 (Thread 0x7ffff7fc1740 (LWP 14048)): $1 = 1234 This doesn't: (gdb) thread apply $thr p 1234 Thread 1 (Thread 0x7ffff7fc1740 (LWP 12039)): Invalid thread ID: p 1234 (gdb) ~~~~ Also, while this works: (gdb) thread apply 1 Please specify a command following the thread ID list This doesn't: (gdb) thread apply $thr Thread 1 (Thread 0x7ffff7fc1740 (LWP 12039)): [Current thread is 1 (Thread 0x7ffff7fc1740 (LWP 12039))] (gdb) ~~~~ And, while this works: (gdb) thread apply Please specify a thread ID list This obviously bogus invocation is just silent: (gdb) thread apply bt (gdb) gdb/ChangeLog: 2016-01-15 Pedro Alves <palves@redhat.com> * thread.c (thread_apply_command): Use the tid range parser to advance past the thread ID list. * tid-parse.c (get_positive_number_trailer): New function. (parse_thread_id): Use it. (get_tid_or_range): Use it. Return 0 instead of throwing invalid thread ID error. (get_tid_or_range): Detect negative values. Return 0 instead of throwing invalid thread ID error. gdb/testsuite/ChangeLog: 2016-01-15 Pedro Alves <palves@redhat.com> * gdb.multi/tids.exp (thr_apply_info_thr_error): Remove "p 1234" command from "thread apply" invocation. (thr_apply_info_thr_invalid): Default the expected output to the input tid list. (top level): Add tests that use convenience variables. Add tests for "thread apply" with a valid TID list, but missing the command.
Diffstat (limited to 'gdb/testsuite/gdb.multi')
-rw-r--r--gdb/testsuite/gdb.multi/tids.exp112
1 files changed, 99 insertions, 13 deletions
diff --git a/gdb/testsuite/gdb.multi/tids.exp b/gdb/testsuite/gdb.multi/tids.exp
index b72695d..5763234 100644
--- a/gdb/testsuite/gdb.multi/tids.exp
+++ b/gdb/testsuite/gdb.multi/tids.exp
@@ -90,15 +90,19 @@ proc thr_apply_info_thr_error {tid_list exp_error} {
gdb_test "info threads $tid_list" \
$exp_error
- gdb_test "thread apply $tid_list p 1234" \
+ gdb_test "thread apply $tid_list" \
$exp_error \
"thread apply $tid_list"
}
# Issue both "info threads TID_LIST" and "thread apply TID_LIST" and
# expect the command to error out with "Invalid thread ID: $EXPECTED".
-# EXPECTED is a literal string, not a regexp.
-proc thr_apply_info_thr_invalid {tid_list expected} {
+# EXPECTED is a literal string, not a regexp. If EXPECTED is omitted,
+# TID_LIST is expected instead.
+proc thr_apply_info_thr_invalid {tid_list {expected ""}} {
+ if {$expected == ""} {
+ set expected $tid_list
+ }
set expected [string_to_regexp $expected]
gdb_test "info threads $tid_list" \
"Invalid thread ID: $expected"
@@ -183,6 +187,12 @@ with_test_prefix "two inferiors" {
gdb_continue_to_breakpoint "twice"
}
+ thr_apply_info_thr "1" \
+ "1.1"
+
+ thr_apply_info_thr "1.1" \
+ "1.1"
+
thr_apply_info_thr "1 2 3" \
"1.1 1.2 1.3"
@@ -214,6 +224,59 @@ with_test_prefix "two inferiors" {
thr_apply_info_thr "1.1-2 2.2-3" \
"1.1 1.2 2.2 2.3"
+ # Now test using GDB convenience variables.
+
+ gdb_test "p \$inf = 1" " = 1"
+ gdb_test "p \$thr_start = 2" " = 2"
+ gdb_test "p \$thr_end = 3" " = 3"
+
+ # Convenience variable for the inferior number, only.
+ thr_apply_info_thr "\$inf.2" \
+ "1.2"
+ thr_apply_info_thr "\$inf.2-3" \
+ "1.2 1.3"
+
+ # Convenience variables for thread numbers as well.
+ foreach prefix {"" "1." "\$inf."} {
+ thr_apply_info_thr "${prefix}\$thr_start" \
+ "1.2"
+ thr_apply_info_thr "${prefix}\$thr_start-\$thr_end" \
+ "1.2 1.3"
+ thr_apply_info_thr "${prefix}2-\$thr_end" \
+ "1.2 1.3"
+ thr_apply_info_thr "${prefix}\$thr_start-3" \
+ "1.2 1.3"
+
+ # Undefined convenience variable.
+ set prefix_re [string_to_regexp $prefix]
+ thr_apply_info_thr_error "${prefix}\$conv123" \
+ [multi_line \
+ "Convenience variable must have integer value\." \
+ "Invalid thread ID: ${prefix_re}\\\$conv123"]
+ }
+
+ # Convenience variables pointing at an inexisting thread and/or
+ # inferior.
+ gdb_test "p \$inf = 30" " = 30"
+ gdb_test "p \$thr = 20" " = 20"
+ # Try both the convenience variable and the literal number.
+ foreach thr {"\$thr" "20" "1.20" "\$inf.1" "30.1" } {
+ set expected [string_to_regexp $thr]
+ gdb_test "info threads $thr" "No threads match '${expected}'."
+ # "info threads" works like a filter. If there's any other
+ # valid thread in the list, there's no error.
+ info_threads "$thr 1.1" "1.1"
+ info_threads "1.1 $thr" "1.1"
+ }
+
+ gdb_test "thread apply \$thr p 1234" \
+ "warning: Unknown thread 1.20" \
+ "thread apply \$thr"
+
+ gdb_test "thread apply \$inf.1 p 1234" \
+ "warning: Unknown thread 30.1" \
+ "thread apply \$inf.1"
+
# Now test a set of invalid thread IDs/ranges.
thr_apply_info_thr_invalid "1." \
@@ -234,17 +297,40 @@ with_test_prefix "two inferiors" {
thr_apply_info_thr_invalid "1-2.1" \
"1-2.1"
- thr_apply_info_thr_error "1-0" "inverted range"
- thr_apply_info_thr_error "1.1-0" "inverted range"
-
- thr_apply_info_thr_error "1-" "inverted range"
- thr_apply_info_thr_error "1.1-" "inverted range"
-
- thr_apply_info_thr_error "2-1" "inverted range"
- thr_apply_info_thr_error "1.2-1" "inverted range"
+ gdb_test "p \$zero = 0" " = 0"
+ gdb_test "p \$one = 1" " = 1"
+ gdb_test "p \$minus_one = -11" " = -11"
+ foreach prefix {"" "1." "$one."} {
+ set prefix_re [string_to_regexp $prefix]
+
+ thr_apply_info_thr_invalid "${prefix}foo"
+ thr_apply_info_thr_invalid "${prefix}1foo"
+ thr_apply_info_thr_invalid "${prefix}foo1"
+
+ thr_apply_info_thr_error "${prefix}1-0" "inverted range"
+ thr_apply_info_thr_error "${prefix}1-\$zero" "inverted range"
+ thr_apply_info_thr_error "${prefix}\$one-0" "inverted range"
+ thr_apply_info_thr_error "${prefix}\$one-\$zero" "inverted range"
+ thr_apply_info_thr_error "${prefix}1-" "inverted range"
+ thr_apply_info_thr_error "${prefix}2-1" "inverted range"
+ thr_apply_info_thr_error "${prefix}2-\$one" "inverted range"
+ thr_apply_info_thr_error "${prefix}-1" "negative value"
+ thr_apply_info_thr_error "${prefix}-\$one" "negative value"
+ thr_apply_info_thr_error "${prefix}\$minus_one" \
+ "negative value: ${prefix_re}\\\$minus_one"
+ }
- thr_apply_info_thr_error "-1" "negative value"
- thr_apply_info_thr_error "1.-1" "negative value"
+ # Check that a valid thread ID list with a missing command errors
+ # out.
+ with_test_prefix "missing command" {
+ set output "Please specify a command following the thread ID list"
+ gdb_test "thread apply 1" $output
+ gdb_test "thread apply 1.1" $output
+ gdb_test "thread apply 1.1 1.2" $output
+ gdb_test "thread apply 1-2" $output
+ gdb_test "thread apply 1.1-2" $output
+ gdb_test "thread apply $thr" $output
+ }
# Check that we do parse the inferior number and don't confuse it.
gdb_test "info threads 3.1" \