aboutsummaryrefslogtreecommitdiff
path: root/gdb/infrun.c
diff options
context:
space:
mode:
authorPedro Alves <pedro@palves.net>2023-11-20 17:49:08 +0000
committerPedro Alves <pedro@palves.net>2023-12-20 21:18:31 +0000
commitd0b591497952db37ed7a5545ced7aad64433f79a (patch)
tree9927c779d5d12603e1b670d57436735cfef059be /gdb/infrun.c
parent4ea7412e53616ecc29d61a95ff8afc284ed9d240 (diff)
downloadbinutils-d0b591497952db37ed7a5545ced7aad64433f79a.zip
binutils-d0b591497952db37ed7a5545ced7aad64433f79a.tar.gz
binutils-d0b591497952db37ed7a5545ced7aad64433f79a.tar.bz2
Ensure selected thread after thread exit stop
While making step over thread exit work properly on AMDGPU, I noticed that if there's a breakpoint on top of the exit syscall, and, displaced stepping is off, then when GDB reports "Command aborted, thread exited.", GDB also switches focus to a random thread, instead of leaving the exited thread as selected: (gdb) thread [Current thread is 6, lane 0 (AMDGPU Lane 1:4:1:1/0 (0,0,0)[0,0,0])] (gdb) si Command aborted, thread exited. (gdb) thread [Current thread is 5 (Thread 0x7ffff626f640 (LWP 3248392))] (gdb) The previous patch extended gdb.threads/step-over-thread-exit.exp to exercise this on GNU/Linux (on the CPU side), and there, after that "si", we always end up with the exiting thread as selected even without this fix, but that's just a concidence, there's a code path that happens to select the exiting thread for an unrelated reason. This commit add the explict switch, fixing the latent problem for GNU/Linux, and the actual problem on AMDGPU. I wrote a gdb.rocm/ testcase for this, but it can't be upstreamed yet, until more pieces of the DWARF machinery are upstream as well. Approved-By: Simon Marchi <simon.marchi@efficios.com> Change-Id: I6ff57a79514ac0142bba35c749fe83d53d9e4e51
Diffstat (limited to 'gdb/infrun.c')
-rw-r--r--gdb/infrun.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 45c1b4a..6dc0a2b 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -5895,7 +5895,14 @@ handle_thread_exited (execution_control_state *ecs)
if (abort_cmd)
{
+ /* We're stopping for the thread exit event. Switch to the
+ event thread again, as finish_step_over may have switched
+ threads. */
+ switch_to_thread (ecs->event_thread);
+
+ /* Emit [Thread ... exited] notification. */
delete_thread (ecs->event_thread);
+
ecs->event_thread = nullptr;
return false;
}