1*387f9dfdSAndroid Build Coastguard Worker /* 2*387f9dfdSAndroid Build Coastguard Worker * Copyright (c) Facebook, Inc. 3*387f9dfdSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License") 4*387f9dfdSAndroid Build Coastguard Worker */ 5*387f9dfdSAndroid Build Coastguard Worker 6*387f9dfdSAndroid Build Coastguard Worker #pragma once 7*387f9dfdSAndroid Build Coastguard Worker 8*387f9dfdSAndroid Build Coastguard Worker #include <string> 9*387f9dfdSAndroid Build Coastguard Worker #include <unordered_map> 10*387f9dfdSAndroid Build Coastguard Worker #include <vector> 11*387f9dfdSAndroid Build Coastguard Worker 12*387f9dfdSAndroid Build Coastguard Worker #include <linux/perf_event.h> 13*387f9dfdSAndroid Build Coastguard Worker #include <sys/types.h> 14*387f9dfdSAndroid Build Coastguard Worker 15*387f9dfdSAndroid Build Coastguard Worker #include "BPF.h" 16*387f9dfdSAndroid Build Coastguard Worker #include "PyPerfSampleProcessor.h" 17*387f9dfdSAndroid Build Coastguard Worker #include "PyPerfType.h" 18*387f9dfdSAndroid Build Coastguard Worker 19*387f9dfdSAndroid Build Coastguard Worker namespace ebpf { 20*387f9dfdSAndroid Build Coastguard Worker namespace pyperf { 21*387f9dfdSAndroid Build Coastguard Worker 22*387f9dfdSAndroid Build Coastguard Worker class PyPerfUtil { 23*387f9dfdSAndroid Build Coastguard Worker public: 24*387f9dfdSAndroid Build Coastguard Worker enum class PyPerfResult : int { 25*387f9dfdSAndroid Build Coastguard Worker SUCCESS = 0, 26*387f9dfdSAndroid Build Coastguard Worker INIT_FAIL, 27*387f9dfdSAndroid Build Coastguard Worker PERF_BUF_OPEN_FAIL, 28*387f9dfdSAndroid Build Coastguard Worker NO_INIT, 29*387f9dfdSAndroid Build Coastguard Worker EVENT_ATTACH_FAIL, 30*387f9dfdSAndroid Build Coastguard Worker EVENT_DETACH_FAIL 31*387f9dfdSAndroid Build Coastguard Worker }; 32*387f9dfdSAndroid Build Coastguard Worker 33*387f9dfdSAndroid Build Coastguard Worker // init must be invoked exactly once before invoking profile 34*387f9dfdSAndroid Build Coastguard Worker PyPerfResult init(); 35*387f9dfdSAndroid Build Coastguard Worker 36*387f9dfdSAndroid Build Coastguard Worker PyPerfResult profile(int64_t sampleRate, int64_t durationMs, 37*387f9dfdSAndroid Build Coastguard Worker PyPerfSampleProcessor* processor); 38*387f9dfdSAndroid Build Coastguard Worker 39*387f9dfdSAndroid Build Coastguard Worker std::unordered_map<int32_t, std::string> getSymbolMapping(); 40*387f9dfdSAndroid Build Coastguard Worker getTotalSamples()41*387f9dfdSAndroid Build Coastguard Worker uint32_t getTotalSamples() const { return totalSamples_; } 42*387f9dfdSAndroid Build Coastguard Worker getLostSamples()43*387f9dfdSAndroid Build Coastguard Worker uint32_t getLostSamples() const { return lostSamples_; } 44*387f9dfdSAndroid Build Coastguard Worker 45*387f9dfdSAndroid Build Coastguard Worker private: 46*387f9dfdSAndroid Build Coastguard Worker uint32_t totalSamples_ = 0, lostSamples_ = 0; 47*387f9dfdSAndroid Build Coastguard Worker 48*387f9dfdSAndroid Build Coastguard Worker ebpf::BPF bpf_{0, nullptr, false, "", true}; 49*387f9dfdSAndroid Build Coastguard Worker std::vector<PyPerfSample> samples_; 50*387f9dfdSAndroid Build Coastguard Worker bool initCompleted_{false}; 51*387f9dfdSAndroid Build Coastguard Worker 52*387f9dfdSAndroid Build Coastguard Worker void handleSample(const void* data, int dataSize); 53*387f9dfdSAndroid Build Coastguard Worker void handleLostSamples(int lostCnt); 54*387f9dfdSAndroid Build Coastguard Worker friend void handleLostSamplesCallback(void*, uint64_t); 55*387f9dfdSAndroid Build Coastguard Worker friend void handleSampleCallback(void*, void*, int); 56*387f9dfdSAndroid Build Coastguard Worker 57*387f9dfdSAndroid Build Coastguard Worker std::string getSymbolName(Symbol& sym) const; 58*387f9dfdSAndroid Build Coastguard Worker 59*387f9dfdSAndroid Build Coastguard Worker bool tryTargetPid(int pid, PidData& data); 60*387f9dfdSAndroid Build Coastguard Worker }; 61*387f9dfdSAndroid Build Coastguard Worker } // namespace pyperf 62*387f9dfdSAndroid Build Coastguard Worker } // namespace ebpf 63