D-FOT/0001-filter-so-address-pmudata.patch
2024-12-11 10:32:18 +08:00

128 lines
4.8 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From bfbec494a98f6b872b7449c4f641d2a94942d84b Mon Sep 17 00:00:00 2001
From: rfwang07 <wangrufeng5@huawei.com>
Date: Tue, 10 Dec 2024 16:06:31 +0800
Subject: [PATCH] filter so address pmudata
---
include/records.h | 1 +
src/configs.cc | 4 +++-
src/oeaware_plugins/tuner_sysboost.cc | 1 +
src/records.cc | 1 +
src/startup_opt.cc | 28 +++++++++++++++++++++------
5 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/include/records.h b/include/records.h
index c86ce62..df7d39d 100644
--- a/include/records.h
+++ b/include/records.h
@@ -23,6 +23,7 @@ typedef struct {
typedef struct {
uint64_t processed_samples;
std::map<pid_t, Pidinfo*> pids;
+ std::map<const char*, bool> modules;
} global_records;
extern global_records records;
diff --git a/src/configs.cc b/src/configs.cc
index 9aa6d36..ab96d2a 100644
--- a/src/configs.cc
+++ b/src/configs.cc
@@ -128,12 +128,14 @@ std::string get_app_collected_profile_path(AppConfig *app)
int parse_app(boost::property_tree::ptree pt, std::string app_name)
{
std::string full_path;
+ char rlpath[1024] = {0};
try {
full_path = pt.get<std::string>(app_name + ".FULL_PATH");
- if (!boost::filesystem::exists(full_path)) {
+ if (!get_real_path(full_path.c_str(), rlpath)) {
ERROR("Error: File does not exist: " << full_path);
return DFOT_ERROR;
}
+ full_path = std::string(rlpath);
} catch (const boost::property_tree::ptree_bad_path &e) {
ERROR("FULL_PATH is needed.");
return DFOT_ERROR;
diff --git a/src/oeaware_plugins/tuner_sysboost.cc b/src/oeaware_plugins/tuner_sysboost.cc
index b471ccf..14025fd 100644
--- a/src/oeaware_plugins/tuner_sysboost.cc
+++ b/src/oeaware_plugins/tuner_sysboost.cc
@@ -81,6 +81,7 @@ void SysboostTuner::UpdateData(const DataList &dataList)
processing = true;
int64_t start_ts = get_current_timestamp();
+ records.modules.clear();
uint64_t total_samples = 0;
for (unsigned long long i = 0; i < dataList.len; i++) {
PmuSamplingData *data = (PmuSamplingData *)(dataList.data[i]);
diff --git a/src/records.cc b/src/records.cc
index 1f2cbe3..9b212a6 100644
--- a/src/records.cc
+++ b/src/records.cc
@@ -8,6 +8,7 @@ void reset_records()
{
records.processed_samples = 0;
records.pids.clear();
+ records.modules.clear();
}
void debug_print_records()
diff --git a/src/startup_opt.cc b/src/startup_opt.cc
index 14b4aa4..78cae70 100644
--- a/src/startup_opt.cc
+++ b/src/startup_opt.cc
@@ -92,9 +92,25 @@ void update_app_profile_data(AppConfig *app, struct PmuData &data)
// {函数名func: {内存地址addr: 计数count, ...}, ...}
auto &funcs = app->profile.funcs;
+ // 刷新modules记录避免直接匹配modules字符串此处的module是relapath路径
+ auto symbol = data.stack->symbol;
+ if (records.modules.find(symbol->module) == records.modules.end()) {
+ records.modules[symbol->module] = false;
+ if (strcmp(symbol->module, app->full_path.c_str()) == 0) {
+ records.modules[symbol->module] = true;
+ } else if (strstr(symbol->module, ".rto") != nullptr &&
+ strncmp(symbol->module, app->full_path.c_str(), strlen(app->full_path.c_str())) == 0) {
+ records.modules[symbol->module] = true;
+ }
+ }
+
+ if (!records.modules[symbol->module]) {
+ return;
+ }
+
// symbol->codeMapAddr symbol->offset
// 如果是BOLT优化过后的二进制的采样数据则只需记录地址和计数
- unsigned long addr = data.stack->symbol->codeMapAddr;
+ unsigned long addr = symbol->codeMapAddr;
if (records.pids[data.pid]->instance->version > 0) {
if (addrs.find(addr) != addrs.end()) {
@@ -108,18 +124,18 @@ void update_app_profile_data(AppConfig *app, struct PmuData &data)
// 原始二进制的采样数据,读取地址+符号+偏移
if (addrs.find(addr) != addrs.end()) {
addrs[addr].count++;
- funcs[addrs[addr].name][data.stack->symbol->offset]++;
+ funcs[addrs[addr].name][symbol->offset]++;
} else {
addrs[addr] = AddrInfo();
- if (data.stack->symbol->mangleName != nullptr) {
- addrs[addr].name = data.stack->symbol->mangleName;
+ if (symbol->mangleName != nullptr) {
+ addrs[addr].name = symbol->mangleName;
} else {
auto sym = SymResolverMapAddr(data.pid, addr);
addrs[addr].name = sym->mangleName;
}
- addrs[addr].offset = data.stack->symbol->offset;
+ addrs[addr].offset = symbol->offset;
addrs[addr].count = 1;
- funcs[addrs[addr].name][data.stack->symbol->offset] = 1;
+ funcs[addrs[addr].name][symbol->offset] = 1;
}
}
--
2.39.5 (Apple Git-154)