//===-- IntelPTSingleBufferTrace.h ---------------------------- -*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef liblldb_IntelPTSingleBufferTrace_H_ #define liblldb_IntelPTSingleBufferTrace_H_ #include "Perf.h" #include "lldb/Utility/TraceIntelPTGDBRemotePackets.h" #include "lldb/lldb-types.h" #include "llvm/Support/Error.h" #include namespace lldb_private { namespace process_linux { llvm::Expected GetIntelPTOSEventType(); /// This class wraps a single perf event collecting intel pt data in a single /// buffer. class IntelPTSingleBufferTrace { public: /// Start tracing using a single Intel PT trace buffer. /// /// \param[in] request /// Intel PT configuration parameters. /// /// \param[in] tid /// The tid of the thread to be traced. If \b None, then this traces all /// threads of all processes. /// /// \param[in] cpu_id /// The CPU core id where to trace. If \b None, then this traces all CPUs. /// /// \param[in] disabled /// If \b true, then no data is collected until \a Resume is invoked. /// Similarly, if \b false, data is collected right away until \a Pause is /// invoked. /// /// \param[in] cgroup_fd /// A file descriptor in /sys/fs associated with the cgroup of the process /// to trace. If not \a std::nullopt, then the trace sesion will use cgroup /// filtering. /// /// \return /// A \a IntelPTSingleBufferTrace instance if tracing was successful, or /// an \a llvm::Error otherwise. static llvm::Expected Start(const TraceIntelPTStartRequest &request, std::optional tid, std::optional cpu_id = std::nullopt, bool disabled = false, std::optional cgroup_fd = std::nullopt); /// \return /// The bytes requested by a jLLDBTraceGetBinaryData packet that was routed /// to this trace instace. llvm::Expected> GetBinaryData(const TraceGetBinaryDataRequest &request) const; /// Read the intel pt trace buffer managed by this trace instance. To ensure /// that the data is up-to-date and is not corrupted by read-write race /// conditions, the underlying perf_event is paused during read, and later /// it's returned to its initial state. /// /// \return /// A vector with the requested binary data. llvm::Expected> GetIptTrace(); /// \return /// The total the size in bytes used by the intel pt trace buffer managed /// by this trace instance. size_t GetIptTraceSize() const; /// Resume the collection of this trace. /// /// \return /// An error if the trace couldn't be resumed. If the trace is already /// running, this returns \a Error::success(). llvm::Error Resume(); /// Pause the collection of this trace. /// /// \return /// An error if the trace couldn't be paused. If the trace is already /// paused, this returns \a Error::success(). llvm::Error Pause(); /// \return /// The underlying PerfEvent for this trace. const PerfEvent &GetPerfEvent() const; private: /// Construct new \a IntelPTSingleBufferThreadTrace. Users are supposed to /// create instances of this class via the \a Start() method and not invoke /// this one directly. /// /// \param[in] perf_event /// perf event configured for IntelPT. /// /// \param[in] collection_state /// The initial collection state for the provided perf_event. IntelPTSingleBufferTrace(PerfEvent &&perf_event) : m_perf_event(std::move(perf_event)) {} /// perf event configured for IntelPT. PerfEvent m_perf_event; }; } // namespace process_linux } // namespace lldb_private #endif // liblldb_IntelPTSingleBufferTrace_H_