[Lldb-commits] [lldb] [llvm] Revert "Fix for #177160 : [lldb] Real-time console pane for output in lldb tui (#197473) (PR #197884)
via lldb-commits
lldb-commits at lists.llvm.org
Fri May 15 01:47:13 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Ebuka Ezike (da-viper)
<details>
<summary>Changes</summary>
This reverts commit cd25475854ecf2b564f91db7f6267edca7868d41.
---
Patch is 31.45 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/197884.diff
8 Files Affected:
- (modified) lldb/include/lldb/Core/Debugger.h (-2)
- (modified) lldb/source/Core/CoreProperties.td (-4)
- (modified) lldb/source/Core/Debugger.cpp (-6)
- (modified) lldb/source/Core/IOHandlerCursesGUI.cpp (+23-357)
- (removed) lldb/test/API/commands/gui/console-output/Makefile (-2)
- (removed) lldb/test/API/commands/gui/console-output/TestGuiConsoleOutput.py (-162)
- (removed) lldb/test/API/commands/gui/console-output/main.cpp (-39)
- (modified) llvm/docs/ReleaseNotes.md (-1)
``````````diff
diff --git a/lldb/include/lldb/Core/Debugger.h b/lldb/include/lldb/Core/Debugger.h
index 82d86f988f07f..e53e916d78cc1 100644
--- a/lldb/include/lldb/Core/Debugger.h
+++ b/lldb/include/lldb/Core/Debugger.h
@@ -406,8 +406,6 @@ class Debugger : public std::enable_shared_from_this<Debugger>,
bool SetShowInlineDiagnostics(bool);
- uint64_t GetGuiMaxConsoleLines() const;
-
bool LoadPlugin(const FileSpec &spec, Status &error);
void RunIOHandlers();
diff --git a/lldb/source/Core/CoreProperties.td b/lldb/source/Core/CoreProperties.td
index e4a565e97b81f..8cea0931868aa 100644
--- a/lldb/source/Core/CoreProperties.td
+++ b/lldb/source/Core/CoreProperties.td
@@ -293,8 +293,4 @@ let Definition = "debugger", Path = "" in {
Global,
DefaultFalse,
Desc<"Controls whether diagnostics can refer directly to the command input, drawing arrows to it. If false, diagnostics will echo the input.">;
- def GuiMaxConsoleLines: Property<"gui-console-max-lines", "UInt64">,
- Global,
- DefaultUnsignedValue<10000>,
- Desc<"The maximum number of lines to keep in the console output window.">;
}
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp
index e9fe71108c572..48e03881fa3b5 100644
--- a/lldb/source/Core/Debugger.cpp
+++ b/lldb/source/Core/Debugger.cpp
@@ -780,12 +780,6 @@ bool Debugger::SetShowInlineDiagnostics(bool b) {
return SetPropertyAtIndex(idx, b);
}
-uint64_t Debugger::GetGuiMaxConsoleLines() const {
- const uint32_t idx = ePropertyGuiMaxConsoleLines;
- return GetPropertyAtIndexAs<uint64_t>(
- idx, g_debugger_properties[idx].default_uint_value);
-}
-
#pragma mark Debugger
// const DebuggerPropertiesSP &
diff --git a/lldb/source/Core/IOHandlerCursesGUI.cpp b/lldb/source/Core/IOHandlerCursesGUI.cpp
index ff2cd2777af67..5b70917f11cbd 100644
--- a/lldb/source/Core/IOHandlerCursesGUI.cpp
+++ b/lldb/source/Core/IOHandlerCursesGUI.cpp
@@ -327,8 +327,6 @@ class WindowDelegate {
virtual const char *WindowDelegateGetHelpText() { return nullptr; }
virtual KeyHelp *WindowDelegateGetKeyHelp() { return nullptr; }
-
- virtual void WindowDelegateProcessEvent(const lldb::EventSP &event_sp) {}
};
class HelpDialogDelegate : public WindowDelegate {
@@ -801,13 +799,6 @@ class Window : public Surface {
subwindow_sp->Draw(force);
}
- void HandleProcessEvent(const lldb::EventSP &event_sp) {
- if (m_delegate_sp)
- m_delegate_sp->WindowDelegateProcessEvent(event_sp);
- for (auto &subwindow_sp : m_subwindows)
- subwindow_sp->HandleProcessEvent(event_sp);
- }
-
bool CreateHelpSubwindow() {
if (m_delegate_sp) {
const char *text = m_delegate_sp->WindowDelegateGetHelpText();
@@ -4394,11 +4385,6 @@ class Application {
ConstString broadcaster_class(
broadcaster->GetBroadcasterClass());
if (broadcaster_class == broadcaster_class_process) {
- uint32_t event_type = event_sp->GetType();
- if (event_type & (Process::eBroadcastBitSTDOUT |
- Process::eBroadcastBitSTDERR)) {
- m_window_sp->HandleProcessEvent(event_sp);
- }
m_update_screen = true;
continue; // Don't get any key, just update our view
}
@@ -6325,233 +6311,6 @@ HandleCharResult HelpDialogDelegate::WindowDelegateHandleChar(Window &window,
return eKeyHandled;
}
-class ConsoleOutputWindowDelegate : public WindowDelegate {
-private:
- void PollProcessOutput() {
- ExecutionContext exe_ctx =
- m_debugger.GetCommandInterpreter().GetExecutionContext();
- Process *process = exe_ctx.GetProcessPtr();
-
- if (!process || !process->IsAlive())
- return;
-
- // Buffer for reading output.
- char buffer[1024];
- Status error;
-
- // Read all available stdout.
- size_t bytes;
- while ((bytes = process->GetSTDOUT(buffer, sizeof(buffer), error)) > 0)
- AppendOutput(buffer, bytes, false);
-
- // Read all available stderr.
- while ((bytes = process->GetSTDERR(buffer, sizeof(buffer), error)) > 0)
- AppendOutput(buffer, bytes, true);
- }
-
- void AppendOutput(const char *text, size_t len, bool is_stderr) {
- if (!text || len == 0)
- return;
-
- std::lock_guard<std::mutex> lock(m_output_mutex);
-
- // Split text into lines and add to buffer.
- std::string remaining = m_partial_line;
- remaining.append(text, len);
-
- size_t start = 0, pos = 0;
- while ((pos = remaining.find('\n', start)) != std::string::npos) {
- std::string line = remaining.substr(start, pos - start);
- if (is_stderr)
- line = "[stderr] " + line;
- m_output_lines.push_back(line);
-
- // Keep buffer size under limit.
- size_t max_lines = m_debugger.GetGuiMaxConsoleLines();
- while (m_output_lines.size() > max_lines) {
- m_output_lines.pop_front();
- if (m_first_visible_line > 0)
- --m_first_visible_line;
- }
-
- start = pos + 1;
- }
-
- // Save any remaining partial line.
- m_partial_line = remaining.substr(start);
-
- // Auto-scroll to bottom if enabled.
- if (m_auto_scroll && !m_output_lines.empty()) {
- m_first_visible_line =
- m_output_lines.size() > 0 ? m_output_lines.size() - 1 : 0;
- }
- }
-
-public:
- ConsoleOutputWindowDelegate(Debugger &debugger)
- : m_debugger(debugger), m_first_visible_line(0), m_auto_scroll(true) {}
-
- ~ConsoleOutputWindowDelegate() override = default;
-
- void WindowDelegateProcessEvent(const lldb::EventSP &event_sp) override {
- if (event_sp->GetType() &
- (Process::eBroadcastBitSTDOUT | Process::eBroadcastBitSTDERR))
- PollProcessOutput();
- }
-
- bool WindowDelegateDraw(Window &window, bool force) override {
- std::lock_guard<std::mutex> lock(m_output_mutex);
-
- window.Erase();
- window.DrawTitleBox(window.GetName());
-
- const int width = window.GetWidth();
- const int height = window.GetHeight();
-
- // Calculate the visible range.
- size_t total_lines = m_output_lines.size();
- if (total_lines == 0) {
- window.MoveCursor(2, 1);
- window.PutCString("(no output yet)");
- return true;
- }
-
- // Adjust scroll pos if needed.
- if (m_first_visible_line >= total_lines) {
- m_first_visible_line = total_lines > 0 ? total_lines - 1 : 0;
- }
-
- // Draw visible line.
- int visible_height = height - 2;
- size_t start_line = m_first_visible_line;
-
- // If we are at the end, display last N lines.
- if (m_auto_scroll || start_line + visible_height > total_lines) {
- start_line = total_lines > static_cast<size_t>(visible_height)
- ? total_lines - visible_height
- : 0;
- }
-
- for (int row = 1;
- row <= visible_height && (start_line + row - 1) < total_lines; ++row) {
- window.MoveCursor(2, row);
- const std::string &line = m_output_lines[start_line + row - 1];
-
- // Highlight stderr lines?.
- bool is_stderr = (line.find("[stderr]") == 0);
- if (is_stderr)
- window.AttributeOn(COLOR_PAIR(2));
-
- // Truncate line to fit window width.
- int available_width = width - 3;
- if (static_cast<int>(line.length()) > available_width)
- window.PutCString(line.substr(0, available_width).c_str());
- else
- window.PutCString(line.c_str());
-
- if (is_stderr)
- window.AttributeOff(COLOR_PAIR(2));
- }
-
- return true;
- }
-
- HandleCharResult WindowDelegateHandleChar(Window &window, int key) override {
- std::lock_guard<std::mutex> lock(m_output_mutex);
-
- size_t total_lines = m_output_lines.size();
- int visible_height = window.GetHeight() - 1;
-
- switch (key) {
- case KEY_UP:
- if (m_first_visible_line > 0) {
- --m_first_visible_line;
- m_auto_scroll = false;
- }
- return eKeyHandled;
-
- case KEY_DOWN:
- if (m_first_visible_line + visible_height < total_lines)
- ++m_first_visible_line;
- // Re-enable Auto-scroll at bottom.
- if (m_first_visible_line + visible_height >= total_lines)
- m_auto_scroll = true;
- return eKeyHandled;
-
- case KEY_PPAGE:
- if (m_first_visible_line > static_cast<size_t>(visible_height))
- m_first_visible_line -= visible_height;
- else
- m_first_visible_line = 0;
- m_auto_scroll = false;
- return eKeyHandled;
-
- case KEY_NPAGE:
- m_first_visible_line += visible_height;
- if (m_first_visible_line + visible_height >= total_lines) {
- m_first_visible_line = total_lines > static_cast<size_t>(visible_height)
- ? total_lines - visible_height
- : 0;
- m_auto_scroll = true;
- }
- return eKeyHandled;
-
- case 'a':
- m_auto_scroll = !m_auto_scroll;
- if (m_auto_scroll && total_lines > 0)
- m_first_visible_line = total_lines > static_cast<size_t>(visible_height)
- ? total_lines - visible_height
- : 0;
- return eKeyHandled;
-
- case 'c':
- m_output_lines.clear();
- m_partial_line.clear();
- m_first_visible_line = 0;
- return eKeyHandled;
-
- case KEY_HOME:
- m_first_visible_line = 0;
- m_auto_scroll = false;
- return eKeyHandled;
-
- case KEY_END:
- m_first_visible_line = total_lines > static_cast<size_t>(visible_height)
- ? total_lines - visible_height
- : 0;
- m_auto_scroll = true;
- return eKeyHandled;
-
- default:
- break;
- }
-
- return eKeyNotHandled;
- }
-
- const char *WindowDelegateGetHelpText() override {
- return "Console Output view shows stdout and stderr from the process.";
- }
-
- KeyHelp *WindowDelegateGetKeyHelp() override {
- static curses::KeyHelp g_source_view_key_help[] = {
- {KEY_UP, "Scroll up"}, {KEY_DOWN, "Scroll down"},
- {KEY_PPAGE, "Page up"}, {KEY_NPAGE, "Page down"},
- {KEY_HOME, "Go to top"}, {KEY_END, "Go to bottom"},
- {'h', "Show help dialog"}, {'a', "Toggle auto-scroll"},
- {'c', "Clear output"}, {'\0', nullptr}};
- return g_source_view_key_help;
- }
-
-protected:
- Debugger &m_debugger;
- std::deque<std::string> m_output_lines;
- std::string m_partial_line;
- size_t m_first_visible_line = 0;
- bool m_auto_scroll = true;
- std::mutex m_output_mutex;
-};
-
class ApplicationDelegate : public WindowDelegate, public MenuDelegate {
public:
enum {
@@ -6583,7 +6342,6 @@ class ApplicationDelegate : public WindowDelegate, public MenuDelegate {
eMenuID_ViewSource,
eMenuID_ViewVariables,
eMenuID_ViewBreakpoints,
- eMenuId_ViewConsole,
eMenuID_Help,
eMenuID_HelpGUIHelp
@@ -6594,14 +6352,6 @@ class ApplicationDelegate : public WindowDelegate, public MenuDelegate {
~ApplicationDelegate() override = default;
- WindowDelegateSP GetConsoleDelegate() {
- if (!m_console_delegate_sp) {
- m_console_delegate_sp =
- WindowDelegateSP(new ConsoleOutputWindowDelegate(m_debugger));
- }
- return m_console_delegate_sp;
- }
-
bool WindowDelegateDraw(Window &window, bool force) override {
return false; // Drawing not handled, let standard window drawing happen
}
@@ -6832,7 +6582,6 @@ class ApplicationDelegate : public WindowDelegate, public MenuDelegate {
WindowSP main_window_sp = m_app.GetMainWindow();
WindowSP source_window_sp = main_window_sp->FindSubWindow("Source");
WindowSP variables_window_sp = main_window_sp->FindSubWindow("Variables");
- WindowSP console_window_sp = main_window_sp->FindSubWindow("Console");
WindowSP registers_window_sp = main_window_sp->FindSubWindow("Registers");
const Rect source_bounds = source_window_sp->GetBounds();
@@ -6841,52 +6590,39 @@ class ApplicationDelegate : public WindowDelegate, public MenuDelegate {
main_window_sp->RemoveSubWindow(variables_window_sp.get());
- if (console_window_sp) {
- Rect console_bounds = console_window_sp->GetBounds();
- console_bounds.origin.x = variables_bounds.origin.x;
- console_bounds.size.width =
- variables_bounds.size.width + console_bounds.size.width;
- console_window_sp->SetBounds(console_bounds);
- } else if (registers_window_sp) {
+ if (registers_window_sp) {
// We have a registers window, so give all the area back to the
- // registers window.
+ // registers window
Rect registers_bounds = variables_bounds;
registers_bounds.size.width = source_bounds.size.width;
registers_window_sp->SetBounds(registers_bounds);
} else {
- // We have no console or registers window showing so give the bottom
- // area back to the source view.
+ // We have no registers window showing so give the bottom area back
+ // to the source view
source_window_sp->Resize(source_bounds.size.width,
source_bounds.size.height +
variables_bounds.size.height);
}
} else {
- Rect new_vars_rect;
- if (console_window_sp) {
- // Console exists, so split the area.
- const Rect console_bounds = console_window_sp->GetBounds();
- Rect new_console_rect;
- console_bounds.VerticalSplitPercentage(0.50, new_vars_rect,
- new_console_rect);
- } else if (registers_window_sp) {
+ Rect new_variables_rect;
+ if (registers_window_sp) {
// We have a registers window so split the area of the registers
// window into two columns where the left hand side will be the
- // variables and the right hand side will be the registers.
- const Rect registers_bounds = registers_window_sp->GetBounds();
- Rect new_regs_rect;
- registers_bounds.VerticalSplitPercentage(0.50, new_vars_rect,
- new_regs_rect);
- registers_window_sp->SetBounds(new_regs_rect);
+ // variables and the right hand side will be the registers
+ const Rect variables_bounds = registers_window_sp->GetBounds();
+ Rect new_registers_rect;
+ variables_bounds.VerticalSplitPercentage(0.50, new_variables_rect,
+ new_registers_rect);
+ registers_window_sp->SetBounds(new_registers_rect);
} else {
- // No registers or console window, grab the bottom part of the source
- // window.
+ // No registers window, grab the bottom part of the source window
Rect new_source_rect;
source_bounds.HorizontalSplitPercentage(0.70, new_source_rect,
- new_vars_rect);
+ new_variables_rect);
source_window_sp->SetBounds(new_source_rect);
}
- WindowSP new_window_sp =
- main_window_sp->CreateSubWindow("Variables", new_vars_rect, false);
+ WindowSP new_window_sp = main_window_sp->CreateSubWindow(
+ "Variables", new_variables_rect, false);
new_window_sp->SetDelegate(
WindowDelegateSP(new FrameVariablesWindowDelegate(m_debugger)));
}
@@ -6906,13 +6642,13 @@ class ApplicationDelegate : public WindowDelegate, public MenuDelegate {
const Rect variables_bounds = variables_window_sp->GetBounds();
// We have a variables window, so give all the area back to the
- // variables window.
+ // variables window
variables_window_sp->Resize(variables_bounds.size.width +
registers_window_sp->GetWidth(),
variables_bounds.size.height);
} else {
// We have no variables window showing so give the bottom area back
- // to the source view.
+ // to the source view
source_window_sp->Resize(source_bounds.size.width,
source_bounds.size.height +
registers_window_sp->GetHeight());
@@ -6923,14 +6659,14 @@ class ApplicationDelegate : public WindowDelegate, public MenuDelegate {
if (variables_window_sp) {
// We have a variables window, split it into two columns where the
// left hand side will be the variables and the right hand side will
- // be the registers.
+ // be the registers
const Rect variables_bounds = variables_window_sp->GetBounds();
Rect new_vars_rect;
variables_bounds.VerticalSplitPercentage(0.50, new_vars_rect,
new_regs_rect);
variables_window_sp->SetBounds(new_vars_rect);
} else {
- // No variables window, grab the bottom part of the source window.
+ // No variables window, grab the bottom part of the source window
Rect new_source_rect;
source_bounds.HorizontalSplitPercentage(0.70, new_source_rect,
new_regs_rect);
@@ -6945,66 +6681,6 @@ class ApplicationDelegate : public WindowDelegate, public MenuDelegate {
}
return MenuActionResult::Handled;
- case eMenuId_ViewConsole: {
- WindowSP main_window_sp = m_app.GetMainWindow();
- WindowSP source_window_sp = main_window_sp->FindSubWindow("Source");
- WindowSP console_window_sp = main_window_sp->FindSubWindow("Console");
- WindowSP variables_window_sp = main_window_sp->FindSubWindow("Variables");
- WindowSP registers_window_sp = main_window_sp->FindSubWindow("Registers");
- const Rect source_bounds = source_window_sp->GetBounds();
-
- if (console_window_sp) {
- const Rect console_bounds = console_window_sp->GetBounds();
- main_window_sp->RemoveSubWindow(console_window_sp.get());
-
- if (variables_window_sp) {
- // Variables window exists, so give Console space to Variables.
- Rect variables_bounds = variables_window_sp->GetBounds();
- variables_bounds.size.width =
- variables_bounds.size.width + console_bounds.size.width;
- variables_window_sp->SetBounds(variables_bounds);
- } else if (registers_window_sp) {
- // Registers window exists, so give Console space to Registers.
- Rect registers_bounds = registers_window_sp->GetBounds();
- registers_bounds.size.width = source_bounds.size.width;
- registers_window_sp->SetBounds(registers_bounds);
- } else {
- // No Variables or Registers window exists.
- source_window_sp->Resize(source_bounds.size.width,
- source_bounds.size.height +
- console_bounds.size.height);
- }
- } else {
- Rect new_console_rect;
- if (variables_window_sp) {
- // Variable window exists, split area.
- const Rect variables_bounds = variables_window_sp->GetBounds();
- Rect new_vars_rect;
- variables_bounds.VerticalSplitPercentage(0.50, new_vars_rect,
- new_console_rect);
- variables_window_sp->SetBounds(new_vars_rect);
- } else if (registers_window_sp) {
- // Registers window exists, split area.
- const Rect registers_bounds = registers_window_sp->GetBounds();
- Rect new_regs_rect;
- registers_bounds.VerticalSplitPercentage(0.50, new_console_rect,
- new_regs_rect);
- registers_window_sp->SetBounds(new_regs_rect);
- } else {
- // No Registers or Variables window exists, split source area.
- Rect new_source_rect;
- source_bounds.HorizontalSplitPercentage(0.70, new_source_rect,
- new_console_rect);
- source_window_sp->SetB...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/197884
More information about the lldb-commits
mailing list