llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: None (royitaqi)

<details>
<summary>Changes</summary>

# Motivation

Currently, the user can already get the "transcript" (for "what is the 
transcript", see `CommandInterpreter::SaveTranscript()`). However, the only way 
to obtain the transcript data as a user is to first destroy the debugger, then 
read the save directory. Note that destroy-callbacks cannot be used, because 1\ 
transcript data is private to the command interpreter (see 
`CommandInterpreter.h`), and 2\ the writing of the transcript is *after* the 
invocation of destory-callbacks (see `Debugger::Destroy()`).

So basically, there is no way to obtain the transcript:
* during the lifetime of a debugger (including the destroy-callbacks, which is 
often performs logging tasks)
* without relying on external storage


# Proposal

Add a new Python API `SBCommandInterpreter::GetTranscript()`.

Goals:
* It can be called at any time during the debugger's life cycle, including in 
destroy-callbacks.
* It returns data in-memory.

Structured data:
* To make data processing easier, the return type is `SBStructuredData`. See 
comments in code for how the data is organized.
* In the future, `SaveTranscript` can be updated to write different formats 
using such data (e.g. JSON). This is probably accompanied by a new setting 
(e.g. `interpreter.save-session-format`).

# Alternatives

The return type can also be `std::vector&lt;std::pair&lt;std::string, 
SBCommandReturnObject&gt;&gt;`. This will make implementation easier, without 
having to translate it to `SBStructuredData`. On the other hand, 
`SBStructuredData` can convert to JSON easily, so it's more convenient for user 
to process.

---
Full diff: https://github.com/llvm/llvm-project/pull/90703.diff


2 Files Affected:

- (modified) lldb/include/lldb/API/SBCommandInterpreter.h (+9-3) 
- (modified) lldb/source/API/SBCommandInterpreter.cpp (+6-1) 


``````````diff
diff --git a/lldb/include/lldb/API/SBCommandInterpreter.h 
b/lldb/include/lldb/API/SBCommandInterpreter.h
index ba2e049204b8e6..d65f06d676f91f 100644
--- a/lldb/include/lldb/API/SBCommandInterpreter.h
+++ b/lldb/include/lldb/API/SBCommandInterpreter.h
@@ -247,13 +247,13 @@ class SBCommandInterpreter {
                                        lldb::SBStringList &matches,
                                        lldb::SBStringList &descriptions);
 
-  /// Returns whether an interrupt flag was raised either by the SBDebugger - 
+  /// Returns whether an interrupt flag was raised either by the SBDebugger -
   /// when the function is not running on the RunCommandInterpreter thread, or
   /// by SBCommandInterpreter::InterruptCommand if it is.  If your code is 
doing
-  /// interruptible work, check this API periodically, and interrupt if it 
+  /// interruptible work, check this API periodically, and interrupt if it
   /// returns true.
   bool WasInterrupted() const;
-  
+
   /// Interrupts the command currently executing in the RunCommandInterpreter
   /// thread.
   ///
@@ -318,6 +318,12 @@ class SBCommandInterpreter {
 
   SBStructuredData GetStatistics();
 
+  /// Returns a list of handled commands, output and error. Each element in
+  /// the list is a dictionary with three keys: "command" (string), "output"
+  /// (list of strings) and optionally "error" (list of strings). Each string
+  /// in "output" and "error" is a line (without EOL characteres).
+  SBStructuredData GetTranscript();
+
 protected:
   friend class lldb_private::CommandPluginInterfaceImplementation;
 
diff --git a/lldb/source/API/SBCommandInterpreter.cpp 
b/lldb/source/API/SBCommandInterpreter.cpp
index 83c0951c56db60..242b3f8f09c48a 100644
--- a/lldb/source/API/SBCommandInterpreter.cpp
+++ b/lldb/source/API/SBCommandInterpreter.cpp
@@ -150,7 +150,7 @@ bool SBCommandInterpreter::WasInterrupted() const {
 
 bool SBCommandInterpreter::InterruptCommand() {
   LLDB_INSTRUMENT_VA(this);
-  
+
   return (IsValid() ? m_opaque_ptr->InterruptCommand() : false);
 }
 
@@ -571,6 +571,11 @@ SBStructuredData SBCommandInterpreter::GetStatistics() {
   return data;
 }
 
+SBStructuredData SBCommandInterpreter::GetTranscript() {
+  LLDB_INSTRUMENT_VA(this);
+  return SBStructuredData();
+}
+
 lldb::SBCommand SBCommandInterpreter::AddMultiwordCommand(const char *name,
                                                           const char *help) {
   LLDB_INSTRUMENT_VA(this, name, help);

``````````

</details>


https://github.com/llvm/llvm-project/pull/90703
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to