diff --git a/lldb/source/Plugins/Trace/intel-pt/DecodedThread.h b/lldb/source/Plugins/Trace/intel-pt/DecodedThread.h --- a/lldb/source/Plugins/Trace/intel-pt/DecodedThread.h +++ b/lldb/source/Plugins/Trace/intel-pt/DecodedThread.h @@ -81,6 +81,11 @@ /// The instruction pointer address, or \a LLDB_INVALID_ADDRESS if it is /// an error. lldb::addr_t GetLoadAddress() const; + + /// Get the size in bytes of non-error instance of this class + static size_t GetNonErrorMemoryUsage() { + return sizeof(IntelPTInstruction); + } /// \return /// An \a llvm::Error object if this class corresponds to an Error, or an @@ -112,6 +117,8 @@ IntelPTInstruction(const IntelPTInstruction &other) = delete; const IntelPTInstruction &operator=(const IntelPTInstruction &other) = delete; + // When adding new members to this class, make sure to update + // IntelPTInstruction:: GetNonErrorMemoryUsage() if needed. pt_insn m_pt_insn; llvm::Optional m_timestamp; std::unique_ptr m_error; @@ -150,7 +157,13 @@ /// The size of the trace. size_t GetRawTraceSize() const; + /// The approximate size in bytes used by this instance, + /// including all the already decoded instructions. + size_t CalculateApproximateMemoryUsage() const; + private: + /// When adding new members to this class, make sure + /// to update \a CalculateApproximateMemoryUsage() accordingly. lldb::ThreadSP m_thread_sp; std::vector m_instructions; size_t m_raw_trace_size; diff --git a/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp b/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp --- a/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp +++ b/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp @@ -116,3 +116,14 @@ lldb::TraceCursorUP DecodedThread::GetCursor() { return std::make_unique(m_thread_sp, shared_from_this()); } + +size_t DecodedThread::CalculateApproximateMemoryUsage() const { + size_t non_err_instruction_count = 0; + for (const IntelPTInstruction &insn : m_instructions) + if (!insn.IsError()) + non_err_instruction_count++; + + return m_raw_trace_size + + IntelPTInstruction::GetNonErrorMemoryUsage() * non_err_instruction_count + + sizeof(DecodedThread); +} diff --git a/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp b/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp --- a/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp +++ b/lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp @@ -105,15 +105,18 @@ void TraceIntelPT::DumpTraceInfo(Thread &thread, Stream &s, bool verbose) { Optional raw_size = GetRawTraceSize(thread); + size_t mem_used = Decode(thread)->CalculateApproximateMemoryUsage(); s.Printf("\nthread #%u: tid = %" PRIu64, thread.GetIndexID(), thread.GetID()); if (!raw_size) { s.Printf(", not traced\n"); return; } s.Printf("\n"); - s.Printf(" Raw trace size: %zu bytes\n", *raw_size); - s.Printf(" Total number of instructions: %zu\n", - Decode(thread)->GetInstructions().size()); + s.Printf(" Raw trace size: %zu KiB\n", *raw_size / 1024); + s.Printf(" Total number of instructions: %zu\n", + Decode(thread)->GetInstructions().size()); + s.Printf(" Total approximate memory usage: %0.2lf KiB\n", + (float)mem_used / 1024); return; } diff --git a/lldb/test/API/commands/trace/TestTraceDumpInfo.py b/lldb/test/API/commands/trace/TestTraceDumpInfo.py --- a/lldb/test/API/commands/trace/TestTraceDumpInfo.py +++ b/lldb/test/API/commands/trace/TestTraceDumpInfo.py @@ -38,5 +38,6 @@ substrs=['''Trace technology: intel-pt thread #1: tid = 3842849 - Raw trace size: 4096 bytes - Total number of instructions: 21''']) + Raw trace size: 4 KiB + Total number of instructions: 21 + Total approximate memory usage: 5.38 KiB'''])