[Lldb-commits] [lldb] 906eeed - [lldb] Store the command in the CommandReturnObject (#125132)
via lldb-commits
lldb-commits at lists.llvm.org
Tue Feb 4 08:55:35 PST 2025
Author: Jonas Devlieghere
Date: 2025-02-04T08:55:30-08:00
New Revision: 906eeeda833b30fb7fdc3b7586de34b65d575b45
URL: https://github.com/llvm/llvm-project/commit/906eeeda833b30fb7fdc3b7586de34b65d575b45
DIFF: https://github.com/llvm/llvm-project/commit/906eeeda833b30fb7fdc3b7586de34b65d575b45.diff
LOG: [lldb] Store the command in the CommandReturnObject (#125132)
As suggested in #125006. Depending on which PR lands first, I'll update
`TestCommandInterepterPrintCallback.py` to check that the
`CommandReturnObject` passed to the callback has the correct command.
Added:
lldb/test/API/python_api/commandreturnobject/TestSBCommandReturnObject.py
Modified:
lldb/include/lldb/API/SBCommandReturnObject.h
lldb/include/lldb/Interpreter/CommandReturnObject.h
lldb/source/API/SBCommandReturnObject.cpp
lldb/source/Interpreter/CommandInterpreter.cpp
Removed:
################################################################################
diff --git a/lldb/include/lldb/API/SBCommandReturnObject.h b/lldb/include/lldb/API/SBCommandReturnObject.h
index e8e20a3f3016b8..9a63c1f96aa707 100644
--- a/lldb/include/lldb/API/SBCommandReturnObject.h
+++ b/lldb/include/lldb/API/SBCommandReturnObject.h
@@ -42,6 +42,10 @@ class LLDB_API SBCommandReturnObject {
bool IsValid() const;
+ /// Get the command as the user typed it. Empty string if commands were run on
+ /// behalf of lldb.
+ const char *GetCommand();
+
const char *GetOutput();
const char *GetError();
diff --git a/lldb/include/lldb/Interpreter/CommandReturnObject.h b/lldb/include/lldb/Interpreter/CommandReturnObject.h
index f96da34889a324..803bcd76995ede 100644
--- a/lldb/include/lldb/Interpreter/CommandReturnObject.h
+++ b/lldb/include/lldb/Interpreter/CommandReturnObject.h
@@ -31,6 +31,12 @@ class CommandReturnObject {
~CommandReturnObject() = default;
+ /// Get the command as the user typed it. Empty string if commands were run on
+ /// behalf of lldb.
+ const std::string &GetCommand() const { return m_command; }
+
+ void SetCommand(std::string command) { m_command = std::move(command); }
+
/// Format any inline diagnostics with an indentation of \c indent.
std::string GetInlineDiagnosticString(unsigned indent) const;
@@ -182,6 +188,8 @@ class CommandReturnObject {
private:
enum { eStreamStringIndex = 0, eImmediateStreamIndex = 1 };
+ std::string m_command;
+
StreamTee m_out_stream;
StreamTee m_err_stream;
std::vector<DiagnosticDetail> m_diagnostics;
diff --git a/lldb/source/API/SBCommandReturnObject.cpp b/lldb/source/API/SBCommandReturnObject.cpp
index 9df8aa48b99366..6f54581e64ef41 100644
--- a/lldb/source/API/SBCommandReturnObject.cpp
+++ b/lldb/source/API/SBCommandReturnObject.cpp
@@ -84,6 +84,13 @@ SBCommandReturnObject::operator bool() const {
return true;
}
+const char *SBCommandReturnObject::GetCommand() {
+ LLDB_INSTRUMENT_VA(this);
+
+ ConstString output(ref().GetCommand());
+ return output.AsCString(/*value_if_empty*/ "");
+}
+
const char *SBCommandReturnObject::GetOutput() {
LLDB_INSTRUMENT_VA(this);
diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp
index 4869b811f99e71..8398226da10961 100644
--- a/lldb/source/Interpreter/CommandInterpreter.cpp
+++ b/lldb/source/Interpreter/CommandInterpreter.cpp
@@ -1887,12 +1887,13 @@ bool CommandInterpreter::HandleCommand(const char *command_line,
std::string real_original_command_string(command_string);
Log *log = GetLog(LLDBLog::Commands);
- llvm::PrettyStackTraceFormat stack_trace("HandleCommand(command = \"%s\")",
- command_line);
-
LLDB_LOGF(log, "Processing command: %s", command_line);
LLDB_SCOPED_TIMERF("Processing command: %s.", command_line);
+ // Set the command in the CommandReturnObject here so that it's there even if
+ // the command is interrupted.
+ result.SetCommand(command_line);
+
if (INTERRUPT_REQUESTED(GetDebugger(), "Interrupted initiating command")) {
result.AppendError("... Interrupted");
return false;
@@ -2644,7 +2645,8 @@ void CommandInterpreter::HandleCommands(
(uint64_t)idx, cmd, error_msg);
m_debugger.SetAsyncExecution(old_async_execution);
return;
- } else if (options.GetPrintResults()) {
+ }
+ if (options.GetPrintResults()) {
result.AppendMessageWithFormatv("Command #{0} '{1}' failed with {2}",
(uint64_t)idx + 1, cmd, error_msg);
}
diff --git a/lldb/test/API/python_api/commandreturnobject/TestSBCommandReturnObject.py b/lldb/test/API/python_api/commandreturnobject/TestSBCommandReturnObject.py
new file mode 100644
index 00000000000000..b0d0b7a8dfe4e7
--- /dev/null
+++ b/lldb/test/API/python_api/commandreturnobject/TestSBCommandReturnObject.py
@@ -0,0 +1,17 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class SBCommandReturnObjectTest(TestBase):
+ NO_DEBUG_INFO_TESTCASE = True
+
+ def test(self):
+ res = lldb.SBCommandReturnObject()
+ self.assertEqual(res.GetCommand(), "")
+
+ ci = self.dbg.GetCommandInterpreter()
+ ci.HandleCommand("help help", res)
+ self.assertTrue(res.Succeeded())
+ self.assertEqual(res.GetCommand(), "help help")
More information about the lldb-commits
mailing list