[llvm-branch-commits] [lldb] [lldbremote] Implement support for MultiBreakpoint packet (PR #192919)

David Spickett via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Apr 24 08:51:20 PDT 2026


================
@@ -3123,6 +3126,65 @@ GDBRemoteCommunicationServerLLGS::Handle_z(StringExtractorGDBRemote &packet) {
                                 ExecuteRemoveBreakpoint(packet.GetStringRef()));
 }
 
+GDBRemoteCommunication::PacketResult
+GDBRemoteCommunicationServerLLGS::Handle_jMultiBreakpoint(
+    StringExtractorGDBRemote &packet) {
+  llvm::StringRef packet_str = packet.GetStringRef();
+  if (!packet_str.consume_front("jMultiBreakpoint:"))
+    return SendIllFormedResponse(packet,
+                                 "Invalid jMultiBreakpoint packet prefix");
+
+  llvm::Expected<llvm::json::Value> parsed = llvm::json::parse(packet_str);
+  if (!parsed) {
+    llvm::consumeError(parsed.takeError());
+    return SendIllFormedResponse(
+        packet, "jMultiBreakpoint did not contain valid JSON");
+  }
+  llvm::json::Object *request_dict = parsed->getAsObject();
+  if (!request_dict)
+    return SendIllFormedResponse(
+        packet, "jMultiBreakpoint did not contain a JSON dictionary");
+
+  llvm::json::Array *request_array =
+      request_dict->getArray("breakpoint_requests");
+  if (!request_array)
+    return SendIllFormedResponse(
+        packet,
+        "jMultiBreakpoint did not contain a valid 'breakpoint_requests' field");
+
+  llvm::json::Array reply_array;
+  for (const llvm::json::Value &value : *request_array) {
+    std::optional<llvm::StringRef> request = value.getAsString();
+    if (!request)
+      return SendIllFormedResponse(packet,
+                                   "jMultiBreakpoint had a non-string entry");
+    BreakpointResult result = request->starts_with("Z")
+                                  ? ExecuteSetBreakpoint(*request)
+                                  : ExecuteRemoveBreakpoint(*request);
+    switch (result.kind) {
+    case BreakpointResult::Kind::OK:
+      reply_array.push_back("OK");
+      break;
+    case BreakpointResult::Kind::Error:
+      reply_array.push_back(llvm::formatv("E{0:X-2}", result.error_code).str());
+      break;
+    case BreakpointResult::Kind::IllFormed:
+      reply_array.push_back("E03");
+      break;
+    }
+  }
+
+  llvm::json::Object dict;
+  dict.try_emplace("results", std::move(reply_array));
+
+  StreamString stream;
+  stream.AsRawOstream() << llvm::json::Value(std::move(dict));
+  StringRef response_str = stream.GetString();
+  StreamGDBRemote response;
----------------
DavidSpickett wrote:

I thought you could stream direct to this because it is a StreamString subclass but this won't work because you need to escape the bytes as well. So you have to have this 2 step process.

(don't change any of it, just a note in case other reviewers think that same thing)

https://github.com/llvm/llvm-project/pull/192919


More information about the llvm-branch-commits mailing list