Author: John Harrison Date: 2023-07-25T14:46:17-04:00 New Revision: 3ab73a398422298fb5435ced0f7838074efa12e0
URL: https://github.com/llvm/llvm-project/commit/3ab73a398422298fb5435ced0f7838074efa12e0 DIFF: https://github.com/llvm/llvm-project/commit/3ab73a398422298fb5435ced0f7838074efa12e0.diff LOG: [lldb-vsocde] Add a 'continued' event for programmatic continue events. When the process is contiuned using an lldb command expression the thread state in VS Code is never informed and will be out of sync with the current state of the process. The new event will fire whenever the process is continued and keeps the debugger in sync with the dap client. Reviewed By: wallace Differential Revision: https://reviews.llvm.org/D154989 Added: Modified: lldb/tools/lldb-vscode/JSONUtils.cpp lldb/tools/lldb-vscode/lldb-vscode.cpp Removed: ################################################################################ diff --git a/lldb/tools/lldb-vscode/JSONUtils.cpp b/lldb/tools/lldb-vscode/JSONUtils.cpp index 8632ba929f77d9..98dbba32b033e3 100644 --- a/lldb/tools/lldb-vscode/JSONUtils.cpp +++ b/lldb/tools/lldb-vscode/JSONUtils.cpp @@ -907,6 +907,8 @@ llvm::json::Value CreateThreadStopped(lldb::SBThread &thread, uint64_t bp_loc_id = thread.GetStopReasonDataAtIndex(1); snprintf(desc_str, sizeof(desc_str), "breakpoint %" PRIu64 ".%" PRIu64, bp_id, bp_loc_id); + body.try_emplace("hitBreakpointIds", + llvm::json::Array{llvm::json::Value(bp_id)}); EmplaceSafeString(body, "description", desc_str); } } break; @@ -951,6 +953,7 @@ llvm::json::Value CreateThreadStopped(lldb::SBThread &thread, EmplaceSafeString(body, "description", std::string(description)); } } + // "threadCausedFocus" is used in tests to validate breaking behavior. if (tid == g_vsc.focus_tid) { body.try_emplace("threadCausedFocus", true); } diff --git a/lldb/tools/lldb-vscode/lldb-vscode.cpp b/lldb/tools/lldb-vscode/lldb-vscode.cpp index 75c61a92bbf97d..72ebe4825024e3 100644 --- a/lldb/tools/lldb-vscode/lldb-vscode.cpp +++ b/lldb/tools/lldb-vscode/lldb-vscode.cpp @@ -191,6 +191,28 @@ void SendThreadExitedEvent(lldb::tid_t tid) { g_vsc.SendJSON(llvm::json::Value(std::move(event))); } +// Send a "continued" event to indicate the process is in the running state. +void SendContinuedEvent() { + lldb::SBProcess process = g_vsc.target.GetProcess(); + if (!process.IsValid()) { + return; + } + + // If the focus thread is not set then we haven't reported any thread status + // to the client, so nothing to report. + if (!g_vsc.configuration_done_sent || + g_vsc.focus_tid == LLDB_INVALID_THREAD_ID) { + return; + } + + llvm::json::Object event(CreateEventObject("continued")); + llvm::json::Object body; + body.try_emplace("threadId", (int64_t)g_vsc.focus_tid); + body.try_emplace("allThreadsContinued", true); + event.try_emplace("body", std::move(body)); + g_vsc.SendJSON(llvm::json::Value(std::move(event))); +} + // Send a "terminated" event to indicate the process is done being // debugged. void SendTerminatedEvent() { @@ -252,7 +274,7 @@ void SendThreadStoppedEvent() { } } - // We will have cleared g_vsc.focus_tid if he focus thread doesn't have + // We will have cleared g_vsc.focus_tid if the focus thread doesn't have // a stop reason, so if it was cleared, or wasn't set, or doesn't exist, // then set the focus thread to the first thread with a stop reason. if (!focus_thread_exists || g_vsc.focus_tid == LLDB_INVALID_THREAD_ID) @@ -262,6 +284,7 @@ void SendThreadStoppedEvent() { // we at least let the UI know we stopped. if (num_threads_with_reason == 0) { lldb::SBThread thread = process.GetThreadAtIndex(0); + g_vsc.focus_tid = thread.GetThreadID(); g_vsc.SendJSON(CreateThreadStopped(thread, stop_id)); } else { for (uint32_t thread_idx = 0; thread_idx < num_threads; ++thread_idx) { @@ -468,6 +491,7 @@ void EventThreadFunction() { break; case lldb::eStateRunning: g_vsc.WillContinue(); + SendContinuedEvent(); break; case lldb::eStateExited: // When restarting, we can get an "exited" event for the process we @@ -766,10 +790,6 @@ void request_continue(const llvm::json::Object &request) { llvm::json::Object response; FillResponse(request, response); lldb::SBProcess process = g_vsc.target.GetProcess(); - auto arguments = request.getObject("arguments"); - // Remember the thread ID that caused the resume so we can set the - // "threadCausedFocus" boolean value in the "stopped" events. - g_vsc.focus_tid = GetUnsigned(arguments, "threadId", LLDB_INVALID_THREAD_ID); lldb::SBError error = process.Continue(); llvm::json::Object body; body.try_emplace("allThreadsContinued", true); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits