aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
diff options
context:
space:
mode:
authorMichał Górny <mgorny@moritz.systems>2022-07-01 15:12:00 +0200
committerMichał Górny <mgorny@moritz.systems>2022-08-01 18:52:47 +0200
commitf8603c1f6d9eb90bc6a674111bd3441458006601 (patch)
tree60f6869c70260f0b4b70d7988e0ba6c8c116a902 /lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
parent080692797724eefd15de00500d8d802e98230622 (diff)
downloadllvm-f8603c1f6d9eb90bc6a674111bd3441458006601.zip
llvm-f8603c1f6d9eb90bc6a674111bd3441458006601.tar.gz
llvm-f8603c1f6d9eb90bc6a674111bd3441458006601.tar.bz2
[lldb] [llgs] Support resuming multiple processes via vCont w/ nonstop
Support using the vCont packet to resume multiple processes simultaneously when in non-stop mode. The new logic now assumes that: - actions without a thread-id or with process id of "p-1" apply to all debugged processes - actions with a thread-id without process id apply to the current process (m_continue_process) As with the other continue packets, it is only possible to resume processes that are currently stopped (or stop these that are running). It is unsupported to resume or stop individual threads of a running process. Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.llvm.org/D128989
Diffstat (limited to 'lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp')
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp27
1 files changed, 17 insertions, 10 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
index 20650b5..d1b30f7 100644
--- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
@@ -1762,6 +1762,7 @@ GDBRemoteCommunicationServerLLGS::Handle_vCont(
break;
}
+ // If there's no thread-id (e.g. "vCont;c"), it's "p-1.-1".
lldb::pid_t pid = StringExtractorGDBRemote::AllProcesses;
lldb::tid_t tid = StringExtractorGDBRemote::AllThreads;
@@ -1770,7 +1771,7 @@ GDBRemoteCommunicationServerLLGS::Handle_vCont(
// Consume the separator.
packet.GetChar();
- auto pid_tid = packet.GetPidTid(StringExtractorGDBRemote::AllProcesses);
+ auto pid_tid = packet.GetPidTid(LLDB_INVALID_PROCESS_ID);
if (!pid_tid)
return SendIllFormedResponse(packet, "Malformed thread-id");
@@ -1784,29 +1785,35 @@ GDBRemoteCommunicationServerLLGS::Handle_vCont(
packet, "'t' action not supported for individual threads");
}
- if (pid == StringExtractorGDBRemote::AllProcesses) {
- if (m_debugged_processes.size() > 1)
- return SendIllFormedResponse(
- packet, "Resuming multiple processes not supported yet");
+ // If we get TID without PID, it's the current process.
+ if (pid == LLDB_INVALID_PROCESS_ID) {
if (!m_continue_process) {
- LLDB_LOG(log, "no debugged process");
+ LLDB_LOG(log, "no process selected via Hc");
return SendErrorResponse(0x36);
}
pid = m_continue_process->GetID();
}
+ assert(pid != LLDB_INVALID_PROCESS_ID);
if (tid == StringExtractorGDBRemote::AllThreads)
tid = LLDB_INVALID_THREAD_ID;
-
thread_action.tid = tid;
- thread_actions[pid].Append(thread_action);
+ if (pid == StringExtractorGDBRemote::AllProcesses) {
+ if (tid != LLDB_INVALID_THREAD_ID)
+ return SendIllFormedResponse(
+ packet, "vCont: p-1 is not valid with a specific tid");
+ for (auto &process_it : m_debugged_processes)
+ thread_actions[process_it.first].Append(thread_action);
+ } else
+ thread_actions[pid].Append(thread_action);
}
assert(thread_actions.size() >= 1);
- if (thread_actions.size() > 1)
+ if (thread_actions.size() > 1 && !m_non_stop)
return SendIllFormedResponse(
- packet, "Resuming multiple processes not supported yet");
+ packet,
+ "Resuming multiple processes is supported in non-stop mode only");
for (std::pair<lldb::pid_t, ResumeActionList> x : thread_actions) {
auto process_it = m_debugged_processes.find(x.first);