1 //===-- IntelPTCollector.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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef liblldb_IntelPTCollector_H_ 10 #define liblldb_IntelPTCollector_H_ 11 12 #include "IntelPTMultiCoreTrace.h" 13 #include "IntelPTPerThreadProcessTrace.h" 14 #include "IntelPTSingleBufferTrace.h" 15 #include "Perf.h" 16 #include "lldb/Host/common/NativeProcessProtocol.h" 17 #include "lldb/Utility/Status.h" 18 #include "lldb/Utility/TraceIntelPTGDBRemotePackets.h" 19 #include "lldb/lldb-types.h" 20 #include <linux/perf_event.h> 21 #include <sys/mman.h> 22 #include <unistd.h> 23 24 namespace lldb_private { 25 26 namespace process_linux { 27 28 /// Main class that manages intel-pt process and thread tracing. 29 class IntelPTCollector { 30 public: 31 /// \param[in] process 32 /// Process to be traced. 33 IntelPTCollector(NativeProcessProtocol &process); 34 35 static bool IsSupported(); 36 37 /// To be invoked as soon as we know the process stopped. 38 void ProcessDidStop(); 39 40 /// To be invoked before the process will resume, so that we can capture the 41 /// first instructions after the resume. 42 void ProcessWillResume(); 43 44 /// If "process tracing" is enabled, then trace the given thread. 45 llvm::Error OnThreadCreated(lldb::tid_t tid); 46 47 /// Stops tracing a tracing upon a destroy event. 48 llvm::Error OnThreadDestroyed(lldb::tid_t tid); 49 50 /// Implementation of the jLLDBTraceStop packet 51 llvm::Error TraceStop(const TraceStopRequest &request); 52 53 /// Implementation of the jLLDBTraceStart packet 54 llvm::Error TraceStart(const TraceIntelPTStartRequest &request); 55 56 /// Implementation of the jLLDBTraceGetState packet 57 llvm::Expected<llvm::json::Value> GetState(); 58 59 /// Implementation of the jLLDBTraceGetBinaryData packet 60 llvm::Expected<std::vector<uint8_t>> 61 GetBinaryData(const TraceGetBinaryDataRequest &request); 62 63 /// Dispose of all traces 64 void Clear(); 65 66 private: 67 llvm::Error TraceStop(lldb::tid_t tid); 68 69 /// Start tracing a specific thread. 70 llvm::Error TraceStart(lldb::tid_t tid, 71 const TraceIntelPTStartRequest &request); 72 73 /// \return 74 /// The conversion object between TSC and wall time. 75 llvm::Expected<LinuxPerfZeroTscConversion &> 76 FetchPerfTscConversionParameters(); 77 78 /// The target process. 79 NativeProcessProtocol &m_process; 80 /// Threads traced due to "thread tracing" 81 IntelPTThreadTraceCollection m_thread_traces; 82 83 /// Only one instance of "process trace" can be active at a given time. 84 /// It might be \b nullptr. 85 IntelPTProcessTraceUP m_process_trace_up; 86 }; 87 88 } // namespace process_linux 89 } // namespace lldb_private 90 91 #endif // liblldb_IntelPTCollector_H_ 92