brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 4179136 Raw
114 lines · c
1//===-- IntelPTMultiCoreTrace.h ------------------------------- -*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef liblldb_IntelPTMultiCoreTrace_H_10#define liblldb_IntelPTMultiCoreTrace_H_11 12#include "IntelPTProcessTrace.h"13#include "IntelPTSingleBufferTrace.h"14#include "lldb/Host/common/NativeProcessProtocol.h"15#include "lldb/Utility/TraceIntelPTGDBRemotePackets.h"16#include "lldb/lldb-types.h"17#include "llvm/Support/Error.h"18#include <memory>19#include <optional>20 21namespace lldb_private {22namespace process_linux {23 24class IntelPTMultiCoreTrace : public IntelPTProcessTrace {25  using ContextSwitchTrace = PerfEvent;26 27public:28  /// Start tracing all CPU cores.29  ///30  /// \param[in] request31  ///   Intel PT configuration parameters.32  ///33  /// \param[in] process34  ///   The process being debugged.35  ///36  ///  \param[in] cgroup_fd37  ///  A file descriptor in /sys/fs associated with the cgroup of the process to38  ///  trace. If not \a std::nullopt, then the trace sesion will use cgroup39  ///  filtering.40  ///41  /// \return42  ///   An \a IntelPTMultiCoreTrace instance if tracing was successful, or43  ///   an \a llvm::Error otherwise.44  static llvm::Expected<std::unique_ptr<IntelPTMultiCoreTrace>>45  StartOnAllCores(const TraceIntelPTStartRequest &request,46                  NativeProcessProtocol &process,47                  std::optional<int> cgroup_fd = std::nullopt);48 49  /// Execute the provided callback on each core that is being traced.50  ///51  /// \param[in] callback.cpu_id52  ///   The core id that is being traced.53  ///54  /// \param[in] callback.core_trace55  ///   The single-buffer trace instance for the given core.56  void ForEachCore(std::function<void(lldb::cpu_id_t cpu_id,57                                      IntelPTSingleBufferTrace &core_trace)>58                       callback);59 60  /// Execute the provided callback on each core that is being traced.61  ///62  /// \param[in] callback.cpu_id63  ///   The core id that is being traced.64  ///65  /// \param[in] callback.intelpt_trace66  ///   The single-buffer intel pt trace instance for the given core.67  ///68  /// \param[in] callback.context_switch_trace69  ///   The perf event collecting context switches for the given core.70  void ForEachCore(std::function<void(lldb::cpu_id_t cpu_id,71                                      IntelPTSingleBufferTrace &intelpt_trace,72                                      ContextSwitchTrace &context_switch_trace)>73                       callback);74 75  void ProcessDidStop() override;76 77  void ProcessWillResume() override;78 79  TraceIntelPTGetStateResponse GetState() override;80 81  bool TracesThread(lldb::tid_t tid) const override;82 83  llvm::Error TraceStart(lldb::tid_t tid) override;84 85  llvm::Error TraceStop(lldb::tid_t tid) override;86 87  llvm::Expected<std::optional<std::vector<uint8_t>>>88  TryGetBinaryData(const TraceGetBinaryDataRequest &request) override;89 90private:91  /// This assumes that all underlying perf_events for each core are part of the92  /// same perf event group.93  IntelPTMultiCoreTrace(94      llvm::DenseMap<lldb::cpu_id_t,95                     std::pair<IntelPTSingleBufferTrace, ContextSwitchTrace>>96          &&traces_per_core,97      NativeProcessProtocol &process, bool using_cgroup_filtering)98      : m_traces_per_core(std::move(traces_per_core)), m_process(process),99        m_using_cgroup_filtering(using_cgroup_filtering) {}100 101  llvm::DenseMap<lldb::cpu_id_t,102                 std::pair<IntelPTSingleBufferTrace, ContextSwitchTrace>>103      m_traces_per_core;104 105  /// The target process.106  NativeProcessProtocol &m_process;107  bool m_using_cgroup_filtering;108};109 110} // namespace process_linux111} // namespace lldb_private112 113#endif // liblldb_IntelPTMultiCoreTrace_H_114