From 5fd69d0ab2c42d2be0781bf3a5d60e1d5b8d05dc Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 13 Apr 2017 16:15:34 +0100 Subject: [PATCH] Improve coverage of the PR threads/13217 regression test - Make sure we end up with no thread selected after the detach. - Test both "thread apply all" and "thread apply $some_threads", for completeness. gdb/ChangeLog: 2017-04-13 Pedro Alves PR threads/13217 * gdb.threads/threadapply.exp (thr_apply_detach): New procedure. (top level): Call it twice, with different thread sets. --- gdb/ChangeLog | 6 ++++++ gdb/testsuite/gdb.threads/threadapply.exp | 31 ++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7b28fa2..66a2a14 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2017-04-13 Pedro Alves + PR threads/13217 + * gdb.threads/threadapply.exp (thr_apply_detach): New procedure. + (top level): Call it twice, with different thread sets. + +2017-04-13 Pedro Alves + * thread.c: Include . (thread_array_cleanup): Delete. (scoped_inc_dec_ref): New class. diff --git a/gdb/testsuite/gdb.threads/threadapply.exp b/gdb/testsuite/gdb.threads/threadapply.exp index 789b283..959e8b9 100644 --- a/gdb/testsuite/gdb.threads/threadapply.exp +++ b/gdb/testsuite/gdb.threads/threadapply.exp @@ -63,4 +63,33 @@ gdb_test "step" "thread_function.*" "step to the thread_function" gdb_test "up" ".*in main.*" "go up in the stack frame" gdb_test "thread apply all print 1" "Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1" "run a simple print command on all threads" gdb_test "down" "#0.*thread_function.*" "go down and check selected frame" -gdb_test "thread apply all detach" "Thread .*" + +# Make sure that GDB doesn't crash when the previously selected thread +# exits due to the command run via thread apply. Regression test for +# PR threads/13217. + +proc thr_apply_detach {thread_set} { + with_test_prefix "thread apply $thread_set" { + global binfile + global break_line + + clean_restart ${binfile} + + if ![runto_main] { + fail "can't run to main" + return -1 + } + + gdb_breakpoint "$break_line" + gdb_continue_to_breakpoint "all threads started" + + gdb_test "thread apply $thread_set detach" "Thread .*" + gdb_test "thread" "No thread selected" "switched to no thread selected" + } +} + +# Test both "all" and a thread list, because those are implemented as +# different commands in GDB. +foreach thread_set {"all" "1.1 1.2 1.3"} { + thr_apply_detach $thread_set +} -- 2.7.4