[Lldb-commits] [lldb] [lldb][Windows] Remember server's primary stop thread on gdb-remote stops (PR #203525)
Charles Zablit via lldb-commits
lldb-commits at lists.llvm.org
Fri Jun 12 07:35:42 PDT 2026
https://github.com/charles-zablit updated https://github.com/llvm/llvm-project/pull/203525
>From ea720471e242838d0c8150596eaab3bf45a6c07b Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Fri, 12 Jun 2026 14:06:40 +0100
Subject: [PATCH 1/2] [lldb][Windows] Honor server's primary stop thread on
gdb-remote stops
---
.../Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 8 ++++++++
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h | 3 +++
2 files changed, 11 insertions(+)
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 2fc6dbb546f79..754666665ae07 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -2621,6 +2621,8 @@ StateType ProcessGDBRemote::SetThreadStopInfo(StringExtractor &stop_packet) {
SetAddressableBitMasks(addressable_bits);
+ m_last_stop_primary_tid = tid;
+
ThreadSP thread_sp = SetThreadStopInfo(
tid, expedited_register_map, signo, thread_name, reason, description,
exc_type, exc_data, thread_dispatch_qaddr, queue_vars_valid,
@@ -2669,7 +2671,13 @@ void ProcessGDBRemote::RefreshStateAfterStop() {
if (m_initial_tid != LLDB_INVALID_THREAD_ID) {
m_thread_list.SetSelectedThreadByID(m_initial_tid);
m_initial_tid = LLDB_INVALID_THREAD_ID;
+ } else if (m_last_stop_primary_tid != LLDB_INVALID_THREAD_ID) {
+ if (ThreadSP primary_thread_sp =
+ m_thread_list.FindThreadByProtocolID(m_last_stop_primary_tid,
+ /*can_update=*/false))
+ m_thread_list.SetSelectedThreadByID(primary_thread_sp->GetID());
}
+ m_last_stop_primary_tid = LLDB_INVALID_THREAD_ID;
// Let all threads recover from stopping and do any clean up based on the
// previous thread state (if any).
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
index 0a3386082c388..7a030cd966a18 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
@@ -322,6 +322,9 @@ class ProcessGDBRemote : public Process,
lldb::CommandObjectSP m_command_sp;
int64_t m_breakpoint_pc_offset;
lldb::tid_t m_initial_tid; // The initial thread ID, given by stub on attach
+ lldb::tid_t m_last_stop_primary_tid =
+ LLDB_INVALID_THREAD_ID; // Thread ID extracted from the most recent
+ // T-packet's "thread:<tid>" key.
bool m_use_g_packet_for_reading;
bool m_allow_flash_writes;
>From 2f8dc3bbffce163caa0682a5236ac4e4e9a86eeb Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Fri, 12 Jun 2026 15:35:31 +0100
Subject: [PATCH 2/2] fixup! [lldb][Windows] Honor server's primary stop thread
on gdb-remote stops
---
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 754666665ae07..d73f52b492e4d 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -2671,7 +2671,8 @@ void ProcessGDBRemote::RefreshStateAfterStop() {
if (m_initial_tid != LLDB_INVALID_THREAD_ID) {
m_thread_list.SetSelectedThreadByID(m_initial_tid);
m_initial_tid = LLDB_INVALID_THREAD_ID;
- } else if (m_last_stop_primary_tid != LLDB_INVALID_THREAD_ID) {
+ } else if (m_last_stop_primary_tid != LLDB_INVALID_THREAD_ID &&
+ StateIsRunningState(m_last_broadcast_state)) {
if (ThreadSP primary_thread_sp =
m_thread_list.FindThreadByProtocolID(m_last_stop_primary_tid,
/*can_update=*/false))
More information about the lldb-commits
mailing list