135 lines · c
1//===-- CommandObjectTraceStartIntelPT.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 LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_COMMANDOBJECTTRACESTARTINTELPT_H10#define LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_COMMANDOBJECTTRACESTARTINTELPT_H11 12#include "../../../../source/Commands/CommandObjectTrace.h"13#include "TraceIntelPT.h"14#include "lldb/Interpreter/CommandInterpreter.h"15#include "lldb/Interpreter/CommandReturnObject.h"16#include <optional>17 18namespace lldb_private {19namespace trace_intel_pt {20 21class CommandObjectThreadTraceStartIntelPT22 : public CommandObjectMultipleThreads {23public:24 class CommandOptions : public Options {25 public:26 CommandOptions() : Options() { OptionParsingStarting(nullptr); }27 28 Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,29 ExecutionContext *execution_context) override;30 31 void OptionParsingStarting(ExecutionContext *execution_context) override;32 33 llvm::ArrayRef<OptionDefinition> GetDefinitions() override;34 35 uint64_t m_ipt_trace_size;36 bool m_enable_tsc;37 std::optional<uint64_t> m_psb_period;38 };39 40 CommandObjectThreadTraceStartIntelPT(TraceIntelPT &trace,41 CommandInterpreter &interpreter)42 : CommandObjectMultipleThreads(43 interpreter, "thread trace start",44 "Start tracing one or more threads with intel-pt. "45 "Defaults to the current thread. Thread indices can be "46 "specified as arguments.\n Use the thread-index \"all\" to trace "47 "all threads including future threads.",48 "thread trace start [<thread-index> <thread-index> ...] "49 "[<intel-pt-options>]",50 lldb::eCommandRequiresProcess | lldb::eCommandTryTargetAPILock |51 lldb::eCommandProcessMustBeLaunched |52 lldb::eCommandProcessMustBePaused),53 m_trace(trace), m_options() {}54 55 Options *GetOptions() override { return &m_options; }56 57protected:58 bool DoExecuteOnThreads(Args &command, CommandReturnObject &result,59 llvm::ArrayRef<lldb::tid_t> tids) override;60 61 TraceIntelPT &m_trace;62 CommandOptions m_options;63};64 65class CommandObjectProcessTraceStartIntelPT : public CommandObjectParsed {66public:67 class CommandOptions : public Options {68 public:69 CommandOptions() : Options() { OptionParsingStarting(nullptr); }70 71 Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,72 ExecutionContext *execution_context) override;73 74 void OptionParsingStarting(ExecutionContext *execution_context) override;75 76 llvm::ArrayRef<OptionDefinition> GetDefinitions() override;77 78 uint64_t m_ipt_trace_size;79 uint64_t m_process_buffer_size_limit;80 bool m_enable_tsc;81 std::optional<uint64_t> m_psb_period;82 bool m_per_cpu_tracing;83 bool m_disable_cgroup_filtering;84 };85 86 CommandObjectProcessTraceStartIntelPT(TraceIntelPT &trace,87 CommandInterpreter &interpreter)88 : CommandObjectParsed(89 interpreter, "process trace start",90 "Start tracing this process with intel-pt, including future "91 "threads. If --per-cpu-tracing is not provided, this traces each "92 "thread independently, thus using a trace buffer per thread. "93 "Threads traced with the \"thread trace start\" command are left "94 "unaffected ant not retraced. This is the recommended option "95 "unless the number of threads is huge. If --per-cpu-tracing is "96 "passed, each cpu core is traced instead of each thread, which "97 "uses a fixed number of trace buffers, but might result in less "98 "data available for less frequent threads.",99 "process trace start [<intel-pt-options>]",100 lldb::eCommandRequiresProcess | lldb::eCommandTryTargetAPILock |101 lldb::eCommandProcessMustBeLaunched |102 lldb::eCommandProcessMustBePaused),103 m_trace(trace), m_options() {}104 105 Options *GetOptions() override { return &m_options; }106 107protected:108 void DoExecute(Args &command, CommandReturnObject &result) override;109 110 TraceIntelPT &m_trace;111 CommandOptions m_options;112};113 114namespace ParsingUtils {115/// Convert an integral size expression like 12KiB or 4MB into bytes. The units116/// are taken loosely to help users input sizes into LLDB, e.g. KiB and KB are117/// considered the same (2^20 bytes) for simplicity.118///119/// \param[in] size_expression120/// String expression which is an integral number plus a unit that can be121/// lower or upper case. Supported units: K, KB and KiB for 2^10 bytes; M,122/// MB and MiB for 2^20 bytes; and B for bytes. A single integral number is123/// considered bytes.124/// \return125/// The converted number of bytes or \a std::nullopt if the expression is126/// invalid.127std::optional<uint64_t>128ParseUserFriendlySizeExpression(llvm::StringRef size_expression);129} // namespace ParsingUtils130 131} // namespace trace_intel_pt132} // namespace lldb_private133 134#endif // LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_COMMANDOBJECTTRACESTARTINTELPT_H135