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,9 @@ /// 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 a non-error instance of this class + static size_t GetNonErrorMemoryUsage(); /// \return /// An \a llvm::Error object if this class corresponds to an Error, or an @@ -112,6 +115,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 +155,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 @@ -48,6 +48,8 @@ lldb::addr_t IntelPTInstruction::GetLoadAddress() const { return m_pt_insn.ip; } +size_t IntelPTInstruction::GetNonErrorMemoryUsage() { return sizeof(IntelPTInstruction); } + Optional IntelPTInstruction::GetTimestampCounter() const { return m_timestamp; } @@ -116,3 +118,9 @@ lldb::TraceCursorUP DecodedThread::GetCursor() { return std::make_unique(m_thread_sp, shared_from_this()); } + +size_t DecodedThread::CalculateApproximateMemoryUsage() const { + return m_raw_trace_size + + IntelPTInstruction::GetNonErrorMemoryUsage() * m_instructions.size() + + 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 @@ -111,9 +111,13 @@ 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()); + + size_t mem_used = Decode(thread)->CalculateApproximateMemoryUsage(); + 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", + (double)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'''])