https://github.com/Jlalond updated https://github.com/llvm/llvm-project/pull/124648
>From 55e22921d0b1b5088540ffa29a6e67a7816949cf Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Mon, 27 Jan 2025 13:41:58 -0800 Subject: [PATCH 1/3] Only include title on the first message --- lldb/include/lldb/Core/DebuggerEvents.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lldb/include/lldb/Core/DebuggerEvents.h b/lldb/include/lldb/Core/DebuggerEvents.h index 49a4ecf8e537e3..52e4f77d7637d3 100644 --- a/lldb/include/lldb/Core/DebuggerEvents.h +++ b/lldb/include/lldb/Core/DebuggerEvents.h @@ -44,12 +44,15 @@ class ProgressEventData : public EventData { uint64_t GetCompleted() const { return m_completed; } uint64_t GetTotal() const { return m_total; } std::string GetMessage() const { - std::string message = m_title; - if (!m_details.empty()) { - message.append(": "); - message.append(m_details); - } - return message; + if (m_completed == 0) { + std::string message = m_title; + if (!m_details.empty()) { + message.append(": "); + message.append(m_details); + } + return message; + } else + return !m_details.empty() ? m_details : std::string(); } const std::string &GetTitle() const { return m_title; } const std::string &GetDetails() const { return m_details; } >From bea28f7aa583a18443ed42c2046980f2eb7406fb Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Mon, 27 Jan 2025 14:48:01 -0800 Subject: [PATCH 2/3] Add comment explaining if and add a test --- lldb/include/lldb/Core/DebuggerEvents.h | 1 + lldb/test/API/tools/lldb-dap/progress/TestDAP_Progress.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/lldb/include/lldb/Core/DebuggerEvents.h b/lldb/include/lldb/Core/DebuggerEvents.h index 52e4f77d7637d3..ca06ee835fde38 100644 --- a/lldb/include/lldb/Core/DebuggerEvents.h +++ b/lldb/include/lldb/Core/DebuggerEvents.h @@ -44,6 +44,7 @@ class ProgressEventData : public EventData { uint64_t GetCompleted() const { return m_completed; } uint64_t GetTotal() const { return m_total; } std::string GetMessage() const { + // Only put the title in the message of the progress create event. if (m_completed == 0) { std::string message = m_title; if (!m_details.empty()) { diff --git a/lldb/test/API/tools/lldb-dap/progress/TestDAP_Progress.py b/lldb/test/API/tools/lldb-dap/progress/TestDAP_Progress.py index 36c0cef9c47143..945c3f7633364c 100755 --- a/lldb/test/API/tools/lldb-dap/progress/TestDAP_Progress.py +++ b/lldb/test/API/tools/lldb-dap/progress/TestDAP_Progress.py @@ -41,8 +41,13 @@ def test_output(self): for event in self.dap_server.progress_events: event_type = event["event"] if "progressStart" in event_type: + title = event["body"]["title"] + self.assertIn("Progress tester", title) start_found = True if "progressUpdate" in event_type: + message = event["body"]["message"] + print(f"Progress update: {message}") + self.assertNotIn("Progres tester", message) update_found = True self.assertTrue(start_found) >From ca2f7e3d27006e4ef8f10e233fe8ebb910d15fc6 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Thu, 30 Jan 2025 10:04:04 -0800 Subject: [PATCH 3/3] Migrate to structured data Summary: Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D68927453 --- lldb/include/lldb/Core/DebuggerEvents.h | 16 +++----- lldb/tools/lldb-dap/lldb-dap.cpp | 54 +++++++++++++++++++++---- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/lldb/include/lldb/Core/DebuggerEvents.h b/lldb/include/lldb/Core/DebuggerEvents.h index ca06ee835fde38..49a4ecf8e537e3 100644 --- a/lldb/include/lldb/Core/DebuggerEvents.h +++ b/lldb/include/lldb/Core/DebuggerEvents.h @@ -44,16 +44,12 @@ class ProgressEventData : public EventData { uint64_t GetCompleted() const { return m_completed; } uint64_t GetTotal() const { return m_total; } std::string GetMessage() const { - // Only put the title in the message of the progress create event. - if (m_completed == 0) { - std::string message = m_title; - if (!m_details.empty()) { - message.append(": "); - message.append(m_details); - } - return message; - } else - return !m_details.empty() ? m_details : std::string(); + std::string message = m_title; + if (!m_details.empty()) { + message.append(": "); + message.append(m_details); + } + return message; } const std::string &GetTitle() const { return m_title; } const std::string &GetDetails() const { return m_details; } diff --git a/lldb/tools/lldb-dap/lldb-dap.cpp b/lldb/tools/lldb-dap/lldb-dap.cpp index 6b12569d90a831..be9d71a3bd6afa 100644 --- a/lldb/tools/lldb-dap/lldb-dap.cpp +++ b/lldb/tools/lldb-dap/lldb-dap.cpp @@ -53,6 +53,7 @@ #include <thread> #include <vector> +#include <iostream> #if defined(_WIN32) // We need to #define NOMINMAX in order to skip `min()` and `max()` macro // definitions that conflict with other system headers. @@ -411,6 +412,30 @@ void SendStdOutStdErr(DAP &dap, lldb::SBProcess &process) { dap.SendOutput(OutputType::Stderr, llvm::StringRef(buffer, count)); } +static std::string GetStringFromStructuredData(lldb::SBStructuredData &data, + const char *key) { + lldb::SBStructuredData keyValue = data.GetValueForKey(key); + if (!keyValue) + return std::string(); + + size_t size = keyValue.GetStringValue(nullptr, 0); + std::cout << "Size for " << key << " " << size << std::endl; + std::string stringValue; + stringValue.resize(size); + keyValue.GetStringValue(&stringValue[0], size + 1); + std::cout << "String value after: " << stringValue << std::endl; + return stringValue; +} + +static uint64_t GetUintFromStructuredData(lldb::SBStructuredData &data, + const char *key) { + lldb::SBStructuredData keyValue = data.GetValueForKey(key); + + if (!keyValue.IsValid()) + return -1; + return keyValue.GetUnsignedIntegerValue(); +} + void ProgressEventThreadFunction(DAP &dap) { lldb::SBListener listener("lldb-dap.progress.listener"); dap.debugger.GetBroadcaster().AddListener( @@ -427,14 +452,27 @@ void ProgressEventThreadFunction(DAP &dap) { done = true; } } else { - uint64_t progress_id = 0; - uint64_t completed = 0; - uint64_t total = 0; - bool is_debugger_specific = false; - const char *message = lldb::SBDebugger::GetProgressFromEvent( - event, progress_id, completed, total, is_debugger_specific); - if (message) - dap.SendProgressEvent(progress_id, message, completed, total); + lldb::SBStructuredData data = + lldb::SBDebugger::GetProgressDataFromEvent(event); + + uint64_t progress_id = GetUintFromStructuredData(data, "progress_id"); + uint64_t completed = GetUintFromStructuredData(data, "completed"); + uint64_t total = GetUintFromStructuredData(data, "total"); + std::string message; + // Include the title on the first event. + if (completed == 0) { + std::string title = GetStringFromStructuredData(data, "title"); + message += title; + message += ": "; + } + + std::string details = GetStringFromStructuredData(data, "details"); + message += details; + // Verbose check, but we get -1 for the uint64 on failure to read + // so we check everything before broadcasting an event. + if (message.length() > 0 && progress_id > 0 && total >= 0 && + completed >= 0) + dap.SendProgressEvent(progress_id, message.c_str(), completed, total); } } } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits