diff --git a/lldb/include/lldb/Core/DebuggerEvents.h b/lldb/include/lldb/Core/DebuggerEvents.h --- a/lldb/include/lldb/Core/DebuggerEvents.h +++ b/lldb/include/lldb/Core/DebuggerEvents.h @@ -32,6 +32,7 @@ static const ProgressEventData *GetEventDataFromEvent(const Event *event_ptr); uint64_t GetID() const { return m_id; } + bool IsFinite() const { return m_total != UINT64_MAX; } uint64_t GetCompleted() const { return m_completed; } uint64_t GetTotal() const { return m_total; } const std::string &GetMessage() const { return m_message; } diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -1857,11 +1857,26 @@ output->Printf( "%s", ansi::FormatAnsiTerminalCodes(ansi_prefix, use_color).c_str()); - // Print the progress message. + // Trim the progress message if it exceeds the window's width and print it. std::string message = data->GetMessage(); - if (data->GetTotal() != UINT64_MAX) { + uint64_t progress_total = data->GetTotal(); + uint32_t term_width = GetTerminalWidth(); + + size_t prefix_width = 0; + if (data->IsFinite()) { + prefix_width += 4; // '[%PRIu64/%PRIu64] %s' + prefix_width += std::to_string(progress_total).size() * 2; + } + + const size_t suffix_width = 3; // %s... + + if (message.size() + prefix_width + suffix_width >= term_width) + message.erase(message.begin() + term_width - prefix_width - suffix_width, + message.end()); + + if (data->IsFinite()) { output->Printf("[%" PRIu64 "/%" PRIu64 "] %s...", data->GetCompleted(), - data->GetTotal(), message.c_str()); + progress_total, message.c_str()); } else { output->Printf("%s...", message.c_str()); }