[Lldb-commits] [lldb] [lldb-dap] Add an introductory message on startup. (PR #170795)

John Harrison via lldb-commits lldb-commits at lists.llvm.org
Fri Dec 5 13:33:22 PST 2025


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

>From 60cb07b17688241060c1c71c97fb1d752774a544 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Thu, 4 Dec 2025 18:18:53 -0800
Subject: [PATCH 1/2] [lldb-dap] Add an introductory message on startup.

This adds an introductory message to try to inform users on how the debug console works and adds a little more information on the current target/process, similiar to the lldb driver.

Here is an example of the introduction:

```
To get started with the lldb-dap debug console try "<variable>", "help [<cmd-name>]", or "apropos <search-word>".
For more information visit https://github.com/llvm/llvm-project/blob/main/lldb/tools/lldb-dap/README.md
Executable binary set to 'a.out' (arm64-apple-macosx15.0.0).
Attached to process 1234.
```

We may want to change the URL for more information to a page under lldb.llvm.org but that does not yet exist.
---
 .../ConfigurationDoneRequestHandler.cpp       |  2 ++
 .../tools/lldb-dap/Handler/RequestHandler.cpp | 21 +++++++++++++++++++
 lldb/tools/lldb-dap/Handler/RequestHandler.h  |  4 ++++
 3 files changed, 27 insertions(+)

diff --git a/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp
index 1bfe7b7f6ef5c..5ef44cba4ebcc 100644
--- a/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/ConfigurationDoneRequestHandler.cpp
@@ -50,6 +50,8 @@ ConfigurationDoneRequestHandler::Run(const ConfigurationDoneArguments &) const {
   /// lldb-dap specific editor extension.
   SendExtraCapabilities(dap);
 
+  PrintIntroductionMessage();
+
   // Clients can request a baseline of currently existing threads after
   // we acknowledge the configurationDone request.
   // Client requests the baseline of currently existing threads after
diff --git a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
index d67437ad5b3ae..3841db45eae8b 100644
--- a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
@@ -17,6 +17,7 @@
 #include "RunInTerminal.h"
 #include "lldb/API/SBDefines.h"
 #include "lldb/API/SBEnvironment.h"
+#include "lldb/API/SBStream.h"
 #include "llvm/Support/Error.h"
 #include <mutex>
 
@@ -261,6 +262,26 @@ void BaseRequestHandler::PrintWelcomeMessage() const {
 #endif
 }
 
+void BaseRequestHandler::PrintIntroductionMessage() const {
+  lldb::SBStream msg;
+  msg.Print("To get started with the lldb-dap debug console try "
+            "\"<variable>\", \"help [<cmd-name>]\", or \"apropos "
+            "<search-word>\".\r\nFor more information visit "
+            "https://github.com/llvm/llvm-project/blob/main/lldb/tools/"
+            "lldb-dap/README.md\r\n");
+  if (dap.target && dap.target.GetExecutable()) {
+    char path[PATH_MAX] = {0};
+    dap.target.GetExecutable().GetPath(path, sizeof(path));
+    msg.Printf("Executable binary set to '%s' (%s).\r\n", path,
+               dap.target.GetTriple());
+  }
+  if (dap.target.GetProcess()) {
+    msg.Printf("Attached to process %llu.\r\n",
+               dap.target.GetProcess().GetProcessID());
+  }
+  dap.SendOutput(OutputType::Console, {msg.GetData(), msg.GetSize()});
+}
+
 bool BaseRequestHandler::HasInstructionGranularity(
     const llvm::json::Object &arguments) const {
   if (std::optional<llvm::StringRef> value = arguments.getString("granularity"))
diff --git a/lldb/tools/lldb-dap/Handler/RequestHandler.h b/lldb/tools/lldb-dap/Handler/RequestHandler.h
index 5d235352b7738..c0b1722d26a9b 100644
--- a/lldb/tools/lldb-dap/Handler/RequestHandler.h
+++ b/lldb/tools/lldb-dap/Handler/RequestHandler.h
@@ -64,6 +64,10 @@ class BaseRequestHandler {
   /// LLDB_DAP_WELCOME_MESSAGE is defined.
   void PrintWelcomeMessage() const;
 
+  /// Prints an introduction to the debug console and information about the
+  /// debug session.
+  void PrintIntroductionMessage() const;
+
   // Takes a LaunchRequest object and launches the process, also handling
   // runInTerminal if applicable. It doesn't do any of the additional
   // initialization and bookkeeping stuff that is needed for `request_launch`.

>From 03e2d3b839cdc6a3a41060ae202f9e5abd184512 Mon Sep 17 00:00:00 2001
From: John Harrison <harjohn at google.com>
Date: Fri, 5 Dec 2025 13:33:05 -0800
Subject: [PATCH 2/2] Adjusting the message, moving part of it to the
 PrintWelcomeMessage function and switched to using llvm::raw_ostream instead
 of lldb::SBStream.

---
 .../tools/lldb-dap/Handler/RequestHandler.cpp | 46 ++++++++++++++-----
 1 file changed, 34 insertions(+), 12 deletions(-)

diff --git a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
index 3841db45eae8b..512896be564aa 100644
--- a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
@@ -17,8 +17,8 @@
 #include "RunInTerminal.h"
 #include "lldb/API/SBDefines.h"
 #include "lldb/API/SBEnvironment.h"
-#include "lldb/API/SBStream.h"
 #include "llvm/Support/Error.h"
+#include "llvm/Support/raw_ostream.h"
 #include <mutex>
 
 #if !defined(_WIN32)
@@ -260,26 +260,48 @@ void BaseRequestHandler::PrintWelcomeMessage() const {
 #ifdef LLDB_DAP_WELCOME_MESSAGE
   dap.SendOutput(OutputType::Console, LLDB_DAP_WELCOME_MESSAGE);
 #endif
+
+  std::string message;
+  llvm::raw_string_ostream OS(message);
+  OS << "To get started with the lldb-dap debug console try ";
+
+  switch (dap.repl_mode) {
+  case ReplMode::Auto:
+    OS << "\"<variable>\", \"<lldb-cmd>\" or \"help [<cmd-name>]\" for more "
+          "information.\r\n";
+    OS << "Use '" << dap.configuration.commandEscapePrefix
+       << "' to prefix commands that may conflict with local variables.\r\n";
+    break;
+  case ReplMode::Command:
+    OS << "\"<lldb-cmd>\" or \"help [<cmd-name>]\" for more information.\r\n";
+    break;
+  case ReplMode::Variable:
+    OS << "\"<variable>\" or \"" << dap.configuration.commandEscapePrefix
+       << "help [<cmd-name>]\" for more information.\r\n";
+    break;
+  }
+
+  OS << "For more information visit "
+        "https://github.com/llvm/llvm-project/blob/main/lldb/tools/"
+        "lldb-dap/README.md#debug-console\r\n";
+
+  dap.SendOutput(OutputType::Console, message);
 }
 
 void BaseRequestHandler::PrintIntroductionMessage() const {
-  lldb::SBStream msg;
-  msg.Print("To get started with the lldb-dap debug console try "
-            "\"<variable>\", \"help [<cmd-name>]\", or \"apropos "
-            "<search-word>\".\r\nFor more information visit "
-            "https://github.com/llvm/llvm-project/blob/main/lldb/tools/"
-            "lldb-dap/README.md\r\n");
+  std::string msg;
+  llvm::raw_string_ostream os(msg);
   if (dap.target && dap.target.GetExecutable()) {
     char path[PATH_MAX] = {0};
     dap.target.GetExecutable().GetPath(path, sizeof(path));
-    msg.Printf("Executable binary set to '%s' (%s).\r\n", path,
-               dap.target.GetTriple());
+    os << llvm::formatv("Executable binary set to '{0}' ({1}).\r\n", path,
+                        dap.target.GetTriple());
   }
   if (dap.target.GetProcess()) {
-    msg.Printf("Attached to process %llu.\r\n",
-               dap.target.GetProcess().GetProcessID());
+    os << llvm::formatv("Attached to process {0}\r\n",
+                        dap.target.GetProcess().GetProcessID());
   }
-  dap.SendOutput(OutputType::Console, {msg.GetData(), msg.GetSize()});
+  dap.SendOutput(OutputType::Console, msg);
 }
 
 bool BaseRequestHandler::HasInstructionGranularity(



More information about the lldb-commits mailing list