63 lines
1.4 KiB
C++
63 lines
1.4 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc.
|
|
* Licensed under the Apache License, Version 2.0 (the "License")
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include <linux/perf_event.h>
|
|
#include <sys/types.h>
|
|
|
|
#include "BPF.h"
|
|
#include "PyPerfSampleProcessor.h"
|
|
#include "PyPerfType.h"
|
|
|
|
namespace ebpf {
|
|
namespace pyperf {
|
|
|
|
class PyPerfUtil {
|
|
public:
|
|
enum class PyPerfResult : int {
|
|
SUCCESS = 0,
|
|
INIT_FAIL,
|
|
PERF_BUF_OPEN_FAIL,
|
|
NO_INIT,
|
|
EVENT_ATTACH_FAIL,
|
|
EVENT_DETACH_FAIL
|
|
};
|
|
|
|
// init must be invoked exactly once before invoking profile
|
|
PyPerfResult init();
|
|
|
|
PyPerfResult profile(int64_t sampleRate, int64_t durationMs,
|
|
PyPerfSampleProcessor* processor);
|
|
|
|
std::unordered_map<int32_t, std::string> getSymbolMapping();
|
|
|
|
uint32_t getTotalSamples() const { return totalSamples_; }
|
|
|
|
uint32_t getLostSamples() const { return lostSamples_; }
|
|
|
|
private:
|
|
uint32_t totalSamples_ = 0, lostSamples_ = 0;
|
|
|
|
ebpf::BPF bpf_{0, nullptr, false, "", true};
|
|
std::vector<PyPerfSample> samples_;
|
|
bool initCompleted_{false};
|
|
|
|
void handleSample(const void* data, int dataSize);
|
|
void handleLostSamples(int lostCnt);
|
|
friend void handleLostSamplesCallback(void*, uint64_t);
|
|
friend void handleSampleCallback(void*, void*, int);
|
|
|
|
std::string getSymbolName(Symbol& sym) const;
|
|
|
|
bool tryTargetPid(int pid, PidData& data);
|
|
};
|
|
} // namespace pyperf
|
|
} // namespace ebpf
|