https://github.com/ashgti updated 
https://github.com/llvm/llvm-project/pull/129294

>From 8d466e5c4b1b6913e788fd11d46689af8f0b8eec Mon Sep 17 00:00:00 2001
From: John Harrison <harj...@google.com>
Date: Thu, 27 Feb 2025 15:33:51 -0800
Subject: [PATCH 1/2] [lldb-dap] Updating the logging of lldb-dap to use
 existing LLDBLog.h helpers.

This only creates the basic types need to start using the LLDBLog.h helpers.
Today, logging is handling by a simple `std::ofstream *` for handling logging.
LLDBLog.h can help improve logging by adding new categories of logs and give us 
additional formatting support for log messages.
---
 lldb/tools/lldb-dap/CMakeLists.txt  |  1 +
 lldb/tools/lldb-dap/DAP.cpp         | 62 ++++++++----------------
 lldb/tools/lldb-dap/DAP.h           | 11 ++---
 lldb/tools/lldb-dap/DAPLog.cpp      | 22 +++++++++
 lldb/tools/lldb-dap/DAPLog.h        | 34 +++++++++++++
 lldb/tools/lldb-dap/EventHelper.cpp | 17 ++++---
 lldb/tools/lldb-dap/IOStream.cpp    | 19 ++++----
 lldb/tools/lldb-dap/IOStream.h      |  7 ++-
 lldb/tools/lldb-dap/lldb-dap.cpp    | 75 ++++++++++++++++-------------
 9 files changed, 146 insertions(+), 102 deletions(-)
 create mode 100644 lldb/tools/lldb-dap/DAPLog.cpp
 create mode 100644 lldb/tools/lldb-dap/DAPLog.h

diff --git a/lldb/tools/lldb-dap/CMakeLists.txt 
b/lldb/tools/lldb-dap/CMakeLists.txt
index 8b3c520ec4360..d9f09f6d022ed 100644
--- a/lldb/tools/lldb-dap/CMakeLists.txt
+++ b/lldb/tools/lldb-dap/CMakeLists.txt
@@ -23,6 +23,7 @@ add_lldb_tool(lldb-dap
   Breakpoint.cpp
   BreakpointBase.cpp
   DAP.cpp
+  DAPLog.cpp
   EventHelper.cpp
   ExceptionBreakpoint.cpp
   FifoFiles.cpp
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index 53c514b790f38..81f5205d4f6bd 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -7,6 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "DAP.h"
+#include "DAPLog.h"
 #include "Handler/ResponseHandler.h"
 #include "JSONUtils.h"
 #include "LLDBUtils.h"
@@ -19,6 +20,7 @@
 #include "lldb/API/SBProcess.h"
 #include "lldb/API/SBStream.h"
 #include "lldb/Utility/IOObject.h"
+#include "lldb/Utility/Log.h"
 #include "lldb/Utility/Status.h"
 #include "lldb/lldb-defines.h"
 #include "lldb/lldb-enumerations.h"
@@ -50,6 +52,7 @@
 #endif
 
 using namespace lldb_dap;
+using namespace lldb_private;
 
 namespace {
 #ifdef _WIN32
@@ -61,13 +64,12 @@ const char DEV_NULL[] = "/dev/null";
 
 namespace lldb_dap {
 
-DAP::DAP(std::string name, llvm::StringRef path, std::ofstream *log,
-         lldb::IOObjectSP input, lldb::IOObjectSP output, ReplMode repl_mode,
+DAP::DAP(std::string name, llvm::StringRef path, lldb::IOObjectSP input,
+         lldb::IOObjectSP output, ReplMode repl_mode,
          std::vector<std::string> pre_init_commands)
-    : name(std::move(name)), debug_adapter_path(path), log(log),
-      input(std::move(input)), output(std::move(output)),
-      broadcaster("lldb-dap"), exception_breakpoints(),
-      pre_init_commands(std::move(pre_init_commands)),
+    : name(std::move(name)), debug_adapter_path(path), input(std::move(input)),
+      output(std::move(output)), broadcaster("lldb-dap"),
+      exception_breakpoints(), pre_init_commands(std::move(pre_init_commands)),
       focus_tid(LLDB_INVALID_THREAD_ID), stop_at_entry(false), 
is_attach(false),
       enable_auto_variable_summaries(false),
       enable_synthetic_child_debugging(false),
@@ -245,6 +247,8 @@ void DAP::SendJSON(const std::string &json_str) {
   output.write_full(llvm::utostr(json_str.size()));
   output.write_full("\r\n\r\n");
   output.write_full(json_str);
+
+  LLDB_LOG(GetLog(DAPLog::Transport), "{0} <-- {1}", name, json_str);
 }
 
 // Serialize the JSON value into a string and send the JSON packet to
@@ -256,15 +260,6 @@ void DAP::SendJSON(const llvm::json::Value &json) {
   static std::mutex mutex;
   std::lock_guard<std::mutex> locker(mutex);
   SendJSON(json_str);
-
-  if (log) {
-    auto now = std::chrono::duration<double>(
-        std::chrono::system_clock::now().time_since_epoch());
-    *log << llvm::formatv("{0:f9} {1} <-- ", now.count(), name).str()
-         << std::endl
-         << "Content-Length: " << json_str.size() << "\r\n\r\n"
-         << llvm::formatv("{0:2}", json).str() << std::endl;
-  }
 }
 
 // Read a JSON packet from the "in" stream.
@@ -273,28 +268,22 @@ std::string DAP::ReadJSON() {
   std::string json_str;
   int length;
 
-  if (!input.read_expected(log, "Content-Length: "))
+  if (!input.read_expected("Content-Length: "))
     return json_str;
 
-  if (!input.read_line(log, length_str))
+  if (!input.read_line(length_str))
     return json_str;
 
   if (!llvm::to_integer(length_str, length))
     return json_str;
 
-  if (!input.read_expected(log, "\r\n"))
+  if (!input.read_expected("\r\n"))
     return json_str;
 
-  if (!input.read_full(log, length, json_str))
+  if (!input.read_full(length, json_str))
     return json_str;
 
-  if (log) {
-    auto now = std::chrono::duration<double>(
-        std::chrono::system_clock::now().time_since_epoch());
-    *log << llvm::formatv("{0:f9} {1} --> ", now.count(), name).str()
-         << std::endl
-         << "Content-Length: " << length << "\r\n\r\n";
-  }
+  LLDB_LOG(GetLog(DAPLog::Transport), "{0} --> {1}", name, json_str);
   return json_str;
 }
 
@@ -729,24 +718,14 @@ PacketStatus DAP::GetNextObject(llvm::json::Object 
&object) {
   llvm::Expected<llvm::json::Value> json_value = llvm::json::parse(json_sref);
   if (!json_value) {
     auto error = json_value.takeError();
-    if (log) {
-      std::string error_str;
-      llvm::raw_string_ostream strm(error_str);
-      strm << error;
-      *log << "error: failed to parse JSON: " << error_str << std::endl
-           << json << std::endl;
-    }
+    LLDB_LOG_ERROR(GetLog(DAPLog::Protocol), std::move(error),
+                   "failed to parse JSON: {0}");
     return PacketStatus::JSONMalformed;
   }
 
-  if (log) {
-    *log << llvm::formatv("{0:2}", *json_value).str() << std::endl;
-  }
-
   llvm::json::Object *object_ptr = json_value->getAsObject();
   if (!object_ptr) {
-    if (log)
-      *log << "error: json packet isn't a object" << std::endl;
+    LLDB_LOG(GetLog(DAPLog::Protocol), "error: json packet isn't a object");
     return PacketStatus::JSONNotObject;
   }
   object = *object_ptr;
@@ -764,9 +743,8 @@ bool DAP::HandleObject(const llvm::json::Object &object) {
       return true; // Success
     }
 
-    if (log)
-      *log << "error: unhandled command \"" << command.data() << "\""
-           << std::endl;
+    LLDB_LOG(GetLog(DAPLog::Protocol), "error: unhandled command '{0}'",
+             command);
     return false; // Fail
   }
 
diff --git a/lldb/tools/lldb-dap/DAP.h b/lldb/tools/lldb-dap/DAP.h
index 8b2e498a28c95..ea5e17eb5d95f 100644
--- a/lldb/tools/lldb-dap/DAP.h
+++ b/lldb/tools/lldb-dap/DAP.h
@@ -125,21 +125,21 @@ struct Variables {
 
 struct StartDebuggingRequestHandler : public lldb::SBCommandPluginInterface {
   DAP &dap;
-  explicit StartDebuggingRequestHandler(DAP &d) : dap(d) {};
+  explicit StartDebuggingRequestHandler(DAP &d) : dap(d){};
   bool DoExecute(lldb::SBDebugger debugger, char **command,
                  lldb::SBCommandReturnObject &result) override;
 };
 
 struct ReplModeRequestHandler : public lldb::SBCommandPluginInterface {
   DAP &dap;
-  explicit ReplModeRequestHandler(DAP &d) : dap(d) {};
+  explicit ReplModeRequestHandler(DAP &d) : dap(d){};
   bool DoExecute(lldb::SBDebugger debugger, char **command,
                  lldb::SBCommandReturnObject &result) override;
 };
 
 struct SendEventRequestHandler : public lldb::SBCommandPluginInterface {
   DAP &dap;
-  explicit SendEventRequestHandler(DAP &d) : dap(d) {};
+  explicit SendEventRequestHandler(DAP &d) : dap(d){};
   bool DoExecute(lldb::SBDebugger debugger, char **command,
                  lldb::SBCommandReturnObject &result) override;
 };
@@ -147,7 +147,6 @@ struct SendEventRequestHandler : public 
lldb::SBCommandPluginInterface {
 struct DAP {
   std::string name;
   llvm::StringRef debug_adapter_path;
-  std::ofstream *log;
   InputStream input;
   OutputStream output;
   lldb::SBFile in;
@@ -210,8 +209,8 @@ struct DAP {
   // will contain that expression.
   std::string last_nonempty_var_expression;
 
-  DAP(std::string name, llvm::StringRef path, std::ofstream *log,
-      lldb::IOObjectSP input, lldb::IOObjectSP output, ReplMode repl_mode,
+  DAP(std::string name, llvm::StringRef path, lldb::IOObjectSP input,
+      lldb::IOObjectSP output, ReplMode repl_mode,
       std::vector<std::string> pre_init_commands);
   ~DAP();
   DAP(const DAP &rhs) = delete;
diff --git a/lldb/tools/lldb-dap/DAPLog.cpp b/lldb/tools/lldb-dap/DAPLog.cpp
new file mode 100644
index 0000000000000..840e995b14af8
--- /dev/null
+++ b/lldb/tools/lldb-dap/DAPLog.cpp
@@ -0,0 +1,22 @@
+#include "DAPLog.h"
+
+using namespace lldb_private;
+using namespace lldb_dap;
+
+static constexpr Log::Category g_categories[] = {
+    {{"transport"}, {"log DAP transport"}, DAPLog::Transport},
+    {{"protocol"}, {"log protocol handling"}, DAPLog::Protocol},
+    {{"connection"}, {"log connection handling"}, DAPLog::Connection},
+};
+
+static Log::Channel g_log_channel(g_categories, DAPLog::Transport |
+                                                    DAPLog::Protocol |
+                                                    DAPLog::Connection);
+
+template <> Log::Channel &lldb_private::LogChannelFor<DAPLog>() {
+  return g_log_channel;
+}
+
+void lldb_dap::InitializeDAPChannel() {
+  Log::Register("lldb-dap", g_log_channel);
+}
diff --git a/lldb/tools/lldb-dap/DAPLog.h b/lldb/tools/lldb-dap/DAPLog.h
new file mode 100644
index 0000000000000..49be7602b2c88
--- /dev/null
+++ b/lldb/tools/lldb-dap/DAPLog.h
@@ -0,0 +1,34 @@
+//===-- DAPLog.h ------------------------------------------------*- C++ 
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_UTILITY_LLDBLOG_H
+#define LLDB_UTILITY_LLDBLOG_H
+
+#include "lldb/Utility/Log.h"
+#include "llvm/ADT/BitmaskEnum.h"
+
+namespace lldb_dap {
+
+enum class DAPLog : lldb_private::Log::MaskType {
+  Transport = lldb_private::Log::ChannelFlag<0>,
+  Protocol = lldb_private::Log::ChannelFlag<1>,
+  Connection = lldb_private::Log::ChannelFlag<2>,
+  LLVM_MARK_AS_BITMASK_ENUM(Connection),
+};
+
+LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
+
+void InitializeDAPChannel();
+
+} // end namespace lldb_dap
+
+namespace lldb_private {
+template <> lldb_private::Log::Channel &LogChannelFor<lldb_dap::DAPLog>();
+} // namespace lldb_private
+
+#endif
diff --git a/lldb/tools/lldb-dap/EventHelper.cpp 
b/lldb/tools/lldb-dap/EventHelper.cpp
index 705eb0a457d9c..299d8f8a482ac 100644
--- a/lldb/tools/lldb-dap/EventHelper.cpp
+++ b/lldb/tools/lldb-dap/EventHelper.cpp
@@ -8,6 +8,7 @@
 
 #include "EventHelper.h"
 #include "DAP.h"
+#include "DAPLog.h"
 #include "JSONUtils.h"
 #include "LLDBUtils.h"
 #include "lldb/API/SBFileSpec.h"
@@ -21,6 +22,9 @@
 #endif
 #endif
 
+using namespace lldb_dap;
+using namespace lldb_private;
+
 namespace lldb_dap {
 
 static void SendThreadExitedEvent(DAP &dap, lldb::tid_t tid) {
@@ -178,15 +182,14 @@ void SendThreadStoppedEvent(DAP &dap) {
           SendThreadExitedEvent(dap, tid);
       }
     } else {
-      if (dap.log)
-        *dap.log << "error: SendThreadStoppedEvent() when process"
-                    " isn't stopped ("
-                 << lldb::SBDebugger::StateAsCString(state) << ')' << 
std::endl;
+      LLDB_LOG(GetLog(DAPLog::Protocol),
+               "error: SendThreadStoppedEvent() when process"
+               " isn't stopped ({0})",
+               lldb::SBDebugger::StateAsCString(state));
     }
   } else {
-    if (dap.log)
-      *dap.log << "error: SendThreadStoppedEvent() invalid process"
-               << std::endl;
+    LLDB_LOG(GetLog(DAPLog::Protocol),
+             "error: SendThreadStoppedEvent() invalid process");
   }
   dap.RunStopCommands();
 }
diff --git a/lldb/tools/lldb-dap/IOStream.cpp b/lldb/tools/lldb-dap/IOStream.cpp
index c6f1bfaf3b799..0e93ce8111891 100644
--- a/lldb/tools/lldb-dap/IOStream.cpp
+++ b/lldb/tools/lldb-dap/IOStream.cpp
@@ -7,12 +7,13 @@
 
//===----------------------------------------------------------------------===//
 
 #include "IOStream.h"
+#include "DAPLog.h"
 #include "lldb/Utility/IOObject.h"
 #include "lldb/Utility/Status.h"
-#include <fstream>
 #include <string>
 
 using namespace lldb_dap;
+using namespace lldb_private;
 
 bool OutputStream::write_full(llvm::StringRef str) {
   if (!descriptor)
@@ -23,8 +24,7 @@ bool OutputStream::write_full(llvm::StringRef str) {
   return status.Success();
 }
 
-bool InputStream::read_full(std::ofstream *log, size_t length,
-                            std::string &text) {
+bool InputStream::read_full(size_t length, std::string &text) {
   if (!descriptor)
     return false;
 
@@ -39,10 +39,10 @@ bool InputStream::read_full(std::ofstream *log, size_t 
length,
   return true;
 }
 
-bool InputStream::read_line(std::ofstream *log, std::string &line) {
+bool InputStream::read_line(std::string &line) {
   line.clear();
   while (true) {
-    if (!read_full(log, 1, line))
+    if (!read_full(1, line))
       return false;
 
     if (llvm::StringRef(line).ends_with("\r\n"))
@@ -52,14 +52,13 @@ bool InputStream::read_line(std::ofstream *log, std::string 
&line) {
   return true;
 }
 
-bool InputStream::read_expected(std::ofstream *log, llvm::StringRef expected) {
+bool InputStream::read_expected(llvm::StringRef expected) {
   std::string result;
-  if (!read_full(log, expected.size(), result))
+  if (!read_full(expected.size(), result))
     return false;
   if (expected != result) {
-    if (log)
-      *log << "Warning: Expected '" << expected.str() << "', got '" << result
-           << "\n";
+    LLDB_LOG(GetLog(DAPLog::Transport), "Warning: Expected '{0}', got '{1}'",
+             expected, result);
   }
   return true;
 }
diff --git a/lldb/tools/lldb-dap/IOStream.h b/lldb/tools/lldb-dap/IOStream.h
index e9fb8e11c92da..c90fee57d0479 100644
--- a/lldb/tools/lldb-dap/IOStream.h
+++ b/lldb/tools/lldb-dap/IOStream.h
@@ -11,7 +11,6 @@
 
 #include "lldb/lldb-forward.h"
 #include "llvm/ADT/StringRef.h"
-#include <fstream>
 #include <string>
 
 namespace lldb_dap {
@@ -22,11 +21,11 @@ struct InputStream {
   explicit InputStream(lldb::IOObjectSP descriptor)
       : descriptor(std::move(descriptor)) {}
 
-  bool read_full(std::ofstream *log, size_t length, std::string &text);
+  bool read_full(size_t length, std::string &text);
 
-  bool read_line(std::ofstream *log, std::string &line);
+  bool read_line(std::string &line);
 
-  bool read_expected(std::ofstream *log, llvm::StringRef expected);
+  bool read_expected(llvm::StringRef expected);
 };
 
 struct OutputStream {
diff --git a/lldb/tools/lldb-dap/lldb-dap.cpp b/lldb/tools/lldb-dap/lldb-dap.cpp
index d005eccfae903..2c337edc86b89 100644
--- a/lldb/tools/lldb-dap/lldb-dap.cpp
+++ b/lldb/tools/lldb-dap/lldb-dap.cpp
@@ -7,6 +7,7 @@
 
//===----------------------------------------------------------------------===//
 
 #include "DAP.h"
+#include "DAPLog.h"
 #include "EventHelper.h"
 #include "Handler/RequestHandler.h"
 #include "RunInTerminal.h"
@@ -71,13 +72,7 @@ typedef int socklen_t;
 #endif
 
 using namespace lldb_dap;
-using lldb_private::File;
-using lldb_private::IOObject;
-using lldb_private::MainLoop;
-using lldb_private::MainLoopBase;
-using lldb_private::NativeFile;
-using lldb_private::Socket;
-using lldb_private::Status;
+using namespace lldb_private;
 
 namespace {
 using namespace llvm::opt;
@@ -277,8 +272,7 @@ validateConnection(llvm::StringRef conn) {
 
 static llvm::Error
 serveConnection(const Socket::SocketProtocol &protocol, const std::string 
&name,
-                std::ofstream *log, llvm::StringRef program_path,
-                const ReplMode default_repl_mode,
+                llvm::StringRef program_path, const ReplMode default_repl_mode,
                 const std::vector<std::string> &pre_init_commands) {
   Status status;
   static std::unique_ptr<Socket> listener = Socket::Create(protocol, status);
@@ -292,8 +286,8 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
   }
 
   std::string address = llvm::join(listener->GetListeningConnectionURI(), ", 
");
-  if (log)
-    *log << "started with connection listeners " << address << "\n";
+  LLDB_LOG(GetLog(DAPLog::Connection), "started with connection listeners {0}",
+           address);
 
   llvm::outs() << "Listening for: " << address << "\n";
   // Ensure listening address are flushed for calles to retrieve the resolve
@@ -314,12 +308,7 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
                                           &clientCount](
                                              std::unique_ptr<Socket> sock) {
     std::string name = llvm::formatv("client_{0}", clientCount++).str();
-    if (log) {
-      auto now = std::chrono::duration<double>(
-          std::chrono::system_clock::now().time_since_epoch());
-      *log << llvm::formatv("{0:f9}", now.count()).str()
-           << " client connected: " << name << "\n";
-    }
+    LLDB_LOG(GetLog(DAPLog::Connection), "client ({0}) connected", name);
 
     lldb::IOObjectSP io(std::move(sock));
 
@@ -328,8 +317,8 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
     std::thread client([=, &dap_sessions_condition, &dap_sessions_mutex,
                         &dap_sessions]() {
       llvm::set_thread_name(name + ".runloop");
-      DAP dap = DAP(name, program_path, log, io, io, default_repl_mode,
-                    pre_init_commands);
+      DAP dap =
+          DAP(name, program_path, io, io, default_repl_mode, 
pre_init_commands);
 
       if (auto Err = dap.ConfigureIO()) {
         llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(),
@@ -349,12 +338,7 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
                                     "DAP session error: ");
       }
 
-      if (log) {
-        auto now = std::chrono::duration<double>(
-            std::chrono::system_clock::now().time_since_epoch());
-        *log << llvm::formatv("{0:f9}", now.count()).str()
-             << " client closed: " << name << "\n";
-      }
+      LLDB_LOG(GetLog(DAPLog::Connection), "client ({0}) closed", name);
 
       std::unique_lock<std::mutex> lock(dap_sessions_mutex);
       dap_sessions.erase(io.get());
@@ -372,9 +356,8 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
     return status.takeError();
   }
 
-  if (log)
-    *log << "lldb-dap server shutdown requested, disconnecting remaining "
-            "clients...\n";
+  LLDB_LOG(GetLog(DAPLog::Connection),
+           "shutdown requested, disconnecting remaining clients");
 
   bool client_failed = false;
   {
@@ -402,6 +385,22 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
   return llvm::Error::success();
 }
 
+class DAPLogHandler : public lldb_private::LogHandler {
+public:
+  DAPLogHandler(std::unique_ptr<std::ofstream> stream)
+      : m_stream(std::move(stream)) {}
+
+  void Emit(llvm::StringRef message) override {
+    std::lock_guard<std::mutex> guard(m_mutex);
+    (*m_stream) << message.str();
+    m_stream->flush();
+  }
+
+private:
+  std::mutex m_mutex;
+  std::unique_ptr<std::ofstream> m_stream;
+};
+
 int main(int argc, char *argv[]) {
   llvm::InitLLVM IL(argc, argv, /*InstallPipeSignalExitHandler=*/false);
 #if !defined(__APPLE__)
@@ -490,10 +489,20 @@ int main(int argc, char *argv[]) {
   }
 #endif
 
-  std::unique_ptr<std::ofstream> log = nullptr;
+  InitializeDAPChannel();
+
   const char *log_file_path = getenv("LLDBDAP_LOG");
-  if (log_file_path)
-    log = std::make_unique<std::ofstream>(log_file_path);
+  if (log_file_path) {
+    std::unique_ptr<std::ofstream> log =
+        std::make_unique<std::ofstream>(log_file_path);
+
+    if (!lldb_private::Log::EnableLogChannel(
+            std::make_shared<DAPLogHandler>(std::move(log)),
+            LLDB_LOG_OPTION_PREPEND_TIMESTAMP, "lldb-dap", {"all"},
+            llvm::errs())) {
+      return EXIT_FAILURE;
+    }
+  }
 
   // Initialize LLDB first before we do anything.
   lldb::SBError error = lldb::SBDebugger::InitializeWithErrorHandling();
@@ -525,7 +534,7 @@ int main(int argc, char *argv[]) {
     Socket::SocketProtocol protocol;
     std::string name;
     std::tie(protocol, name) = *maybeProtoclAndName;
-    if (auto Err = serveConnection(protocol, name, log.get(), program_path,
+    if (auto Err = serveConnection(protocol, name, program_path,
                                    default_repl_mode, pre_init_commands)) {
       llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(),
                                   "Connection failed: ");
@@ -559,7 +568,7 @@ int main(int argc, char *argv[]) {
   lldb::IOObjectSP output = std::make_shared<NativeFile>(
       stdout_fd, File::eOpenOptionWriteOnly, false);
 
-  DAP dap = DAP("stdin/stdout", program_path, log.get(), std::move(input),
+  DAP dap = DAP("stdin/stdout", program_path, std::move(input),
                 std::move(output), default_repl_mode, pre_init_commands);
 
   // stdout/stderr redirection to the IDE's console

>From eb99ef48b9aa158f1abb5b4a84373b7bae078340 Mon Sep 17 00:00:00 2001
From: John Harrison <harj...@google.com>
Date: Fri, 28 Feb 2025 12:05:56 -0800
Subject: [PATCH 2/2] Applying formatting.

---
 ...g-the-logging-of-lldb-dap-to-use-exi.patch | 596 ++++++++++++++++++
 lldb/tools/lldb-dap/DAP.h                     |   6 +-
 2 files changed, 599 insertions(+), 3 deletions(-)
 create mode 100644 
lldb/tools/lldb-dap/0001-lldb-dap-Updating-the-logging-of-lldb-dap-to-use-exi.patch

diff --git 
a/lldb/tools/lldb-dap/0001-lldb-dap-Updating-the-logging-of-lldb-dap-to-use-exi.patch
 
b/lldb/tools/lldb-dap/0001-lldb-dap-Updating-the-logging-of-lldb-dap-to-use-exi.patch
new file mode 100644
index 0000000000000..7ef6cb6a35fe3
--- /dev/null
+++ 
b/lldb/tools/lldb-dap/0001-lldb-dap-Updating-the-logging-of-lldb-dap-to-use-exi.patch
@@ -0,0 +1,596 @@
+From 8d466e5c4b1b6913e788fd11d46689af8f0b8eec Mon Sep 17 00:00:00 2001
+From: John Harrison <harj...@google.com>
+Date: Thu, 27 Feb 2025 15:33:51 -0800
+Subject: [PATCH] [lldb-dap] Updating the logging of lldb-dap to use existing
+ LLDBLog.h helpers.
+
+This only creates the basic types need to start using the LLDBLog.h helpers.
+Today, logging is handling by a simple `std::ofstream *` for handling logging.
+LLDBLog.h can help improve logging by adding new categories of logs and give 
us additional formatting support for log messages.
+---
+ lldb/tools/lldb-dap/CMakeLists.txt  |  1 +
+ lldb/tools/lldb-dap/DAP.cpp         | 62 ++++++++----------------
+ lldb/tools/lldb-dap/DAP.h           | 11 ++---
+ lldb/tools/lldb-dap/DAPLog.cpp      | 22 +++++++++
+ lldb/tools/lldb-dap/DAPLog.h        | 34 +++++++++++++
+ lldb/tools/lldb-dap/EventHelper.cpp | 17 ++++---
+ lldb/tools/lldb-dap/IOStream.cpp    | 19 ++++----
+ lldb/tools/lldb-dap/IOStream.h      |  7 ++-
+ lldb/tools/lldb-dap/lldb-dap.cpp    | 75 ++++++++++++++++-------------
+ 9 files changed, 146 insertions(+), 102 deletions(-)
+ create mode 100644 lldb/tools/lldb-dap/DAPLog.cpp
+ create mode 100644 lldb/tools/lldb-dap/DAPLog.h
+
+diff --git a/lldb/tools/lldb-dap/CMakeLists.txt 
b/lldb/tools/lldb-dap/CMakeLists.txt
+index 8b3c520ec436..d9f09f6d022e 100644
+--- a/lldb/tools/lldb-dap/CMakeLists.txt
++++ b/lldb/tools/lldb-dap/CMakeLists.txt
+@@ -23,6 +23,7 @@ add_lldb_tool(lldb-dap
+   Breakpoint.cpp
+   BreakpointBase.cpp
+   DAP.cpp
++  DAPLog.cpp
+   EventHelper.cpp
+   ExceptionBreakpoint.cpp
+   FifoFiles.cpp
+diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
+index 53c514b790f3..81f5205d4f6b 100644
+--- a/lldb/tools/lldb-dap/DAP.cpp
++++ b/lldb/tools/lldb-dap/DAP.cpp
+@@ -7,6 +7,7 @@
+ 
//===----------------------------------------------------------------------===//
+ 
+ #include "DAP.h"
++#include "DAPLog.h"
+ #include "Handler/ResponseHandler.h"
+ #include "JSONUtils.h"
+ #include "LLDBUtils.h"
+@@ -19,6 +20,7 @@
+ #include "lldb/API/SBProcess.h"
+ #include "lldb/API/SBStream.h"
+ #include "lldb/Utility/IOObject.h"
++#include "lldb/Utility/Log.h"
+ #include "lldb/Utility/Status.h"
+ #include "lldb/lldb-defines.h"
+ #include "lldb/lldb-enumerations.h"
+@@ -50,6 +52,7 @@
+ #endif
+ 
+ using namespace lldb_dap;
++using namespace lldb_private;
+ 
+ namespace {
+ #ifdef _WIN32
+@@ -61,13 +64,12 @@ const char DEV_NULL[] = "/dev/null";
+ 
+ namespace lldb_dap {
+ 
+-DAP::DAP(std::string name, llvm::StringRef path, std::ofstream *log,
+-         lldb::IOObjectSP input, lldb::IOObjectSP output, ReplMode repl_mode,
++DAP::DAP(std::string name, llvm::StringRef path, lldb::IOObjectSP input,
++         lldb::IOObjectSP output, ReplMode repl_mode,
+          std::vector<std::string> pre_init_commands)
+-    : name(std::move(name)), debug_adapter_path(path), log(log),
+-      input(std::move(input)), output(std::move(output)),
+-      broadcaster("lldb-dap"), exception_breakpoints(),
+-      pre_init_commands(std::move(pre_init_commands)),
++    : name(std::move(name)), debug_adapter_path(path), 
input(std::move(input)),
++      output(std::move(output)), broadcaster("lldb-dap"),
++      exception_breakpoints(), 
pre_init_commands(std::move(pre_init_commands)),
+       focus_tid(LLDB_INVALID_THREAD_ID), stop_at_entry(false), 
is_attach(false),
+       enable_auto_variable_summaries(false),
+       enable_synthetic_child_debugging(false),
+@@ -245,6 +247,8 @@ void DAP::SendJSON(const std::string &json_str) {
+   output.write_full(llvm::utostr(json_str.size()));
+   output.write_full("\r\n\r\n");
+   output.write_full(json_str);
++
++  LLDB_LOG(GetLog(DAPLog::Transport), "{0} <-- {1}", name, json_str);
+ }
+ 
+ // Serialize the JSON value into a string and send the JSON packet to
+@@ -256,15 +260,6 @@ void DAP::SendJSON(const llvm::json::Value &json) {
+   static std::mutex mutex;
+   std::lock_guard<std::mutex> locker(mutex);
+   SendJSON(json_str);
+-
+-  if (log) {
+-    auto now = std::chrono::duration<double>(
+-        std::chrono::system_clock::now().time_since_epoch());
+-    *log << llvm::formatv("{0:f9} {1} <-- ", now.count(), name).str()
+-         << std::endl
+-         << "Content-Length: " << json_str.size() << "\r\n\r\n"
+-         << llvm::formatv("{0:2}", json).str() << std::endl;
+-  }
+ }
+ 
+ // Read a JSON packet from the "in" stream.
+@@ -273,28 +268,22 @@ std::string DAP::ReadJSON() {
+   std::string json_str;
+   int length;
+ 
+-  if (!input.read_expected(log, "Content-Length: "))
++  if (!input.read_expected("Content-Length: "))
+     return json_str;
+ 
+-  if (!input.read_line(log, length_str))
++  if (!input.read_line(length_str))
+     return json_str;
+ 
+   if (!llvm::to_integer(length_str, length))
+     return json_str;
+ 
+-  if (!input.read_expected(log, "\r\n"))
++  if (!input.read_expected("\r\n"))
+     return json_str;
+ 
+-  if (!input.read_full(log, length, json_str))
++  if (!input.read_full(length, json_str))
+     return json_str;
+ 
+-  if (log) {
+-    auto now = std::chrono::duration<double>(
+-        std::chrono::system_clock::now().time_since_epoch());
+-    *log << llvm::formatv("{0:f9} {1} --> ", now.count(), name).str()
+-         << std::endl
+-         << "Content-Length: " << length << "\r\n\r\n";
+-  }
++  LLDB_LOG(GetLog(DAPLog::Transport), "{0} --> {1}", name, json_str);
+   return json_str;
+ }
+ 
+@@ -729,24 +718,14 @@ PacketStatus DAP::GetNextObject(llvm::json::Object 
&object) {
+   llvm::Expected<llvm::json::Value> json_value = llvm::json::parse(json_sref);
+   if (!json_value) {
+     auto error = json_value.takeError();
+-    if (log) {
+-      std::string error_str;
+-      llvm::raw_string_ostream strm(error_str);
+-      strm << error;
+-      *log << "error: failed to parse JSON: " << error_str << std::endl
+-           << json << std::endl;
+-    }
++    LLDB_LOG_ERROR(GetLog(DAPLog::Protocol), std::move(error),
++                   "failed to parse JSON: {0}");
+     return PacketStatus::JSONMalformed;
+   }
+ 
+-  if (log) {
+-    *log << llvm::formatv("{0:2}", *json_value).str() << std::endl;
+-  }
+-
+   llvm::json::Object *object_ptr = json_value->getAsObject();
+   if (!object_ptr) {
+-    if (log)
+-      *log << "error: json packet isn't a object" << std::endl;
++    LLDB_LOG(GetLog(DAPLog::Protocol), "error: json packet isn't a object");
+     return PacketStatus::JSONNotObject;
+   }
+   object = *object_ptr;
+@@ -764,9 +743,8 @@ bool DAP::HandleObject(const llvm::json::Object &object) {
+       return true; // Success
+     }
+ 
+-    if (log)
+-      *log << "error: unhandled command \"" << command.data() << "\""
+-           << std::endl;
++    LLDB_LOG(GetLog(DAPLog::Protocol), "error: unhandled command '{0}'",
++             command);
+     return false; // Fail
+   }
+ 
+diff --git a/lldb/tools/lldb-dap/DAP.h b/lldb/tools/lldb-dap/DAP.h
+index 8b2e498a28c9..ea5e17eb5d95 100644
+--- a/lldb/tools/lldb-dap/DAP.h
++++ b/lldb/tools/lldb-dap/DAP.h
+@@ -125,21 +125,21 @@ struct Variables {
+ 
+ struct StartDebuggingRequestHandler : public lldb::SBCommandPluginInterface {
+   DAP &dap;
+-  explicit StartDebuggingRequestHandler(DAP &d) : dap(d) {};
++  explicit StartDebuggingRequestHandler(DAP &d) : dap(d){};
+   bool DoExecute(lldb::SBDebugger debugger, char **command,
+                  lldb::SBCommandReturnObject &result) override;
+ };
+ 
+ struct ReplModeRequestHandler : public lldb::SBCommandPluginInterface {
+   DAP &dap;
+-  explicit ReplModeRequestHandler(DAP &d) : dap(d) {};
++  explicit ReplModeRequestHandler(DAP &d) : dap(d){};
+   bool DoExecute(lldb::SBDebugger debugger, char **command,
+                  lldb::SBCommandReturnObject &result) override;
+ };
+ 
+ struct SendEventRequestHandler : public lldb::SBCommandPluginInterface {
+   DAP &dap;
+-  explicit SendEventRequestHandler(DAP &d) : dap(d) {};
++  explicit SendEventRequestHandler(DAP &d) : dap(d){};
+   bool DoExecute(lldb::SBDebugger debugger, char **command,
+                  lldb::SBCommandReturnObject &result) override;
+ };
+@@ -147,7 +147,6 @@ struct SendEventRequestHandler : public 
lldb::SBCommandPluginInterface {
+ struct DAP {
+   std::string name;
+   llvm::StringRef debug_adapter_path;
+-  std::ofstream *log;
+   InputStream input;
+   OutputStream output;
+   lldb::SBFile in;
+@@ -210,8 +209,8 @@ struct DAP {
+   // will contain that expression.
+   std::string last_nonempty_var_expression;
+ 
+-  DAP(std::string name, llvm::StringRef path, std::ofstream *log,
+-      lldb::IOObjectSP input, lldb::IOObjectSP output, ReplMode repl_mode,
++  DAP(std::string name, llvm::StringRef path, lldb::IOObjectSP input,
++      lldb::IOObjectSP output, ReplMode repl_mode,
+       std::vector<std::string> pre_init_commands);
+   ~DAP();
+   DAP(const DAP &rhs) = delete;
+diff --git a/lldb/tools/lldb-dap/DAPLog.cpp b/lldb/tools/lldb-dap/DAPLog.cpp
+new file mode 100644
+index 000000000000..840e995b14af
+--- /dev/null
++++ b/lldb/tools/lldb-dap/DAPLog.cpp
+@@ -0,0 +1,22 @@
++#include "DAPLog.h"
++
++using namespace lldb_private;
++using namespace lldb_dap;
++
++static constexpr Log::Category g_categories[] = {
++    {{"transport"}, {"log DAP transport"}, DAPLog::Transport},
++    {{"protocol"}, {"log protocol handling"}, DAPLog::Protocol},
++    {{"connection"}, {"log connection handling"}, DAPLog::Connection},
++};
++
++static Log::Channel g_log_channel(g_categories, DAPLog::Transport |
++                                                    DAPLog::Protocol |
++                                                    DAPLog::Connection);
++
++template <> Log::Channel &lldb_private::LogChannelFor<DAPLog>() {
++  return g_log_channel;
++}
++
++void lldb_dap::InitializeDAPChannel() {
++  Log::Register("lldb-dap", g_log_channel);
++}
+diff --git a/lldb/tools/lldb-dap/DAPLog.h b/lldb/tools/lldb-dap/DAPLog.h
+new file mode 100644
+index 000000000000..49be7602b2c8
+--- /dev/null
++++ b/lldb/tools/lldb-dap/DAPLog.h
+@@ -0,0 +1,34 @@
++//===-- DAPLog.h ------------------------------------------------*- C++ 
-*-===//
++//
++// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
++// See https://llvm.org/LICENSE.txt for license information.
++// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
++//
++//===----------------------------------------------------------------------===//
++
++#ifndef LLDB_UTILITY_LLDBLOG_H
++#define LLDB_UTILITY_LLDBLOG_H
++
++#include "lldb/Utility/Log.h"
++#include "llvm/ADT/BitmaskEnum.h"
++
++namespace lldb_dap {
++
++enum class DAPLog : lldb_private::Log::MaskType {
++  Transport = lldb_private::Log::ChannelFlag<0>,
++  Protocol = lldb_private::Log::ChannelFlag<1>,
++  Connection = lldb_private::Log::ChannelFlag<2>,
++  LLVM_MARK_AS_BITMASK_ENUM(Connection),
++};
++
++LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
++
++void InitializeDAPChannel();
++
++} // end namespace lldb_dap
++
++namespace lldb_private {
++template <> lldb_private::Log::Channel &LogChannelFor<lldb_dap::DAPLog>();
++} // namespace lldb_private
++
++#endif
+diff --git a/lldb/tools/lldb-dap/EventHelper.cpp 
b/lldb/tools/lldb-dap/EventHelper.cpp
+index 705eb0a457d9..299d8f8a482a 100644
+--- a/lldb/tools/lldb-dap/EventHelper.cpp
++++ b/lldb/tools/lldb-dap/EventHelper.cpp
+@@ -8,6 +8,7 @@
+ 
+ #include "EventHelper.h"
+ #include "DAP.h"
++#include "DAPLog.h"
+ #include "JSONUtils.h"
+ #include "LLDBUtils.h"
+ #include "lldb/API/SBFileSpec.h"
+@@ -21,6 +22,9 @@
+ #endif
+ #endif
+ 
++using namespace lldb_dap;
++using namespace lldb_private;
++
+ namespace lldb_dap {
+ 
+ static void SendThreadExitedEvent(DAP &dap, lldb::tid_t tid) {
+@@ -178,15 +182,14 @@ void SendThreadStoppedEvent(DAP &dap) {
+           SendThreadExitedEvent(dap, tid);
+       }
+     } else {
+-      if (dap.log)
+-        *dap.log << "error: SendThreadStoppedEvent() when process"
+-                    " isn't stopped ("
+-                 << lldb::SBDebugger::StateAsCString(state) << ')' << 
std::endl;
++      LLDB_LOG(GetLog(DAPLog::Protocol),
++               "error: SendThreadStoppedEvent() when process"
++               " isn't stopped ({0})",
++               lldb::SBDebugger::StateAsCString(state));
+     }
+   } else {
+-    if (dap.log)
+-      *dap.log << "error: SendThreadStoppedEvent() invalid process"
+-               << std::endl;
++    LLDB_LOG(GetLog(DAPLog::Protocol),
++             "error: SendThreadStoppedEvent() invalid process");
+   }
+   dap.RunStopCommands();
+ }
+diff --git a/lldb/tools/lldb-dap/IOStream.cpp 
b/lldb/tools/lldb-dap/IOStream.cpp
+index c6f1bfaf3b79..0e93ce811189 100644
+--- a/lldb/tools/lldb-dap/IOStream.cpp
++++ b/lldb/tools/lldb-dap/IOStream.cpp
+@@ -7,12 +7,13 @@
+ 
//===----------------------------------------------------------------------===//
+ 
+ #include "IOStream.h"
++#include "DAPLog.h"
+ #include "lldb/Utility/IOObject.h"
+ #include "lldb/Utility/Status.h"
+-#include <fstream>
+ #include <string>
+ 
+ using namespace lldb_dap;
++using namespace lldb_private;
+ 
+ bool OutputStream::write_full(llvm::StringRef str) {
+   if (!descriptor)
+@@ -23,8 +24,7 @@ bool OutputStream::write_full(llvm::StringRef str) {
+   return status.Success();
+ }
+ 
+-bool InputStream::read_full(std::ofstream *log, size_t length,
+-                            std::string &text) {
++bool InputStream::read_full(size_t length, std::string &text) {
+   if (!descriptor)
+     return false;
+ 
+@@ -39,10 +39,10 @@ bool InputStream::read_full(std::ofstream *log, size_t 
length,
+   return true;
+ }
+ 
+-bool InputStream::read_line(std::ofstream *log, std::string &line) {
++bool InputStream::read_line(std::string &line) {
+   line.clear();
+   while (true) {
+-    if (!read_full(log, 1, line))
++    if (!read_full(1, line))
+       return false;
+ 
+     if (llvm::StringRef(line).ends_with("\r\n"))
+@@ -52,14 +52,13 @@ bool InputStream::read_line(std::ofstream *log, 
std::string &line) {
+   return true;
+ }
+ 
+-bool InputStream::read_expected(std::ofstream *log, llvm::StringRef expected) 
{
++bool InputStream::read_expected(llvm::StringRef expected) {
+   std::string result;
+-  if (!read_full(log, expected.size(), result))
++  if (!read_full(expected.size(), result))
+     return false;
+   if (expected != result) {
+-    if (log)
+-      *log << "Warning: Expected '" << expected.str() << "', got '" << result
+-           << "\n";
++    LLDB_LOG(GetLog(DAPLog::Transport), "Warning: Expected '{0}', got '{1}'",
++             expected, result);
+   }
+   return true;
+ }
+diff --git a/lldb/tools/lldb-dap/IOStream.h b/lldb/tools/lldb-dap/IOStream.h
+index e9fb8e11c92d..c90fee57d047 100644
+--- a/lldb/tools/lldb-dap/IOStream.h
++++ b/lldb/tools/lldb-dap/IOStream.h
+@@ -11,7 +11,6 @@
+ 
+ #include "lldb/lldb-forward.h"
+ #include "llvm/ADT/StringRef.h"
+-#include <fstream>
+ #include <string>
+ 
+ namespace lldb_dap {
+@@ -22,11 +21,11 @@ struct InputStream {
+   explicit InputStream(lldb::IOObjectSP descriptor)
+       : descriptor(std::move(descriptor)) {}
+ 
+-  bool read_full(std::ofstream *log, size_t length, std::string &text);
++  bool read_full(size_t length, std::string &text);
+ 
+-  bool read_line(std::ofstream *log, std::string &line);
++  bool read_line(std::string &line);
+ 
+-  bool read_expected(std::ofstream *log, llvm::StringRef expected);
++  bool read_expected(llvm::StringRef expected);
+ };
+ 
+ struct OutputStream {
+diff --git a/lldb/tools/lldb-dap/lldb-dap.cpp 
b/lldb/tools/lldb-dap/lldb-dap.cpp
+index d005eccfae90..2c337edc86b8 100644
+--- a/lldb/tools/lldb-dap/lldb-dap.cpp
++++ b/lldb/tools/lldb-dap/lldb-dap.cpp
+@@ -7,6 +7,7 @@
+ 
//===----------------------------------------------------------------------===//
+ 
+ #include "DAP.h"
++#include "DAPLog.h"
+ #include "EventHelper.h"
+ #include "Handler/RequestHandler.h"
+ #include "RunInTerminal.h"
+@@ -71,13 +72,7 @@ typedef int socklen_t;
+ #endif
+ 
+ using namespace lldb_dap;
+-using lldb_private::File;
+-using lldb_private::IOObject;
+-using lldb_private::MainLoop;
+-using lldb_private::MainLoopBase;
+-using lldb_private::NativeFile;
+-using lldb_private::Socket;
+-using lldb_private::Status;
++using namespace lldb_private;
+ 
+ namespace {
+ using namespace llvm::opt;
+@@ -277,8 +272,7 @@ validateConnection(llvm::StringRef conn) {
+ 
+ static llvm::Error
+ serveConnection(const Socket::SocketProtocol &protocol, const std::string 
&name,
+-                std::ofstream *log, llvm::StringRef program_path,
+-                const ReplMode default_repl_mode,
++                llvm::StringRef program_path, const ReplMode 
default_repl_mode,
+                 const std::vector<std::string> &pre_init_commands) {
+   Status status;
+   static std::unique_ptr<Socket> listener = Socket::Create(protocol, status);
+@@ -292,8 +286,8 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
+   }
+ 
+   std::string address = llvm::join(listener->GetListeningConnectionURI(), ", 
");
+-  if (log)
+-    *log << "started with connection listeners " << address << "\n";
++  LLDB_LOG(GetLog(DAPLog::Connection), "started with connection listeners 
{0}",
++           address);
+ 
+   llvm::outs() << "Listening for: " << address << "\n";
+   // Ensure listening address are flushed for calles to retrieve the resolve
+@@ -314,12 +308,7 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
+                                           &clientCount](
+                                              std::unique_ptr<Socket> sock) {
+     std::string name = llvm::formatv("client_{0}", clientCount++).str();
+-    if (log) {
+-      auto now = std::chrono::duration<double>(
+-          std::chrono::system_clock::now().time_since_epoch());
+-      *log << llvm::formatv("{0:f9}", now.count()).str()
+-           << " client connected: " << name << "\n";
+-    }
++    LLDB_LOG(GetLog(DAPLog::Connection), "client ({0}) connected", name);
+ 
+     lldb::IOObjectSP io(std::move(sock));
+ 
+@@ -328,8 +317,8 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
+     std::thread client([=, &dap_sessions_condition, &dap_sessions_mutex,
+                         &dap_sessions]() {
+       llvm::set_thread_name(name + ".runloop");
+-      DAP dap = DAP(name, program_path, log, io, io, default_repl_mode,
+-                    pre_init_commands);
++      DAP dap =
++          DAP(name, program_path, io, io, default_repl_mode, 
pre_init_commands);
+ 
+       if (auto Err = dap.ConfigureIO()) {
+         llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(),
+@@ -349,12 +338,7 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
+                                     "DAP session error: ");
+       }
+ 
+-      if (log) {
+-        auto now = std::chrono::duration<double>(
+-            std::chrono::system_clock::now().time_since_epoch());
+-        *log << llvm::formatv("{0:f9}", now.count()).str()
+-             << " client closed: " << name << "\n";
+-      }
++      LLDB_LOG(GetLog(DAPLog::Connection), "client ({0}) closed", name);
+ 
+       std::unique_lock<std::mutex> lock(dap_sessions_mutex);
+       dap_sessions.erase(io.get());
+@@ -372,9 +356,8 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
+     return status.takeError();
+   }
+ 
+-  if (log)
+-    *log << "lldb-dap server shutdown requested, disconnecting remaining "
+-            "clients...\n";
++  LLDB_LOG(GetLog(DAPLog::Connection),
++           "shutdown requested, disconnecting remaining clients");
+ 
+   bool client_failed = false;
+   {
+@@ -402,6 +385,22 @@ serveConnection(const Socket::SocketProtocol &protocol, 
const std::string &name,
+   return llvm::Error::success();
+ }
+ 
++class DAPLogHandler : public lldb_private::LogHandler {
++public:
++  DAPLogHandler(std::unique_ptr<std::ofstream> stream)
++      : m_stream(std::move(stream)) {}
++
++  void Emit(llvm::StringRef message) override {
++    std::lock_guard<std::mutex> guard(m_mutex);
++    (*m_stream) << message.str();
++    m_stream->flush();
++  }
++
++private:
++  std::mutex m_mutex;
++  std::unique_ptr<std::ofstream> m_stream;
++};
++
+ int main(int argc, char *argv[]) {
+   llvm::InitLLVM IL(argc, argv, /*InstallPipeSignalExitHandler=*/false);
+ #if !defined(__APPLE__)
+@@ -490,10 +489,20 @@ int main(int argc, char *argv[]) {
+   }
+ #endif
+ 
+-  std::unique_ptr<std::ofstream> log = nullptr;
++  InitializeDAPChannel();
++
+   const char *log_file_path = getenv("LLDBDAP_LOG");
+-  if (log_file_path)
+-    log = std::make_unique<std::ofstream>(log_file_path);
++  if (log_file_path) {
++    std::unique_ptr<std::ofstream> log =
++        std::make_unique<std::ofstream>(log_file_path);
++
++    if (!lldb_private::Log::EnableLogChannel(
++            std::make_shared<DAPLogHandler>(std::move(log)),
++            LLDB_LOG_OPTION_PREPEND_TIMESTAMP, "lldb-dap", {"all"},
++            llvm::errs())) {
++      return EXIT_FAILURE;
++    }
++  }
+ 
+   // Initialize LLDB first before we do anything.
+   lldb::SBError error = lldb::SBDebugger::InitializeWithErrorHandling();
+@@ -525,7 +534,7 @@ int main(int argc, char *argv[]) {
+     Socket::SocketProtocol protocol;
+     std::string name;
+     std::tie(protocol, name) = *maybeProtoclAndName;
+-    if (auto Err = serveConnection(protocol, name, log.get(), program_path,
++    if (auto Err = serveConnection(protocol, name, program_path,
+                                    default_repl_mode, pre_init_commands)) {
+       llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(),
+                                   "Connection failed: ");
+@@ -559,7 +568,7 @@ int main(int argc, char *argv[]) {
+   lldb::IOObjectSP output = std::make_shared<NativeFile>(
+       stdout_fd, File::eOpenOptionWriteOnly, false);
+ 
+-  DAP dap = DAP("stdin/stdout", program_path, log.get(), std::move(input),
++  DAP dap = DAP("stdin/stdout", program_path, std::move(input),
+                 std::move(output), default_repl_mode, pre_init_commands);
+ 
+   // stdout/stderr redirection to the IDE's console
+-- 
+2.48.1.711.g2feabab25a-goog
+
diff --git a/lldb/tools/lldb-dap/DAP.h b/lldb/tools/lldb-dap/DAP.h
index ea5e17eb5d95f..d587d36b9ee8b 100644
--- a/lldb/tools/lldb-dap/DAP.h
+++ b/lldb/tools/lldb-dap/DAP.h
@@ -125,21 +125,21 @@ struct Variables {
 
 struct StartDebuggingRequestHandler : public lldb::SBCommandPluginInterface {
   DAP &dap;
-  explicit StartDebuggingRequestHandler(DAP &d) : dap(d){};
+  explicit StartDebuggingRequestHandler(DAP &d) : dap(d) {};
   bool DoExecute(lldb::SBDebugger debugger, char **command,
                  lldb::SBCommandReturnObject &result) override;
 };
 
 struct ReplModeRequestHandler : public lldb::SBCommandPluginInterface {
   DAP &dap;
-  explicit ReplModeRequestHandler(DAP &d) : dap(d){};
+  explicit ReplModeRequestHandler(DAP &d) : dap(d) {};
   bool DoExecute(lldb::SBDebugger debugger, char **command,
                  lldb::SBCommandReturnObject &result) override;
 };
 
 struct SendEventRequestHandler : public lldb::SBCommandPluginInterface {
   DAP &dap;
-  explicit SendEventRequestHandler(DAP &d) : dap(d){};
+  explicit SendEventRequestHandler(DAP &d) : dap(d) {};
   bool DoExecute(lldb::SBDebugger debugger, char **command,
                  lldb::SBCommandReturnObject &result) override;
 };

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to