aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/target.c5
-rw-r--r--gdb/testsuite/gdb.threads/detach-step-over.exp52
2 files changed, 57 insertions, 0 deletions
diff --git a/gdb/target.c b/gdb/target.c
index 1ee051b..0c86b57 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -2558,6 +2558,9 @@ target_preopen (int from_tty)
void
target_detach (inferior *inf, int from_tty)
{
+ /* Thread's don't need to be resumed until the end of this function. */
+ scoped_disable_commit_resumed disable_commit_resumed ("detaching");
+
/* After we have detached, we will clear the register cache for this inferior
by calling registers_changed_ptid. We must save the pid_ptid before
detaching, as the target detach method will clear inf->pid. */
@@ -2588,6 +2591,8 @@ target_detach (inferior *inf, int from_tty)
inferior_ptid matches save_pid_ptid, but in our case, it does not
call it, as inferior_ptid has been reset. */
reinit_frame_cache ();
+
+ disable_commit_resumed.reset_and_commit ();
}
void
diff --git a/gdb/testsuite/gdb.threads/detach-step-over.exp b/gdb/testsuite/gdb.threads/detach-step-over.exp
index ad9b08f..d2cb524 100644
--- a/gdb/testsuite/gdb.threads/detach-step-over.exp
+++ b/gdb/testsuite/gdb.threads/detach-step-over.exp
@@ -284,6 +284,56 @@ proc_with_prefix test_detach_command {condition_eval target_non_stop non_stop di
kill_wait_spawned_process $test_spawn_id
}
+# Similar to the proc above, but this time, instead of detaching using
+# the 'detach' command, we quit GDB, this will also trigger a detach, but
+# through a slightly different path, which can expose different bugs.
+proc_with_prefix test_detach_quit {condition_eval target_non_stop \
+ non_stop displaced} {
+ # If debugging with target remote, check whether the all-stop variant
+ # of the RSP is being used. If so, we can't run the background tests.
+ if {!$non_stop
+ && [target_info exists gdb_protocol]
+ && ([target_info gdb_protocol] == "remote"
+ || [target_info gdb_protocol] == "extended-remote")} {
+ start_gdb_for_test $condition_eval $target_non_stop \
+ $non_stop $displaced
+
+ gdb_test_multiple "maint show target-non-stop" "" {
+ -wrap -re "(is|currently) on.*" {
+ }
+ -wrap -re "(is|currently) off.*" {
+ return
+ }
+ }
+ }
+
+ set test_spawn_id [spawn_wait_for_attach $::binfile]
+ set testpid [spawn_id_get_pid $test_spawn_id]
+
+ set attempts 3
+ for {set attempt 1} { $attempt <= $attempts } { incr attempt } {
+ with_test_prefix "iter $attempt" {
+
+ start_gdb_for_test $condition_eval $target_non_stop \
+ $non_stop $displaced
+
+ if {![prepare_test_iter $testpid $non_stop \
+ $attempt $attempts "$::decimal"]} {
+ kill_wait_spawned_process $test_spawn_id
+ return
+ }
+
+ gdb_test_multiple "with confirm off -- quit" "" {
+ eof {
+ pass $gdb_test_name
+ }
+ }
+ }
+ }
+
+ kill_wait_spawned_process $test_spawn_id
+}
+
# The test program exits after a while, in case GDB crashes. Make it
# wait at least as long as we may wait before declaring a time out
# failure.
@@ -331,6 +381,8 @@ foreach_with_prefix breakpoint-condition-evaluation {"host" "target"} {
foreach_with_prefix displaced {"off" "auto"} {
test_detach_command ${breakpoint-condition-evaluation} \
${target-non-stop} ${non-stop} ${displaced}
+ test_detach_quit ${breakpoint-condition-evaluation} \
+ ${target-non-stop} ${non-stop} ${displaced}
}
}
}