From 725d11069298c5442b3cba4e7220c1d00c91b009 Mon Sep 17 00:00:00 2001
From: zhangzhuozhou
Date: Thu, 24 Apr 2025 14:59:59 +0800
Subject: [PATCH 01/51] =?UTF-8?q?feat:=E9=80=82=E9=85=8Dtrace=E8=BF=9B?=
=?UTF-8?q?=E7=A8=8B=E5=90=8D=E6=97=A0=E6=B3=95=E6=98=BE=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: zhangzhuozhou
---
trace_streamer/src/filter/process_filter.cpp | 19 +++++++++++++++++++
trace_streamer/src/filter/process_filter.h | 1 +
.../rawtrace_parser/ftrace_processor.cpp | 14 ++++++++++++--
.../parser/rawtrace_parser/ftrace_processor.h | 1 +
.../rawtrace_parser/rawtrace_parser.cpp | 2 ++
5 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/trace_streamer/src/filter/process_filter.cpp b/trace_streamer/src/filter/process_filter.cpp
index e05a60f8..199b4705 100644
--- a/trace_streamer/src/filter/process_filter.cpp
+++ b/trace_streamer/src/filter/process_filter.cpp
@@ -244,6 +244,25 @@ std::tuple ProcessFilter::CreateProcessMaybe(
return std::make_tuple(internalPid, process);
}
+void ProcessFilter::UpdateProcessNameByNameToTid(std::unordered_map &tidToName)
+{
+ auto processList = traceDataCache_->GetConstProcessData();
+ auto size = processList.size();
+ for (auto row = 0; row < size; row++) {
+ if (!processList[row].cmdLine_.empty()) {
+ continue;
+ }
+ auto process = traceDataCache_->GetProcessData(row);
+ if (!process) {
+ continue;
+ }
+ auto it = tidToName.find(process->pid_);
+ if (it != tidToName.end()) {
+ auto res = UpdateOrCreateProcessWithName(process->pid_, it->second.c_str());
+ TS_LOGI("Update process name %s to tid %d", it->second.c_str(), process->pid_);
+ }
+ }
+}
void ProcessFilter::Clear()
{
tidMappingSet_.clear();
diff --git a/trace_streamer/src/filter/process_filter.h b/trace_streamer/src/filter/process_filter.h
index 1ef82fe9..95851350 100644
--- a/trace_streamer/src/filter/process_filter.h
+++ b/trace_streamer/src/filter/process_filter.h
@@ -44,6 +44,7 @@ public:
void AddCpuStateCount(uint32_t itid);
void AddProcessSliceNum(uint32_t ipid);
void Clear();
+ void UpdateProcessNameByNameToTid(std::unordered_map &tidToName);
private:
std::tuple CreateProcessMaybe(uint32_t pid, uint64_t startT);
diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp
index 8e70920a..d77ee53f 100644
--- a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp
+++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp
@@ -175,7 +175,10 @@ static std::string GetName(const std::map &nameMap, int type)
static std::string GetFieldTypeName(EventFieldType type)
{
static std::map toNames = {
-#define VALUE_NAME(x) {x, #x}
+#define VALUE_NAME(x) \
+ { \
+ x, #x \
+ }
VALUE_NAME(FIELD_TYPE_INVALID), VALUE_NAME(FIELD_TYPE_BOOL), VALUE_NAME(FIELD_TYPE_INT8),
VALUE_NAME(FIELD_TYPE_UINT8), VALUE_NAME(FIELD_TYPE_INT16), VALUE_NAME(FIELD_TYPE_UINT16),
VALUE_NAME(FIELD_TYPE_INT32), VALUE_NAME(FIELD_TYPE_UINT32), VALUE_NAME(FIELD_TYPE_INT64),
@@ -192,7 +195,10 @@ static std::string GetFieldTypeName(EventFieldType type)
static std::string GetProtoTypeName(ProtoFieldType type)
{
static std::map toNames = {
-#define VALUE_NAME(x) {x, #x}
+#define VALUE_NAME(x) \
+ { \
+ x, #x \
+ }
VALUE_NAME(PROTO_TYPE_UNKNOWN), VALUE_NAME(PROTO_TYPE_DOUBLE), VALUE_NAME(PROTO_TYPE_FLOAT),
VALUE_NAME(PROTO_TYPE_INT64), VALUE_NAME(PROTO_TYPE_UINT64), VALUE_NAME(PROTO_TYPE_INT32),
VALUE_NAME(PROTO_TYPE_FIXED64), VALUE_NAME(PROTO_TYPE_FIXED32), VALUE_NAME(PROTO_TYPE_BOOL),
@@ -763,5 +769,9 @@ bool FtraceProcessor::HandleFtraceEvent(FtraceEvent &ftraceEvent,
FtraceEventProcessor::GetInstance().HandleEvent(ftraceEvent, data, dataSize, format);
return true;
}
+std::unordered_map &FtraceProcessor::GetTidToName()
+{
+ return taskNameDict_;
+}
} // namespace TraceStreamer
} // namespace SysTuning
diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h
index f5d05999..d8e8a025 100644
--- a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h
+++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h
@@ -86,6 +86,7 @@ public:
bool HandleFtraceEvent(FtraceEvent &ftraceEvent, uint8_t data[], size_t dataSize, const EventFormat &format);
bool HandleFtraceCommonFields(FtraceEvent &ftraceEvent, uint8_t data[], size_t dataSize, const EventFormat &format);
+ std::unordered_map &GetTidToName();
private:
std::regex fixedCharArrayRegex_;
diff --git a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp
index bc7e3cf0..909d2c4e 100644
--- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp
+++ b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp
@@ -41,6 +41,8 @@ void RawTraceParser::WaitForParserEnd()
restCommDataCnt_ = 0;
hasGotHeader_ = false;
curCpuCoreNum_ = 0;
+ auto tidToName = ftraceProcessor_->GetTidToName();
+ streamFilters_->processFilter_->UpdateProcessNameByNameToTid(tidToName);
ClearRawTraceData();
TS_LOGI("Parser raw trace end!");
}
--
Gitee
From a5348a6c163be82f188afe4c42282848696a5b72 Mon Sep 17 00:00:00 2001
From: zhangzepeng
Date: Thu, 24 Apr 2025 15:24:19 +0800
Subject: [PATCH 02/51] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E7=BC=96=E8=AF=91?=
=?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: zhangzepeng
---
ide/src/trace/database/TraceWorker.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/ide/src/trace/database/TraceWorker.ts b/ide/src/trace/database/TraceWorker.ts
index 1923ed8a..9a7726db 100644
--- a/ide/src/trace/database/TraceWorker.ts
+++ b/ide/src/trace/database/TraceWorker.ts
@@ -313,6 +313,7 @@ function initModuleCallBackAndFun(): void {
let tlvResultCallback = (heapPtr: number, size: number, type: number, isEnd: number): void => {
//@ts-ignore
let out: Uint8Array = wasmModule.HEAPU8.slice(heapPtr, heapPtr + size);
+ //@ts-ignore
protoDataMap.set(type, BatchSphData.decode(out).values);
};
//@ts-ignore
--
Gitee
From 14798d02b2d7756c041e3367f45e0d7153924d27 Mon Sep 17 00:00:00 2001
From: wangyujie
Date: Fri, 25 Apr 2025 11:41:08 +0800
Subject: [PATCH 03/51] =?UTF-8?q?feat:1=E3=80=81=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=E6=89=A9=E5=B1=95=E6=9C=8D=E5=8A=A1=E6=8A=93=E5=8F=96longtrace?=
=?UTF-8?q?=202=E3=80=81=E6=8A=93=E5=8F=96longtrace=E4=B8=8D=E6=94=AF?=
=?UTF-8?q?=E6=8C=81=E5=BF=AB=E7=85=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: wangyujie
---
ide/src/trace/component/SpRecordTrace.ts | 82 +++++++++++++++++++
.../component/setting/SpRecordSetting.ts | 2 +
2 files changed, 84 insertions(+)
diff --git a/ide/src/trace/component/SpRecordTrace.ts b/ide/src/trace/component/SpRecordTrace.ts
index dfb8d1b8..457e57ca 100644
--- a/ide/src/trace/component/SpRecordTrace.ts
+++ b/ide/src/trace/component/SpRecordTrace.ts
@@ -118,6 +118,10 @@ export class SpRecordTrace extends BaseElement {
private stop = 'StopRecord';
private nowChildItem: HTMLElement | undefined;
private longTraceList: Array = [];
+ private fileList: Array<{
+ fileName: string,
+ file: File
+ }> = [];
private refreshDeviceTimer: number | undefined;
private hintEl: HTMLSpanElement | undefined;
private selectedTemplate: Map = new Map();
@@ -532,6 +536,7 @@ export class SpRecordTrace extends BaseElement {
let isCheckSnapshot = this.spArkTs!.radioBoxType === 0 ? true : false; // 是否check snapshot
let isCheckTimeLine = this.spArkTs!.radioBoxType === 1 ? true : false; // 是否 check timeline
+ let isLongTrace = SpApplication.isLongTrace;
let maxDur = this.recordSetting!.maxDur; // 抓取trace的时长
let snapShotDur = this.recordSetting!.snapShot;//截图
SpRecordTrace.snapShotDuration = snapShotDur;
@@ -542,6 +547,7 @@ export class SpRecordTrace extends BaseElement {
let enableCpuProfiler = this.spArkTs!.isStartCpuProfiler;
let params: unknown = {
+ isLongTrace: isLongTrace,
isRecordArkTs: isRecordArkTs,
isRecordHitrace: isRecordHitrace,
type: '',
@@ -613,12 +619,88 @@ export class SpRecordTrace extends BaseElement {
this.litSearch!.setPercent('Tracing htrace down', -1);
} else if (cmd === 8) {
this.litSearch!.setPercent('Downloading Hitrace file...', -1);
+ } else if (cmd === 9) {// @ts-ignore
+ let re = JSON.parse(new TextDecoder('utf-8').decode(result));
+ let binaryString = window.atob(re.data);
+ let len = binaryString.length;
+ let bytes = new Uint8Array(len);
+ for (let i = 0; i < len; i++) {
+ bytes[i] = binaryString.charCodeAt(i);
+ }
+ re.data = bytes.buffer;
+ let fileInfo = {
+ fileName: re.fileName,
+ file: new File([re.data], re.fileName)
+ };
+ this.fileList.push(fileInfo);
+ this.longTraceList.push(fileInfo.fileName);
+ if (this.fileList.length === re.total) {
+ this.openLongTraceHandle();
+ }
}
};
WebSocketManager.getInstance()!.registerMessageListener(TypeConstants.ARKTS_TYPE, onmessageCallBack, this.eventCallBack);
WebSocketManager.getInstance()!.sendMessage(TypeConstants.ARKTS_TYPE, 1, encoder.encode(JSON.stringify(params)));
};
+ async openLongTraceHandle() {
+ this.fileList.sort((a, b) => {
+ const getNumber = (name: string) => {
+ const match = name.match(/_(\d+)\.htrace$/);
+ return match ? parseInt(match[1]) : 0;
+ };
+ return getNumber(a.fileName) - getNumber(b.fileName);
+ });
+ let timStamp = new Date().getTime();
+ this.sp!.longTraceHeadMessageList = [];
+ for (const fileInfo of this.fileList) {
+ await this.saveLongTrace(fileInfo.file, timStamp);
+ }
+ await this.openLongTrace(timStamp);
+ this.fileList = [];
+ this.longTraceList = [];
+ }
+
+ async saveLongTrace(file: File, timStamp: number) {
+ let traceTypePage = this.getLongTraceTypePage();
+ let types = this.sp!.fileTypeList.filter(type =>
+ file.name.toLowerCase().includes(type.toLowerCase())
+ );
+ let pageNumber = 0;
+ let fileType = types[0] || 'trace';
+ if (types.length === 0) {
+ let searchNumber = Number(
+ file.name.substring(
+ file.name.lastIndexOf('_') + 1,
+ file.name.lastIndexOf('.')
+ )
+ ) - 1;
+ pageNumber = traceTypePage.lastIndexOf(searchNumber);
+ }
+ this.litSearch!.setPercent(`downloading ${fileType} file`, 101);
+ await this.saveIndexDBByLongTrace(file, fileType, pageNumber, timStamp);
+ }
+
+ async openLongTrace(timStamp: number) {
+ let main = this.parentNode!.parentNode!.querySelector('lit-main-menu') as LitMainMenu;
+ let children = main.menus as Array;
+ let child = children[1].children as Array
- 备注:当前扩展服务版本为1.1.2,如果本地存在以其他方式安装的非正式版本,请手动关闭扩展服务,并重新按照该指导安装
+ 备注:当前扩展服务版本为1.1.3,如果本地存在以其他方式安装的非正式版本,请手动关闭扩展服务,并重新按照该指导安装
diff --git a/ide/src/webSocket/WebSocketManager.ts b/ide/src/webSocket/WebSocketManager.ts
index fc9897fa..353ded18 100644
--- a/ide/src/webSocket/WebSocketManager.ts
+++ b/ide/src/webSocket/WebSocketManager.ts
@@ -143,7 +143,7 @@ export class WebSocketManager {
updateMessage(decode: MessageParam): void {
if (decode.cmd === Constants.GET_VERSION_CMD) {
// 小于则升级
- let targetVersion = '1.1.2';
+ let targetVersion = '1.1.3';
let currentVersion = new TextDecoder().decode(decode.data);
let result = this.compareVersion(currentVersion, targetVersion);
if (result === -1) {
--
Gitee
From 7b56730ceca350216e931102f6d9b0a279516d29 Mon Sep 17 00:00:00 2001
From: danghongquan
Date: Mon, 28 Apr 2025 11:44:17 +0800
Subject: [PATCH 05/51] =?UTF-8?q?fix:smaps=E6=B3=B3=E9=81=93=E5=B1=95?=
=?UTF-8?q?=E7=A4=BA=E9=99=90=E5=88=B6=E6=9D=A1=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: danghongquan
---
.../trace/component/chart/SpVmTrackerChart.ts | 62 ++++++++++++-------
1 file changed, 40 insertions(+), 22 deletions(-)
diff --git a/ide/src/trace/component/chart/SpVmTrackerChart.ts b/ide/src/trace/component/chart/SpVmTrackerChart.ts
index c6a4b931..8c0d3f47 100644
--- a/ide/src/trace/component/chart/SpVmTrackerChart.ts
+++ b/ide/src/trace/component/chart/SpVmTrackerChart.ts
@@ -62,6 +62,12 @@ export class VmTrackerChart {
static gpuWindowModule: number | null = null; //ns
private smapsRecordTab: TabPaneSmapsRecord | undefined | null;
private scratchId = -1;
+ private isExistsPurgeableTotal: Array = [];
+ private isExistsPurgeablePin: Array = [];
+ private isExistsGpuMemory: Array = [];
+ private isExistsGpuResource: Array = [];
+ private isExistsGraph: Array = [];
+ private isExistsGl: Array = [];
constructor(trace: SpSystemTrace) {
this.trace = trace;
}
@@ -78,15 +84,32 @@ export class VmTrackerChart {
}
}
}
- await this.initVmTrackerFolder();
- await this.initSMapsFolder();
- const rowNameList: Array = ['Dirty', 'Swapped', 'RSS', 'PSS', 'USS'];
- for (const rowName of rowNameList) {
- await this.initSmapsRows(rowName);
- }
+ const result = await querySmapsExits();
+ this.isExistsPurgeableTotal = await queryisExistsPurgeableData(this.memoryConfig.iPid, false);
+ this.isExistsPurgeablePin = await queryisExistsPurgeableData(this.memoryConfig.iPid, true);
+ this.isExistsGpuMemory = await queryisExistsGpuMemoryData(this.memoryConfig.iPid);
+ this.isExistsGpuResource = await queryisExistsGpuResourceData(this.scratchId);
+ this.isExistsGraph = await queryisExistsGpuData(MemoryConfig.getInstance().iPid, "'mem.graph_pss'");
+ this.isExistsGl = await queryisExistsGpuData(MemoryConfig.getInstance().iPid, "'mem.gl_pss'");
const isExistsShm = await queryisExistsShmData(this.memoryConfig.iPid);
const isExistsDma = await queryisExistsDmaData(this.memoryConfig.iPid);
//@ts-ignore
+ if (result.length === 0 && isExistsShm[0].data_exists === 0 && isExistsDma[0].data_exists === 0 && this.isExistsPurgeableTotal[0].data_exists === 0 &&
+ //@ts-ignore
+ this.isExistsPurgeablePin[0].data_exists === 0 && this.isExistsGpuMemory[0].data_exists === 0 && this.isExistsGpuResource[0].data_exists === 0 &&
+ //@ts-ignore
+ this.isExistsGraph[0].data_exists === 0 && this.isExistsGl[0].data_exists === 0) {
+ return;
+ }
+ await this.initVmTrackerFolder();
+ if (result.length > 0) {
+ await this.initSMapsFolder();
+ const rowNameList: Array = ['Dirty', 'Swapped', 'RSS', 'PSS', 'USS'];
+ for (const rowName of rowNameList) {
+ await this.initSmapsRows(rowName);
+ }
+ }
+ //@ts-ignore
if (isExistsShm[0].data_exists) {
await this.initShmRows();
}
@@ -99,37 +122,33 @@ export class VmTrackerChart {
}
private async initGpuData(): Promise {
- const isExistsGpuMemory = await queryisExistsGpuMemoryData(this.memoryConfig.iPid);
- const isExistsGpuResource = await queryisExistsGpuResourceData(this.scratchId);
- const isExistsGraph = await queryisExistsGpuData(MemoryConfig.getInstance().iPid, "'mem.graph_pss'");
- const isExistsGl = await queryisExistsGpuData(MemoryConfig.getInstance().iPid, "'mem.gl_pss'");
if (
// @ts-ignore
- isExistsGpuMemory[0].data_exists ||
+ this.isExistsGpuMemory[0].data_exists ||
// @ts-ignore
- isExistsGpuResource[0].data_exists ||
+ this.isExistsGpuResource[0].data_exists ||
// @ts-ignore
- isExistsGraph[0].data_exists ||
+ this.isExistsGraph[0].data_exists ||
// @ts-ignore
- isExistsGl[0].data_exists
+ this.isExistsGl[0].data_exists
) {
await this.initGpuFolder();
// @ts-ignore
- if (isExistsGpuMemory[0].data_exists) {
+ if (this.isExistsGpuMemory[0].data_exists) {
await this.initGpuMemoryRow();
}
// @ts-ignore
- if (isExistsGpuResource[0].data_exists) {
+ if (this.isExistsGpuResource[0].data_exists) {
await this.initGpuResourceRow(this.scratchId);
} else {
this.smapsRecordTab!.GLESHostCache = [];
}
// @ts-ignore
- if (isExistsGraph[0].data_exists) {
+ if (this.isExistsGraph[0].data_exists) {
await this.addGpuGraphRow();
}
// @ts-ignore
- if (isExistsGl[0].data_exists) {
+ if (this.isExistsGl[0].data_exists) {
await this.addGpuGLRow();
await this.addGpuTotalRow();
await this.addGpuWindowRow();
@@ -334,12 +353,11 @@ export class VmTrackerChart {
private initPurgeableVM = async (): Promise => {
let time = new Date().getTime();
- const isExistsPurgeableTotal = await queryisExistsPurgeableData(this.memoryConfig.iPid, false);
- const isExistsPurgeablePin = await queryisExistsPurgeableData(this.memoryConfig.iPid, true); //@ts-ignore
- if (isExistsPurgeableTotal[0].data_exists) {
+ //@ts-ignore
+ if (this.isExistsPurgeableTotal[0].data_exists) {
await this.initPurgeableTotal();
} //@ts-ignore
- if (isExistsPurgeablePin[0].data_exists) {
+ if (this.isExistsPurgeablePin[0].data_exists) {
await this.initPurgeablePin();
}
let durTime = new Date().getTime() - time;
--
Gitee
From 7f7a5edcceaa9a1551b63b763360128036b174b6 Mon Sep 17 00:00:00 2001
From: JustinYT
Date: Thu, 17 Apr 2025 17:22:00 +0800
Subject: [PATCH 06/51] =?UTF-8?q?trace=E6=96=B0=E5=A2=9Etag=E3=80=81cat?=
=?UTF-8?q?=E3=80=81args=E9=80=82=E9=85=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: JustinYT
---
ide/src/doc/md/des_tables.md | 14 ++++-
trace_streamer/src/base/string_help.cpp | 6 +-
trace_streamer/src/base/string_help.h | 4 +-
trace_streamer/src/filter/slice_filter.cpp | 13 +++--
trace_streamer/src/parser/common_types.h | 14 ++++-
.../src/parser/print_event_parser.cpp | 57 ++++++++++++++++++-
.../src/parser/print_event_parser.h | 1 +
.../src/table/ftrace/callstack_table.cpp | 32 ++++++++++-
.../ftrace/callstack_stdtype.cpp | 53 ++++++++++++++++-
.../trace_stdtype/ftrace/callstack_stdtype.h | 31 +++++++++-
trace_streamer/src/version.cpp | 4 +-
11 files changed, 208 insertions(+), 21 deletions(-)
diff --git a/ide/src/doc/md/des_tables.md b/ide/src/doc/md/des_tables.md
index ccca67b7..3e26dacc 100644
--- a/ide/src/doc/md/des_tables.md
+++ b/ide/src/doc/md/des_tables.md
@@ -18,7 +18,7 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库
| app_startup | 记录了应用启动相关数据|
| args | 记录方法参数集合|
| bio_latency_sample | 记录IO操作相关方法调用,及调用栈数据|
-| callstack | 记录调用堆栈和异步调用信息,其中depth,stack_id和parent_stack_id仅在非异步调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号|
+| callstack | 记录调用堆栈和异步调用信息,其中depth仅在非异步调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,child_callid为子线程唯一号|
| clk_event_filter | 记录时钟相关的信息|
| clock_event_filter | 此结构用来维护时钟事件,cpu与唯一的ID做关联|
| clock_snapshot | 时钟号和时间,时钟名的映射表|
@@ -362,8 +362,13 @@ js_heap_sample:记录timeline的时间轴信息
|spanId |TEXT |
|parentSpanId |TEXT |
|flag |TEXT |
+|trace_level |TEXT |
+|trace_tag |TEXT |
+|custom_category |TEXT |
+|custom_args |TEXT |
+|child_callid |INT |
#### 表描述
-记录调用堆栈和异步调用信息,其中depth,stack_id和parent_stack_id仅在非异步的调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号。
+记录调用堆栈和异步调用信息,其中depth仅在非异步的调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,child_callid为子线程唯一号。
#### 字段详细描述
- id: 唯一标识
- ts: 数据事件上报时间戳
@@ -379,6 +384,11 @@ js_heap_sample:记录timeline的时间轴信息
- spanId:分布式调用关联关系,当前帧的id
- parentSpanId: 分布式调用关联关系,当前帧的parent的SpanId,对应当前表的spandId
- flag:C表示分布式调用发送方,S表示接受方
+- trace_level:决定trace的等级,log和nolog等级不同,其中log表示详细记录所有相关的调用信息,nolog 表示不记录
+- trace_tag:Tag标签,标识请求的来源或类型
+- custom_category:聚合标签,用于关联同类信息
+- custom_args:自定义参数,用于存储与调用相关的额外信息
+- child_callid:当为异步调用,此时callid为进程唯一号,child_callid为子线程唯一号,反之为无效值
### clk_event_filter表
#### 表结构
diff --git a/trace_streamer/src/base/string_help.cpp b/trace_streamer/src/base/string_help.cpp
index f18316d3..8fd7dbdd 100644
--- a/trace_streamer/src/base/string_help.cpp
+++ b/trace_streamer/src/base/string_help.cpp
@@ -44,19 +44,21 @@ bool EndWith(const std::string &str, const std::string &res)
return str.compare(str.size() - res.size(), res.size(), res) == 0;
}
-std::vector SplitStringToVec(const std::string &str, const std::string &pat)
+std::vector SplitStringToVec(const std::string &str, const std::string &pat, uint32_t expectedCount)
{
std::vector result;
size_t curPos = 0;
size_t strSize = str.size();
size_t patSize = pat.size();
+ uint32_t endFlag = 0;
while (curPos < strSize) {
auto patPos = str.find(pat, curPos);
- if (patPos == std::string::npos) {
+ if (patPos == std::string::npos || endFlag == expectedCount) {
break;
}
result.emplace_back(str.substr(curPos, patPos - curPos));
curPos = patPos + patSize;
+ endFlag++;
}
if (curPos < strSize) {
result.emplace_back(str.substr(curPos));
diff --git a/trace_streamer/src/base/string_help.h b/trace_streamer/src/base/string_help.h
index c1046410..df4bb6a7 100644
--- a/trace_streamer/src/base/string_help.h
+++ b/trace_streamer/src/base/string_help.h
@@ -23,7 +23,9 @@
namespace SysTuning {
namespace base {
char *GetDemangleSymbolIndex(const char *mangled);
-std::vector SplitStringToVec(const std::string &str, const std::string &pat);
+std::vector SplitStringToVec(const std::string &str,
+ const std::string &pat,
+ uint32_t expectedCount = UINT32_MAX);
bool StartWith(const std::string &str, const std::string &res);
bool EndWith(const std::string &str, const std::string &res);
std::string FormatString(const char *p);
diff --git a/trace_streamer/src/filter/slice_filter.cpp b/trace_streamer/src/filter/slice_filter.cpp
index 00ad01d3..0e14097f 100644
--- a/trace_streamer/src/filter/slice_filter.cpp
+++ b/trace_streamer/src/filter/slice_filter.cpp
@@ -325,9 +325,13 @@ size_t SliceFilter::StartSlice(uint64_t timeStamp,
uint32_t depth = stack.size();
auto slices = traceDataCache_->GetInternalSlicesData();
uint32_t parentId = depth == 0 ? INVALID_UINT32 : slices->IdsData()[stack.back().index];
- CallStackInternalRow callStackInternalRow = {sliceData.timeStamp, static_cast(sliceData.duration),
- sliceData.internalTid, sliceData.cat,
- sliceData.name, 0};
+ CallStackInternalRow callStackInternalRow = {sliceData.timeStamp,
+ static_cast(sliceData.duration),
+ sliceData.internalTid,
+ sliceData.cat,
+ sliceData.name,
+ 0,
+ INVALID_UINT32};
size_t index = slices->AppendInternalSlice(callStackInternalRow, parentId);
if (depth >= std::numeric_limits::max()) {
return SIZE_MAX;
@@ -464,8 +468,9 @@ uint64_t SliceFilter::StartAsyncSlice(uint64_t timeStamp,
// the IDE need a depth to paint call slice in different position of the canvas, the depth of async call
// do not mean the parent-to-child relationship, it is different from no-async call
uint8_t depth = 0;
+ uint32_t childCallid = parentId;
CallStackInternalRow callStackInternalRow = {timeStamp, static_cast(-1), internalTid, cat, nameIndex,
- depth};
+ depth, childCallid};
size_t index = slices->AppendInternalAsyncSlice(callStackInternalRow, cookie, parentId);
asyncEventFilterMap_.insert(std::make_pair(asyncEventSize_, AsyncEvent{timeStamp, index}));
return index;
diff --git a/trace_streamer/src/parser/common_types.h b/trace_streamer/src/parser/common_types.h
index 16a3e3bd..76d48f77 100644
--- a/trace_streamer/src/parser/common_types.h
+++ b/trace_streamer/src/parser/common_types.h
@@ -90,7 +90,11 @@ public:
args_(point.args_),
funcPrefixId_(point.funcPrefixId_),
funcPrefix_(point.funcPrefix_),
- funcArgs_(point.funcArgs_)
+ funcArgs_(point.funcArgs_),
+ traceLevel_(point.traceLevel_),
+ traceTagId_(point.traceTagId_),
+ customCategoryId_(point.customCategoryId_),
+ customArgsId_(point.customArgsId_)
{
}
void operator=(const TracePoint &point)
@@ -108,6 +112,10 @@ public:
funcPrefixId_ = point.funcPrefixId_;
funcPrefix_ = point.funcPrefix_;
funcArgs_ = point.funcArgs_;
+ traceLevel_ = point.traceLevel_;
+ traceTagId_ = point.traceTagId_;
+ customCategoryId_ = point.customCategoryId_;
+ customArgsId_ = point.customArgsId_;
}
char phase_ = '\0';
uint32_t tgid_ = 0;
@@ -123,6 +131,10 @@ public:
uint32_t funcPrefixId_ = 0;
std::string funcPrefix_ = "";
std::string funcArgs_ = "";
+ std::string traceLevel_ = "";
+ DataIndex traceTagId_ = INVALID_UINT64;
+ DataIndex customCategoryId_ = INVALID_UINT64;
+ DataIndex customArgsId_ = INVALID_UINT64;
};
enum class SplitDataDataType { SPLIT_FILE_DATA = 0, SPLIT_FILE_JSON };
diff --git a/trace_streamer/src/parser/print_event_parser.cpp b/trace_streamer/src/parser/print_event_parser.cpp
index a7271814..6d324cbb 100644
--- a/trace_streamer/src/parser/print_event_parser.cpp
+++ b/trace_streamer/src/parser/print_event_parser.cpp
@@ -24,6 +24,9 @@ namespace SysTuning {
namespace TraceStreamer {
const uint8_t POINT_LENGTH = 1;
const uint8_t MAX_POINT_LENGTH = 2;
+const uint8_t CATEGORY_INDEX = 2;
+const uint8_t PARSER_SYNC_SUM = 2;
+const uint8_t PARSER_ASYNC_SUM = 3;
PrintEventParser::PrintEventParser(TraceDataCache *dataCache, const TraceStreamerFilters *filter)
: EventParserBase(dataCache, filter)
{
@@ -105,6 +108,10 @@ void PrintEventParser::ParseBeginEvent(const std::string &comm,
// add distributed data
traceDataCache_->GetInternalSlicesData()->SetDistributeInfo(index, point.chainId_, point.spanId_,
point.parentSpanId_, point.flag_);
+
+ // add traceMeta data
+ traceDataCache_->GetInternalSlicesData()->SetTraceMetadata(index, point.traceLevel_, point.traceTagId_,
+ point.customArgsId_);
if (HandleFrameSliceBeginEvent(point.funcPrefixId_, index, point.funcArgs_, line)) {
return;
}
@@ -136,9 +143,16 @@ void PrintEventParser::ParseStartEvent(const std::string &comm,
auto cookie = static_cast(point.value_);
auto index = streamFilters_->sliceFilter_->StartAsyncSlice(ts, pid, point.tgid_, cookie,
traceDataCache_->GetDataIndex(point.name_));
- if (point.name_ == onFrameQueeuStartEvent_ && index != INVALID_UINT64) {
+ if (index == INVALID_UINT64) {
+ return;
+ }
+ // add traceMeta data
+ traceDataCache_->GetInternalSlicesData()->SetTraceMetadata(index, point.traceLevel_, point.traceTagId_,
+ point.customArgsId_, point.customCategoryId_);
+
+ if (point.name_ == onFrameQueeuStartEvent_) {
OnFrameQueueStart(ts, index, point.tgid_);
- } else if (traceDataCache_->AnimationTraceEnabled() && index != INVALID_UINT64 &&
+ } else if (traceDataCache_->AnimationTraceEnabled() &&
(base::EndWith(comm, onAnimationProcEvent_) ||
base::EndWith(comm, newOnAnimationProcEvent_))) { // the comm is taskName
streamFilters_->animationFilter_->StartAnimationEvent(line, point, index);
@@ -247,6 +261,36 @@ std::string_view PrintEventParser::GetPointNameForBegin(std::string_view pointSt
return name;
}
+void PrintEventParser::ParseSplitTraceMetaData(const std::string &dataStr, TracePoint &outPoint, bool isAsynEvent) const
+{
+ std::string metaDataStr = base::Strip(dataStr);
+ uint32_t expectedCount = isAsynEvent ? PARSER_ASYNC_SUM : PARSER_SYNC_SUM;
+ std::vector traceMetaDatas = base::SplitStringToVec(metaDataStr, "|", expectedCount);
+ if (traceMetaDatas.size() <= 1) {
+ TS_LOGD("traceMetaDatas size: %zu, dataStr: %s", traceMetaDatas.size(), dataStr.c_str());
+ return;
+ }
+
+ std::string &marker = traceMetaDatas[1];
+ if (!marker.empty()) {
+ outPoint.traceLevel_ = marker.substr(0, 1);
+ if (marker.size() > 1) {
+ std::string traceTag = marker.substr(1);
+ outPoint.traceTagId_ = traceDataCache_->GetDataIndex(traceTag);
+ }
+ }
+
+ if (isAsynEvent && traceMetaDatas.size() > CATEGORY_INDEX) {
+ std::string customCategory = traceMetaDatas[CATEGORY_INDEX];
+ outPoint.customCategoryId_ = traceDataCache_->GetDataIndex(customCategory);
+ }
+
+ if (traceMetaDatas.size() > expectedCount) {
+ std::string customArgs = traceMetaDatas[expectedCount];
+ outPoint.customArgsId_ = traceDataCache_->GetDataIndex(customArgs);
+ }
+}
+
ParseResult PrintEventParser::HandlerB(std::string_view pointStr, TracePoint &outPoint, size_t tGidlength) const
{
outPoint.name_ = GetPointNameForBegin(pointStr, tGidlength);
@@ -274,6 +318,9 @@ ParseResult PrintEventParser::HandlerB(std::string_view pointStr, TracePoint &ou
} else {
outPoint.funcPrefixId_ = traceDataCache_->GetDataIndex(outPoint.name_);
}
+
+ // traceMetaDatasSrt: H:name|%X%TAG|customArgs
+ ParseSplitTraceMetaData(outPoint.name_, outPoint, false);
}
return PARSE_SUCCESS;
}
@@ -535,7 +582,11 @@ ParseResult PrintEventParser::HandlerCSF(std::string_view pointStr, TracePoint &
outPoint.categoryGroup_ = std::string_view(pointStr.data() + valuePipe + 1, groupLen);
}
-
+ // traceMetaDatasSrt: taskId|%X%TAG|customCategory|customArgs
+ std::string metaDataStr(pointStr.data() + valueIndex);
+ if (outPoint.phase_ == 'S') {
+ ParseSplitTraceMetaData(metaDataStr, outPoint, true);
+ }
return PARSE_SUCCESS;
}
diff --git a/trace_streamer/src/parser/print_event_parser.h b/trace_streamer/src/parser/print_event_parser.h
index 2a6aab55..4fbb1634 100644
--- a/trace_streamer/src/parser/print_event_parser.h
+++ b/trace_streamer/src/parser/print_event_parser.h
@@ -53,6 +53,7 @@ public:
void Finish();
void SetTraceType(TraceFileType traceType);
void SetTraceClockId(BuiltinClocks clock);
+ void ParseSplitTraceMetaData(const std::string &dataStr, TracePoint &outPoint, bool isAsynEvent) const;
private:
using FrameFuncCall = std::function;
diff --git a/trace_streamer/src/table/ftrace/callstack_table.cpp b/trace_streamer/src/table/ftrace/callstack_table.cpp
index 48a1bda1..ff2d133e 100644
--- a/trace_streamer/src/table/ftrace/callstack_table.cpp
+++ b/trace_streamer/src/table/ftrace/callstack_table.cpp
@@ -34,7 +34,12 @@ enum class Index : int32_t {
CHAIN_IDS,
SPAN_IDS,
PARENT_SPAN_IDS,
- FLAGS
+ FLAGS,
+ TRACE_LEVEL,
+ TRACE_TAG,
+ CUSTOM_CATEGORY,
+ CUSTOM_ARGS,
+ CHILD_CALLID
};
CallStackTable::CallStackTable(const TraceDataCache *dataCache) : TableBase(dataCache)
{
@@ -55,6 +60,11 @@ CallStackTable::CallStackTable(const TraceDataCache *dataCache) : TableBase(data
tableColumn_.push_back(TableBase::ColumnInfo("spanId", "TEXT"));
tableColumn_.push_back(TableBase::ColumnInfo("parentSpanId", "TEXT"));
tableColumn_.push_back(TableBase::ColumnInfo("flag", "TEXT"));
+ tableColumn_.push_back(TableBase::ColumnInfo("trace_level", "TEXT"));
+ tableColumn_.push_back(TableBase::ColumnInfo("trace_tag", "TEXT"));
+ tableColumn_.push_back(TableBase::ColumnInfo("custom_category", "TEXT"));
+ tableColumn_.push_back(TableBase::ColumnInfo("custom_args", "TEXT"));
+ tableColumn_.push_back(TableBase::ColumnInfo("child_callid", "INTEGER"));
tablePriKey_.push_back("callid");
tablePriKey_.push_back("ts");
tablePriKey_.push_back("depth");
@@ -215,6 +225,26 @@ void CallStackTable::Cursor::HandleTypeColumns(int32_t col) const
SetTypeColumnTextNotEmpty(slicesObj_.Flags()[CurrentRow()].empty(),
slicesObj_.Flags()[CurrentRow()].c_str());
break;
+ case Index::TRACE_LEVEL:
+ SetTypeColumnTextNotEmpty(slicesObj_.TraceLevelsData()[CurrentRow()].empty(),
+ slicesObj_.TraceLevelsData()[CurrentRow()].c_str());
+ break;
+ case Index::TRACE_TAG:
+ SetTypeColumnText(slicesObj_.TraceTagsData()[CurrentRow()], INVALID_UINT64);
+ break;
+ case Index::CUSTOM_CATEGORY:
+ SetTypeColumnText(slicesObj_.CustomCategorysData()[CurrentRow()], INVALID_UINT64);
+ break;
+ case Index::CUSTOM_ARGS:
+ SetTypeColumnText(slicesObj_.CustomArgsData()[CurrentRow()], INVALID_UINT64);
+ break;
+ case Index::CHILD_CALLID: {
+ if (slicesObj_.ChildCallidData()[CurrentRow()].has_value()) {
+ sqlite3_result_int64(context_,
+ static_cast(slicesObj_.ChildCallidData()[CurrentRow()].value()));
+ }
+ break;
+ }
default:
TS_LOGF("Unregistered column : %d", col);
break;
diff --git a/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.cpp b/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.cpp
index b13386b5..3bbbe4b8 100644
--- a/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.cpp
+++ b/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.cpp
@@ -21,8 +21,10 @@ size_t CallStack::AppendInternalAsyncSlice(const CallStackInternalRow &callStack
const std::optional &parentId)
{
AppendCommonInfo(callStackInternalRow.startT, callStackInternalRow.durationNs, callStackInternalRow.internalTid);
- AppendCallStack(callStackInternalRow.cat, callStackInternalRow.name, callStackInternalRow.depth, parentId);
+ AppendCallStack(callStackInternalRow.cat, callStackInternalRow.name, callStackInternalRow.depth,
+ callStackInternalRow.childCallid, parentId);
AppendDistributeInfo();
+ AppendTraceMetadata();
cookies_.emplace_back(cookid);
ids_.emplace_back(id_++);
return Size() - 1;
@@ -31,10 +33,12 @@ size_t CallStack::AppendInternalSlice(const CallStackInternalRow &callStackInter
const std::optional &parentId)
{
AppendCommonInfo(callStackInternalRow.startT, callStackInternalRow.durationNs, callStackInternalRow.internalTid);
- AppendCallStack(callStackInternalRow.cat, callStackInternalRow.name, callStackInternalRow.depth, parentId);
+ AppendCallStack(callStackInternalRow.cat, callStackInternalRow.name, callStackInternalRow.depth,
+ callStackInternalRow.childCallid, parentId);
ids_.emplace_back(id_++);
cookies_.emplace_back(INVALID_INT64);
AppendDistributeInfo();
+ AppendTraceMetadata();
return Size() - 1;
}
@@ -45,12 +49,17 @@ void CallStack::AppendCommonInfo(uint64_t startT, uint64_t durationNs, InternalT
callIds_.emplace_back(internalTid);
colorIndexs_.emplace_back(0);
}
-void CallStack::AppendCallStack(DataIndex cat, DataIndex name, uint8_t depth, std::optional parentId)
+void CallStack::AppendCallStack(DataIndex cat,
+ DataIndex name,
+ uint8_t depth,
+ std::optional childCallid,
+ std::optional parentId)
{
parentIds_.emplace_back(parentId);
cats_.emplace_back(cat);
names_.emplace_back(name);
depths_.emplace_back(depth);
+ childCallid_.emplace_back(childCallid);
}
void CallStack::SetDistributeInfo(size_t index,
const std::string &chainId,
@@ -64,6 +73,17 @@ void CallStack::SetDistributeInfo(size_t index,
flags_[index] = flag;
argSet_[index] = INVALID_UINT32;
}
+void CallStack::SetTraceMetadata(size_t index,
+ const std::string &traceLevel,
+ const DataIndex &tag,
+ const DataIndex &customArg,
+ const DataIndex &customCategory)
+{
+ traceLevels_[index] = traceLevel;
+ traceTags_[index] = tag;
+ customArgs_[index] = customArg;
+ customCategorys_[index] = customCategory;
+}
void CallStack::AppendDistributeInfo()
{
chainIds_.emplace_back("");
@@ -72,6 +92,13 @@ void CallStack::AppendDistributeInfo()
flags_.emplace_back("");
argSet_.emplace_back(INVALID_UINT32);
}
+void CallStack::AppendTraceMetadata()
+{
+ traceLevels_.emplace_back("");
+ traceTags_.emplace_back(INVALID_UINT64);
+ customArgs_.emplace_back(INVALID_UINT64);
+ customCategorys_.emplace_back(INVALID_UINT64);
+}
void CallStack::SetDuration(size_t index, uint64_t timeStamp)
{
durs_[index] = timeStamp - timeStamps_[index];
@@ -161,5 +188,25 @@ const std::deque &CallStack::ArgSetIdsData() const
{
return argSet_;
}
+const std::deque &CallStack::TraceLevelsData() const
+{
+ return traceLevels_;
+}
+const std::deque &CallStack::TraceTagsData() const
+{
+ return traceTags_;
+}
+const std::deque &CallStack::CustomCategorysData() const
+{
+ return customCategorys_;
+}
+const std::deque &CallStack::CustomArgsData() const
+{
+ return customArgs_;
+}
+const std::deque> &CallStack::ChildCallidData() const
+{
+ return childCallid_;
+}
} // namespace TraceStdtype
} // namespace SysTuning
diff --git a/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.h b/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.h
index 033d25db..07b5322b 100644
--- a/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.h
+++ b/trace_streamer/src/trace_data/trace_stdtype/ftrace/callstack_stdtype.h
@@ -29,6 +29,7 @@ struct CallStackInternalRow {
DataIndex cat = INVALID_UINT64;
DataIndex name = INVALID_UINT64;
uint8_t depth = INVALID_UINT8;
+ uint32_t childCallid = INVALID_UINT32;
};
class CallStack : public CacheBase, public CpuCacheBase, public BatchCacheBase {
public:
@@ -43,7 +44,13 @@ public:
const std::string &parentSpanId,
const std::string &flag);
void AppendDistributeInfo();
+ void AppendTraceMetadata();
void SetDuration(size_t index, uint64_t timeStamp);
+ void SetTraceMetadata(size_t index,
+ const std::string &traceLevel,
+ const DataIndex &tag,
+ const DataIndex &customArg,
+ const DataIndex &customCategory = INVALID_UINT64);
void SetDurationWithFlag(size_t index, uint64_t timeStamp);
void SetFlag(size_t index, uint8_t flag);
void SetDurationEx(size_t index, uint32_t dur);
@@ -67,11 +74,17 @@ public:
parentSpanIds_.clear();
flags_.clear();
argSet_.clear();
+ traceLevels_.clear();
+ traceTags_.clear();
+ customCategorys_.clear();
+ customArgs_.clear();
+ childCallid_.clear();
}
void ClearExportedData() override
{
EraseElements(timeStamps_, ids_, durs_, cats_, cookies_, colorIndexs_, callIds_, names_, depths_, chainIds_,
- spanIds_, parentSpanIds_, flags_, argSet_);
+ spanIds_, parentSpanIds_, flags_, argSet_, traceLevels_, traceTags_, customCategorys_,
+ customArgs_, childCallid_);
}
const std::deque> &ParentIdData() const;
const std::deque &CatsData() const;
@@ -85,10 +98,19 @@ public:
const std::deque &ParentSpanIds() const;
const std::deque &Flags() const;
const std::deque &ArgSetIdsData() const;
+ const std::deque &TraceLevelsData() const;
+ const std::deque &TraceTagsData() const;
+ const std::deque &CustomCategorysData() const;
+ const std::deque &CustomArgsData() const;
+ const std::deque> &ChildCallidData() const;
private:
void AppendCommonInfo(uint64_t startT, uint64_t durationNs, InternalTid internalTid);
- void AppendCallStack(DataIndex cat, DataIndex name, uint8_t depth, std::optional parentId);
+ void AppendCallStack(DataIndex cat,
+ DataIndex name,
+ uint8_t depth,
+ std::optional childCallid,
+ std::optional parentId);
private:
std::deque> parentIds_;
@@ -103,6 +125,11 @@ private:
std::deque parentSpanIds_ = {};
std::deque flags_ = {};
std::deque argSet_ = {};
+ std::deque traceLevels_ = {};
+ std::deque traceTags_ = {};
+ std::deque customCategorys_ = {};
+ std::deque customArgs_ = {};
+ std::deque> childCallid_;
};
} // namespace TraceStdtype
} // namespace SysTuning
diff --git a/trace_streamer/src/version.cpp b/trace_streamer/src/version.cpp
index 9544e649..7a8226dd 100644
--- a/trace_streamer/src/version.cpp
+++ b/trace_streamer/src/version.cpp
@@ -17,7 +17,7 @@ namespace SysTuning {
namespace TraceStreamer {
size_t g_loadSize = 0;
size_t g_fileSize = 0;
-const std::string TRACE_STREAMER_VERSION = "4.2.9"; // version
-const std::string TRACE_STREAMER_PUBLISH_VERSION = "2025/1/2"; // publish datetime
+const std::string TRACE_STREAMER_VERSION = "4.3.2"; // version
+const std::string TRACE_STREAMER_PUBLISH_VERSION = "2025/4/24"; // publish datetime
} // namespace TraceStreamer
} // namespace SysTuning
--
Gitee
From eb35438bccf580e48def6f3ad897abfdc2822656 Mon Sep 17 00:00:00 2001
From: zhangzepeng
Date: Wed, 7 May 2025 11:03:31 +0800
Subject: [PATCH 07/51] =?UTF-8?q?trace=5Fstreamer=E7=BC=96=E8=AF=91?=
=?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: zhangzepeng
---
trace_streamer/pare_third_party.sh | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/trace_streamer/pare_third_party.sh b/trace_streamer/pare_third_party.sh
index 498c209f..d5519354 100755
--- a/trace_streamer/pare_third_party.sh
+++ b/trace_streamer/pare_third_party.sh
@@ -30,7 +30,7 @@ cd third_party
if [ ! -f "sqlite/BUILD.gn" ];then
rm -rf sqlite
- git clone git@gitee.com:openharmony/third_party_sqlite.git
+ git clone https://gitee.com/openharmony/third_party_sqlite.git
if [ -d "third_party_sqlite" ];then
mv third_party_sqlite sqlite
cd sqlite
@@ -41,7 +41,7 @@ if [ ! -f "sqlite/BUILD.gn" ];then
fi
if [ ! -f "protobuf/BUILD.gn" ];then
rm -rf protobuf
- git clone git@gitee.com:openharmony/third_party_protobuf.git
+ git clone https://gitee.com/openharmony/third_party_protobuf.git
if [ -d "third_party_protobuf" ];then
mv third_party_protobuf protobuf
cd protobuf
@@ -53,7 +53,7 @@ fi
if [ ! -f "zlib/BUILD.gn" ];then
rm -rf zlib
- git clone --depth=1 git@gitee.com:openharmony/third_party_zlib.git
+ git clone --depth=1 https://gitee.com/openharmony/third_party_zlib.git
if [ -d "third_party_zlib" ];then
mv third_party_zlib zlib
$cp ../prebuilts/patch_zlib/zlibbuild.gn zlib/BUILD.gn
@@ -62,7 +62,7 @@ fi
if [ ! -f "bzip2/BUILD.gn" ];then
rm -rf bzip2
- git clone --depth=1 git@gitee.com:openharmony/third_party_bzip2.git
+ git clone --depth=1 https://gitee.com/openharmony/third_party_bzip2.git
if [ -d "third_party_bzip2" ];then
mv third_party_bzip2 bzip2
$cp ../prebuilts/patch_bzip2/bzip2build.gn bzip2/BUILD.gn
@@ -74,7 +74,7 @@ fi
if [ ! -f "googletest/BUILD.gn" ];then
rm -rf googletest
- git clone --depth=1 git@gitee.com:openharmony/third_party_googletest.git
+ git clone --depth=1 https://gitee.com/openharmony/third_party_googletest.git
if [ -d "third_party_googletest" ];then
mv third_party_googletest googletest
$cp ../prebuilts/patch_googletest/googletestbuild.gn ../third_party/googletest/BUILD.gn
@@ -84,7 +84,7 @@ fi
if [ ! -f "json/BUILD.gn" ];then
rm -rf json
- git clone --depth=1 git@gitee.com:openharmony/third_party_json.git
+ git clone --depth=1 https://gitee.com/openharmony/third_party_json.git
if [ -d "third_party_json" ];then
mv third_party_json json
fi
@@ -92,7 +92,7 @@ fi
if [ ! -f "libunwind/BUILD.gn" ];then
rm -rf libunwind
- git clone git@gitee.com:openharmony/third_party_libunwind.git
+ git clone https://gitee.com/openharmony/third_party_libunwind.git
if [ -d "third_party_libunwind" ];then
mv third_party_libunwind libunwind
cd libunwind
@@ -113,7 +113,7 @@ fi
if [ ! -d "perf_include/hiviewdfx/faultloggerd" ];then
rm -rf hiviewdfx_faultloggerd perf_include/hiviewdfx/faultloggerd
mkdir -p perf_include/hiviewdfx/faultloggerd/interfaces/innerkits
- git clone git@gitee.com:openharmony/hiviewdfx_faultloggerd.git
+ git clone https://gitee.com/openharmony/hiviewdfx_faultloggerd.git
cd hiviewdfx_faultloggerd
git reset --hard 7296f69c0d418cd9353638f3117296e4b494e4e5
cd ..
@@ -151,7 +151,7 @@ if [ ! -d "perf_include/hiviewdfx/faultloggerd" ];then
fi
if [ ! -f "hiperf/BUILD.gn" ];then
rm -rf hiperf developtools_hiperf
- git clone git@gitee.com:openharmony/developtools_hiperf.git
+ git clone https://gitee.com/openharmony/developtools_hiperf.git
cd developtools_hiperf
git reset --hard 9d189f41d76c1ae6e8e12238aef5ef5b8cdbc09f
cd ..
@@ -189,13 +189,13 @@ fi
if [ ! -f "bounds_checking_function/BUILD.gn" ];then
rm -rf bounds_checking_function
- git clone --depth=1 git@gitee.com:openharmony/third_party_bounds_checking_function.git bounds_checking_function
+ git clone --depth=1 https://gitee.com/openharmony/third_party_bounds_checking_function.git bounds_checking_function
$cp ../prebuilts/patch_bounds_checking_function/bounds_checking_functionbuild.gn bounds_checking_function/BUILD.gn
fi
if [ ! -d "commonlibrary" ];then
rm -rf commonlibrary
- git clone --depth=1 git@gitee.com:openharmony/commonlibrary_c_utils.git
+ git clone --depth=1 https://gitee.com/openharmony/commonlibrary_c_utils.git
if [ -d "commonlibrary_c_utils" ];then
mv commonlibrary_c_utils commonlibrary
rm -rf commonlibrary_c_utils
@@ -204,7 +204,7 @@ fi
if [ ! -f "profiler/device/plugins/ftrace_plugin/include/ftrace_common_type.h" ];then
rm -rf profiler
- git clone --depth=1 git@gitee.com:openharmony/developtools_profiler.git
+ git clone --depth=1 https://gitee.com/openharmony/developtools_profiler.git
if [ -d "developtools_profiler" ];then
mkdir -p profiler/device/plugins/ftrace_plugin/include
$cp developtools_profiler/device/plugins/ftrace_plugin/include/ftrace_common_type.h profiler/device/plugins/ftrace_plugin/include
@@ -215,7 +215,7 @@ fi
if [ ! -d "llvm-project" ];then
rm -rf llvm-project
- git clone --depth=1 git@gitee.com:openharmony/third_party_llvm-project.git
+ git clone --depth=1 https://gitee.com/openharmony/third_party_llvm-project.git
if [ -d "third_party_llvm-project" ];then
mv third_party_llvm-project llvm-project
cd llvm-project
--
Gitee
From 907040e47f87f1a8000d7d9b1c64b0190d9a55bb Mon Sep 17 00:00:00 2001
From: danghongquan
Date: Sat, 10 May 2025 16:20:42 +0800
Subject: [PATCH 08/51] =?UTF-8?q?feat:=E9=80=82=E9=85=8Dnative=20meomory?=
=?UTF-8?q?=20so=20=E5=8F=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: danghongquan
---
trace_streamer/src/filter/hook_filter/native_hook_filter.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/trace_streamer/src/filter/hook_filter/native_hook_filter.cpp b/trace_streamer/src/filter/hook_filter/native_hook_filter.cpp
index 8426e70e..c666fcf7 100644
--- a/trace_streamer/src/filter/hook_filter/native_hook_filter.cpp
+++ b/trace_streamer/src/filter/hook_filter/native_hook_filter.cpp
@@ -32,6 +32,7 @@ NativeHookFilter::NativeHookFilter(TraceDataCache *dataCache, const TraceStreame
invalidLibPathIndexs_.insert(traceDataCache_->dataDict_.GetStringIndex("/system/lib64/libc++.so"));
invalidLibPathIndexs_.insert(traceDataCache_->dataDict_.GetStringIndex("/system/lib/ld-musl-aarch64.so.1"));
invalidLibPathIndexs_.insert(traceDataCache_->dataDict_.GetStringIndex("/system/lib/ld-musl-arm.so.1"));
+ invalidLibPathIndexs_.insert(traceDataCache_->dataDict_.GetStringIndex("/system/lib64/libdfmalloc.z.so"));
hookPluginData_->set_name("nativehook");
commHookData_.datas = std::make_unique();
addrToAllocEventRow_ = traceDataCache_->GetNativeHookData()->GetAddrToAllocEventRow();
--
Gitee
From 0de2a99b5c0332770c3a93b8afb7514274b6eb3c Mon Sep 17 00:00:00 2001
From: danghongquan
Date: Sat, 10 May 2025 16:36:03 +0800
Subject: [PATCH 09/51] =?UTF-8?q?fix:=E7=89=B9=E6=AE=8A=E5=9C=BA=E6=99=AF?=
=?UTF-8?q?=E4=B8=8B=E7=81=AB=E7=84=B0=E5=9B=BE=E5=87=BA=E7=8E=B0=E7=B4=AB?=
=?UTF-8?q?=E8=89=B2=EF=BC=8C=E6=95=B0=E6=8D=AE=E7=B4=8A=E4=B9=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: danghongquan
---
ide/src/trace/component/chart/FrameChart.ts | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/ide/src/trace/component/chart/FrameChart.ts b/ide/src/trace/component/chart/FrameChart.ts
index 8255fec2..9c0bb5d8 100644
--- a/ide/src/trace/component/chart/FrameChart.ts
+++ b/ide/src/trace/component/chart/FrameChart.ts
@@ -232,6 +232,7 @@ export class FrameChart extends BaseElement {
private clearOtherDisplayInfo(node: ChartStruct): void {
for (const children of node.children) {
if (children.isChartSelect) {
+ children.isChartSelect = false;
this.clearOtherDisplayInfo(children);
continue;
}
@@ -737,9 +738,9 @@ export class FrameChart extends BaseElement {
this.setSelectStatusRecursive(ChartStruct.lastSelectFuncStruct!, false);
}
// 递归设置点选的parent,children为点选状态
+ this.calDrawArgs(false);
this.setSelectStatusRecursive(ChartStruct.selectFuncStruct!, true);
- this.calDrawArgs(false);
this.calculateChartData();
}
--
Gitee
From df3a8a53687a9a415a431815ef920ed93f3638e9 Mon Sep 17 00:00:00 2001
From: liufei
Date: Sat, 10 May 2025 18:18:59 +0800
Subject: [PATCH 10/51] =?UTF-8?q?feat:hiperf=5Ffunc=E9=A1=B5=EF=BC=8C?=
=?UTF-8?q?=E8=BD=ACsystem=20trace=E4=BD=BF=E7=94=A8=E9=87=8F=E7=BB=9F?=
=?UTF-8?q?=E8=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: liufei
---
ide/src/trace/SpApplication.ts | 4 ++++
.../component/trace/sheet/hiperf/TabPanePerfAnalysis.ts | 5 +++++
2 files changed, 9 insertions(+)
diff --git a/ide/src/trace/SpApplication.ts b/ide/src/trace/SpApplication.ts
index 0a703a33..0455a279 100644
--- a/ide/src/trace/SpApplication.ts
+++ b/ide/src/trace/SpApplication.ts
@@ -1756,6 +1756,10 @@ export class SpApplication extends BaseElement {
if (attribute === 'Convert trace') {
let querySelectors = menuGroup.querySelectorAll('lit-main-menu-item');
querySelectors.forEach((item) => {
+ SpStatisticsHttpUtil.addOrdinaryVisitAction({
+ event: 'convert_systrace',
+ action: 'convert_systrace',
+ });
if (item.getAttribute('title') === 'Convert to .systrace') {
item!.setAttribute('icon', 'convert-loading');
item!.classList.add('pending');
diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts
index c04d2ce9..9b10f55a 100644
--- a/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts
+++ b/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts
@@ -27,6 +27,7 @@ import { TabpanePerfProfile } from './TabPerfProfile';
import { TabPanePerfAnalysisHtml } from './TabPanePerfAnalysis.html';
import { WebSocketManager } from '../../../../../webSocket/WebSocketManager';
import { Constants, TypeConstants } from '../../../../../webSocket/Constants';
+import { SpStatisticsHttpUtil } from '../../../../../statistics/util/SpStatisticsHttpUtil';
@element('tabpane-perf-analysis')
export class TabPanePerfAnalysis extends BaseElement {
@@ -591,6 +592,10 @@ export class TabPanePerfAnalysis extends BaseElement {
}
private functionClickEvent(it: unknown) {
+ SpStatisticsHttpUtil.addOrdinaryVisitAction({
+ event: 'hiperf_func',
+ action: 'hiperf_func',
+ });
// @ts-ignore
this.perfAnalysisHeadTips?.innerHTML = '';
if (this.selectedTabfileName.indexOf('.an') === -1 && this.selectedTabfileName.indexOf('.so') === -1) {
--
Gitee
From e6a083a5488e5c692896b5c20177b9e1a17a86ae Mon Sep 17 00:00:00 2001
From: liufei
Date: Mon, 12 May 2025 19:31:10 +0800
Subject: [PATCH 11/51] =?UTF-8?q?fix:=E8=BD=ACsystemtrace=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0.htrace=E9=99=90=E5=88=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: liufei
---
ide/src/trace/SpApplication.ts | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/ide/src/trace/SpApplication.ts b/ide/src/trace/SpApplication.ts
index 0455a279..dd3c76b9 100644
--- a/ide/src/trace/SpApplication.ts
+++ b/ide/src/trace/SpApplication.ts
@@ -1756,11 +1756,13 @@ export class SpApplication extends BaseElement {
if (attribute === 'Convert trace') {
let querySelectors = menuGroup.querySelectorAll('lit-main-menu-item');
querySelectors.forEach((item) => {
- SpStatisticsHttpUtil.addOrdinaryVisitAction({
- event: 'convert_systrace',
- action: 'convert_systrace',
- });
if (item.getAttribute('title') === 'Convert to .systrace') {
+ if(fileName.indexOf('.htrace')>0){
+ SpStatisticsHttpUtil.addOrdinaryVisitAction({
+ event: 'convert_systrace',
+ action: 'convert_systrace',
+ });
+ }
item!.setAttribute('icon', 'convert-loading');
item!.classList.add('pending');
item!.style.fontKerning = '';
--
Gitee
From 65eba36a4557c17409fef028d2cfd16023855557 Mon Sep 17 00:00:00 2001
From: danghongquan
Date: Tue, 13 May 2025 20:02:23 +0800
Subject: [PATCH 12/51] =?UTF-8?q?fix:HiSysEvent=E7=95=8C=E9=9D=A2=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: danghongquan
---
ide/src/trace/component/setting/SpHisysEvent.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ide/src/trace/component/setting/SpHisysEvent.ts b/ide/src/trace/component/setting/SpHisysEvent.ts
index 77956729..9cb549b5 100644
--- a/ide/src/trace/component/setting/SpHisysEvent.ts
+++ b/ide/src/trace/component/setting/SpHisysEvent.ts
@@ -64,7 +64,7 @@ export class SpHisysEvent extends BaseElement {
}
get sysEventConfigPath(): string {
- return '/system/etc/hiview/hisysevent.def';
+ return '//data/system/hiview/unzip_configs/sys_event_def/hisysevent.def';
}
initElements(): void {
--
Gitee
From 29da017136904bd1f938946a071a7c891ccb4863 Mon Sep 17 00:00:00 2001
From: zhangzhuozhou
Date: Wed, 14 May 2025 10:40:08 +0800
Subject: [PATCH 13/51] =?UTF-8?q?feat:=E9=80=82=E9=85=8Draw=20trace?=
=?UTF-8?q?=E4=B8=ADsched=5Fwaking,sched=5Fwakeup=5Fnew=E4=BA=8B=E4=BB=B6?=
=?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: zhangzhuozhou
---
.../rawtrace_parser/ftrace_event_processor.cpp | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp
index d6ffa3c2..5e83ac8c 100644
--- a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp
+++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp
@@ -312,7 +312,11 @@ bool FtraceEventProcessor::SchedWaking(FtraceEvent &ftraceEvent, uint8_t data[],
auto schedWakingMsg = ftraceEvent.mutable_sched_waking_format();
schedWakingMsg->set_comm(FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size));
schedWakingMsg->set_pid(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
- schedWakingMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ if (format.fields[index].size == NEW_SCHED_PRIO_SIZE) {
+ schedWakingMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ } else {
+ schedWakingMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ }
schedWakingMsg->set_success(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
schedWakingMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
return true;
@@ -326,7 +330,11 @@ bool FtraceEventProcessor::SchedWakeupNew(FtraceEvent &ftraceEvent,
auto wakeupNewMsg = ftraceEvent.mutable_sched_wakeup_new_format();
wakeupNewMsg->set_comm(FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size));
wakeupNewMsg->set_pid(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
- wakeupNewMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ if (format.fields[index].size == NEW_SCHED_PRIO_SIZE) {
+ wakeupNewMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ } else {
+ wakeupNewMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ }
wakeupNewMsg->set_success(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
wakeupNewMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
return true;
--
Gitee
From 1352eb57615a58770da06aa10d55f3413c94aef5 Mon Sep 17 00:00:00 2001
From: danghongquan
Date: Wed, 14 May 2025 15:09:11 +0800
Subject: [PATCH 14/51] =?UTF-8?q?fix:hiperf=E6=95=B0=E6=8D=AE=E4=B8=AD?=
=?UTF-8?q?=E6=B2=A1=E6=9C=89=E4=B8=BB=E7=BA=BF=E7=A8=8B=E6=97=B6=E6=9C=AA?=
=?UTF-8?q?=E5=81=9A=E4=BF=9D=E6=8A=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: danghongquan
---
ide/src/trace/component/chart/SpHiPerf.ts | 6 +++---
.../trace/database/logic-worker/ProcedureLogicWorkerPerf.ts | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/ide/src/trace/component/chart/SpHiPerf.ts b/ide/src/trace/component/chart/SpHiPerf.ts
index 23192717..9ffcc2f5 100644
--- a/ide/src/trace/component/chart/SpHiPerf.ts
+++ b/ide/src/trace/component/chart/SpHiPerf.ts
@@ -480,7 +480,7 @@ export class SpHiPerf {
let array = this.group[key] as Array;
let process = array.filter((th): boolean => th.pid === th.tid)[0];
let row = TraceRow.skeleton();
- row.rowId = `${process.pid}-Perf-Process`;
+ row.rowId = `${process ? process.pid : Number(key)}-Perf-Process`;
row.index = index;
row.rowType = TraceRow.ROW_TYPE_HIPERF_PROCESS;
row.rowParentId = 'HiPerf';
@@ -491,14 +491,14 @@ export class SpHiPerf {
row.addTemplateTypes('AppStartup');
}
row.addTemplateTypes('HiPerf');
- row.name = `${process.processName || 'Process'} [${process.pid}]`;
+ row.name = `${process ? process.processName : 'Process'} [${process ? process.pid : Number(key)}]`;
row.folderPaddingLeft = 6;
row.style.height = '40px';
row.favoriteChangeHandler = this.trace.favoriteChangeHandler;
row.selectChangeHandler = this.trace.selectChangeHandler; //@ts-ignore
row.supplierFrame = (): Promise => {
return hiperfProcessDataSender(
- process.pid,
+ process ? process.pid : Number(key),
row.drawType,
this.maxCpuId + 1,
SpHiPerf.stringResult?.fValue || 1,
diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts
index ade2ef79..55eec1ba 100644
--- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts
+++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts
@@ -1452,7 +1452,7 @@ export class ProcedureLogicWorkerPerf extends LogicHandler {
let callChains = [...this.callChainData[sample.sampleId]];
const lastCallChain = callChains[callChains.length - 1];
const threadName = this.threadData[sample.tid].threadName || 'Thread';
- const processName = this.threadData[sample.pid].threadName || 'Process';
+ const processName = this.threadData[sample.pid] ? this.threadData[sample.pid].threadName : 'Process';
const funcName = this.dataCache.dataDict.get(lastCallChain.name as number);
if (
//@ts-ignore
--
Gitee
From 47fdb79affc57b0328c11b406af5661b144e157d Mon Sep 17 00:00:00 2001
From: danghongquan
Date: Fri, 16 May 2025 16:56:24 +0800
Subject: [PATCH 15/51] =?UTF-8?q?fix:=E6=9B=B4=E6=96=B0=E6=89=A9=E5=B1=95?=
=?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=9A=84=E7=89=88=E6=9C=AC=E5=8F=B7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: danghongquan
---
ide/src/doc/quickstart_extensions.html | 2 +-
ide/src/webSocket/WebSocketManager.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/ide/src/doc/quickstart_extensions.html b/ide/src/doc/quickstart_extensions.html
index d75add92..c39d01ea 100644
--- a/ide/src/doc/quickstart_extensions.html
+++ b/ide/src/doc/quickstart_extensions.html
@@ -811,7 +811,7 @@
在hi-smart-perf-host-extend目录下,找到stop.bat文件,右键选择以管理员身份运行,即可关闭扩展服务。
- 备注:当前扩展服务版本为1.1.3,如果本地存在以其他方式安装的非正式版本,请手动关闭扩展服务,并重新按照该指导安装
+ 备注:当前扩展服务版本为1.1.4,如果本地存在以其他方式安装的非正式版本,请手动关闭扩展服务,并重新按照该指导安装
diff --git a/ide/src/webSocket/WebSocketManager.ts b/ide/src/webSocket/WebSocketManager.ts
index 353ded18..9318f1fa 100644
--- a/ide/src/webSocket/WebSocketManager.ts
+++ b/ide/src/webSocket/WebSocketManager.ts
@@ -143,7 +143,7 @@ export class WebSocketManager {
updateMessage(decode: MessageParam): void {
if (decode.cmd === Constants.GET_VERSION_CMD) {
// 小于则升级
- let targetVersion = '1.1.3';
+ let targetVersion = '1.1.4';
let currentVersion = new TextDecoder().decode(decode.data);
let result = this.compareVersion(currentVersion, targetVersion);
if (result === -1) {
--
Gitee
From 13024364d6ffc4a74f2f5b55b79e5ee0686dc397 Mon Sep 17 00:00:00 2001
From: JustinYT
Date: Mon, 12 May 2025 16:16:50 +0800
Subject: [PATCH 16/51] =?UTF-8?q?1.=E7=B3=BB=E7=BB=9F=E8=B0=83=E7=94=A8?=
=?UTF-8?q?=E6=B3=B3=E9=81=93=E5=9B=BE=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?=
=?UTF-8?q?=EF=BC=9B2.=E8=A1=A5=E5=85=85=E9=83=A8=E5=88=86=E7=B3=BB?=
=?UTF-8?q?=E7=BB=9F=E8=B0=83=E7=94=A8=E5=90=8D=E7=A7=B0=E6=98=A0=E5=B0=84?=
=?UTF-8?q?=203.=E5=A2=9E=E5=8A=A0=E8=A7=A3=E6=9E=90=E5=BC=80=E5=85=B3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: JustinYT
---
ide/src/config/config.json | 136 ++++
ide/src/trace/SpApplication.ts | 8 +-
ide/src/trace/component/SpFlag.html.ts | 3 +
ide/src/trace/component/SpFlags.ts | 142 ++++
ide/src/trace/component/SpSystemTrace.init.ts | 21 +-
ide/src/trace/component/SpSystemTrace.ts | 8 +-
.../trace/component/chart/SpProcessChart.ts | 4 +-
.../component/trace/base/SysCallUtils.ts | 608 ++++++++++--------
ide/src/trace/database/TraceWorker.ts | 2 +-
.../process/ThreadSysCallDataReceiver.ts | 34 +-
.../process/ThreadSysCallDataSender.ts | 2 +-
.../data-trafic/utils/AllMemoryCache.ts | 3 +
.../ui-worker/ProcedureWorkerThreadSysCall.ts | 2 +-
ide/webpack.config.js | 4 +
14 files changed, 680 insertions(+), 297 deletions(-)
create mode 100644 ide/src/config/config.json
diff --git a/ide/src/config/config.json b/ide/src/config/config.json
new file mode 100644
index 00000000..6b4ff707
--- /dev/null
+++ b/ide/src/config/config.json
@@ -0,0 +1,136 @@
+{
+ "_comment": "这是动效的相关打点",
+ "Animation": {
+ "_comment": "动效过程打点线程,render_service为并行化前的打点线程,RSUniRenderThre为并行化后的打点线程",
+ "animationProcEvents_": [
+ "render_service",
+ "RSUniRenderThre"
+ ],
+ "_comment": "动效相关打点,H:LAUNCHER_APP_LAUNCH_FROM_ICON为桌面图标点击启动,H:LAUNCHER_APP_LAUNCH_FROM_NOTIFICATIONBAR为通知栏通知消息点击启动,H:LAUNCHER_APP_LAUNCH_FROM_NOTIFICATIONBAR_IN_LOCKSCREEN为锁屏通知消息点击启动,H:LAUNCHER_APP_LAUNCH_FROM_RECENT为多任务点击应用,H:LAUNCHER_APP_SWIPE_TO_HOME为HOME键返回桌面,H:LAUNCHER_APP_BACK_TO_HOME为Back键返回桌面,H:APP_TRANSITION_TO_OTHER_APP为应用切换到另一个应用,H:APP_TRANSITION_FROM_OTHER_APP为从另一个应用跳回,H:APP_LIST_FLING为应用中列表滑动",
+ "onAnimationStartEvents_": [
+ "H:LAUNCHER_APP_LAUNCH_FROM_ICON",
+ "H:LAUNCHER_APP_LAUNCH_FROM_NOTIFICATIONBAR",
+ "H:LAUNCHER_APP_LAUNCH_FROM_NOTIFICATIONBAR_IN_LOCKSCREEN",
+ "H:LAUNCHER_APP_LAUNCH_FROM_RECENT",
+ "H:LAUNCHER_APP_SWIPE_TO_HOME",
+ "H:LAUNCHER_APP_BACK_TO_HOME",
+ "H:APP_TRANSITION_TO_OTHER_APP",
+ "H:APP_TRANSITION_FROM_OTHER_APP",
+ "H:APP_LIST_FLING"
+ ],
+ "_comment": "H:GenerateVsyncCount,用于计算设备的平均帧率,累计6次后输出平均帧率",
+ "frameRateCmd_": [
+ "H:GenerateVsyncCount"
+ ],
+ "_comment": "H:RSJankStats::RecordAnimationDynamicFrameRate,用于更新动效的帧率,若存在此打点,则以这个打点为准,否则以H:Repaint为准",
+ "realFrameRateCmd_": [
+ "H:RSJankStats::RecordAnimationDynamicFrameRate"
+ ],
+ "_comment": "H:Repaint(硬件合成器合成绘制),用于计算动效帧率",
+ "frameCountCmd_": [
+ "H:Repaint"
+ ],
+ "_comment": "H:RSUniRender::Process:[WindowScene_和H:RSSurfaceRenderNodeDrawable::OnDraw:[WindowScene_用来获取动效帧数据的打点,其中H:RSUniRender::Process:[WindowScene_为并行化前打点",
+ "frameBeginCmd_": [
+ "H:RSUniRender::Process:[WindowScene_",
+ "H:RSSurfaceRenderNodeDrawable::OnDraw:[WindowScene_"
+ ],
+ "_comment": "H:RSUniRender::Process:[SCBDesktop和H:RSSurfaceRenderNodeDrawable::OnDraw:[SCBDesktop用来获取设备的宽高,其中H:RSUniRender::Process:[SCBDesktop为并行化前打点",
+ "screenSizeCmd_": [
+ "H:RSUniRender::Process:[SCBDesktop",
+ "H:RSSurfaceRenderNodeDrawable::OnDraw:[SCBDesktop"
+ ],
+ "_comment": "H:RSMainThread::DoComposition和H:RenderFrame用来获取动效帧的结束时间,其中H:RSMainThread::DoComposition为并行化前的打点",
+ "frameEndTimeCmd_": [
+ "H:RenderFrame"
+ ],
+ "_comment": "H:PostAndWait, parallel type并行化的标志",
+ "parallelTypeCmd_": [
+ "H:PostAndWait, parallel type"
+ ]
+ },
+ "_comment": "这是启动场景的相关打点",
+ "AppStartup": {
+ "_comment": "启动第一阶段,手指点击",
+ "phase1": {
+ "pName": "ProcessTouchEvent",
+ "start": [
+ "H:client dispatch touchId:"
+ ],
+ "end": [
+ "H:OHOS::ErrCode OHOS::AAFwk::AbilityManagerClient::StartUIAbilityBySCB"
+ ]
+ },
+ "_comment": "启动第二阶段,处理创建进程信息,创建窗口",
+ "phase2": {
+ "pName": "StartUIAbilityBySCB",
+ "start": [
+ "H:OHOS::ErrCode OHOS::AAFwk::AbilityManagerClient::StartUIAbilityBySCB"
+ ],
+ "end": [
+ "H:virtual void OHOS::AppExecFwk::AppMgrServiceInner::LoadAbility"
+ ]
+ },
+ "_comment": "启动第三阶段,拉起应用进程",
+ "phase3": {
+ "pName": "LoadAbility",
+ "start": [
+ "H:virtual void OHOS::AppExecFwk::AppMgrServiceInner::LoadAbility"
+ ],
+ "end": [
+ "H:virtual void OHOS::AppExecFwk::AppMgrServiceInner::AttachApplication(const pid_t, const sptr &)##"
+ ]
+ },
+ "_comment": "启动第四阶段,加载应用",
+ "phase4": {
+ "pName": "Application Launching",
+ "start": [
+ "H:virtual void OHOS::AppExecFwk::AppMgrServiceInner::AttachApplication(const pid_t, const sptr &)##"
+ ],
+ "end": [
+ "H:void OHOS::AppExecFwk::MainThread::HandleLaunchAbility(const std::shared_ptr &)##"
+ ]
+ },
+ "_comment": "启动第五阶段,加载 UI Ability",
+ "phase5": {
+ "pName": "UI Ability Launching",
+ "start": [
+ "H:void OHOS::AppExecFwk::MainThread::HandleLaunchAbility(const std::shared_ptr &)##"
+ ],
+ "end": [
+ "H:void OHOS::AbilityRuntime::FAAbilityThread::HandleAbilityTransaction(const OHOS::AbilityRuntime::Want &, const OHOS::AbilityRuntime::LifeCycleStateInfo &, sptr)##",
+ "H:void OHOS::AbilityRuntime::UIAbilityThread::HandleAbilityTransaction"
+ ]
+ },
+ "_comment": "启动第六阶段,应用进入前台",
+ "phase6": {
+ "pName": "UI Ability OnForeground",
+ "start": [
+ "H:void OHOS::AbilityRuntime::FAAbilityThread::HandleAbilityTransaction(const OHOS::AbilityRuntime::Want &, const OHOS::AbilityRuntime::LifeCycleStateInfo &, sptr)##",
+ "H:void OHOS::AbilityRuntime::UIAbilityThread::HandleAbilityTransaction"
+ ],
+ "end": [
+ "H:ReceiveVsync dataCount"
+ ]
+ }
+ },
+ "_comment": "Flag 开关",
+ "config": {
+ "TaskPool": 0,
+ "AnimationAnalysis": 0,
+ "AppStartup": 0,
+ "SchedulingAnalysis": 0,
+ "BinderRunnable": 0,
+ "FfrtConvert": 0,
+ "HMKernel": 1,
+ "VSync": 0,
+ "Hangs Detection": 0,
+ "LTPO": 0,
+ "Start&Finish Trace Category": 0,
+ "UserPluginsRow": 0,
+ "CPU by Irq": 0,
+ "RawTraceCutStartTs": 1,
+ "AI": 0,
+ "System Calls": ""
+ }
+}
\ No newline at end of file
diff --git a/ide/src/trace/SpApplication.ts b/ide/src/trace/SpApplication.ts
index 0a703a33..0288314c 100644
--- a/ide/src/trace/SpApplication.ts
+++ b/ide/src/trace/SpApplication.ts
@@ -1114,7 +1114,7 @@ export class SpApplication extends BaseElement {
let data = this.markPositionHandler(reader.result as ArrayBuffer);
this.spSystemTrace!.loadDatabaseArrayBuffer(
data,
- '',
+ '', '',
(command: string, _: number) => {
this.setProgress(command);
},
@@ -1173,6 +1173,7 @@ export class SpApplication extends BaseElement {
}
Promise.all([threadPool.init(traceType), threadPool2.init(traceType)]).then(() => {
let wasmUrl = `https://${window.location.host.split(':')[0]}:${window.location.port}/application/wasm.json`;
+ let configUrl = `https://${window.location.host.split(':')[0]}:${window.location.port}/application/config/config.json`;
Promise.all([file1.arrayBuffer(), file2.arrayBuffer()]).then((bufArr) => {
this.litSearch!.setPercent('ArrayBuffer loaded ', 2);
SpApplication.loadingProgress = 0;
@@ -1182,7 +1183,7 @@ export class SpApplication extends BaseElement {
info('initData start Parse Data');
this.spSystemTrace!.loadDatabaseArrayBuffer(
buf1,
- wasmUrl,
+ wasmUrl, configUrl,
(command: string, _: number) => this.setProgress(command),
true,
completeHandler,
@@ -1238,13 +1239,14 @@ export class SpApplication extends BaseElement {
info('read file onloadend');
this.litSearch!.setPercent('ArrayBuffer loaded ', 2);
let wasmUrl = `https://${window.location.host.split(':')[0]}:${window.location.port}/application/wasm.json`;
+ let configUrl = `https://${window.location.host.split(':')[0]}:${window.location.port}/application/config/config.json`;
SpApplication.loadingProgress = 0;
SpApplication.progressStep = 3;
let data = this.markPositionHandler(reader.result as ArrayBuffer);
info('initData start Parse Data');
this.spSystemTrace!.loadDatabaseArrayBuffer(
data,
- wasmUrl,
+ wasmUrl,configUrl,
(command: string, _: number) => this.setProgress(command),
false,
completeHandler
diff --git a/ide/src/trace/component/SpFlag.html.ts b/ide/src/trace/component/SpFlag.html.ts
index 273c5cea..7c88577b 100644
--- a/ide/src/trace/component/SpFlag.html.ts
+++ b/ide/src/trace/component/SpFlag.html.ts
@@ -106,6 +106,9 @@ export const SpFlagHtml = `
diff --git a/ide/src/trace/component/SpFlags.ts b/ide/src/trace/component/SpFlags.ts
index d3bf0845..e8ebe0f8 100644
--- a/ide/src/trace/component/SpFlags.ts
+++ b/ide/src/trace/component/SpFlags.ts
@@ -15,6 +15,9 @@
import { BaseElement, element } from '../../base-ui/BaseElement';
import { SpFlagHtml } from './SpFlag.html';
+import { LitSelectV } from '../../base-ui/select/LitSelectV';
+import { SysCallMap } from './trace/base/SysCallUtils';
+
const NUM = '000000';
//vsync二级下拉选框对应的value和content
const VSYNC_CONTENT = [
@@ -46,14 +49,71 @@ const CONFIG_STATE: unknown = {
export class SpFlags extends BaseElement {
private bodyEl: HTMLElement | undefined | null;
private xiaoLubanEl: Element | null | undefined;
+ private systemCallSelect: LitSelectV | undefined | null;
+ private systemCallInput: HTMLInputElement | undefined | null;
+ private systemCallEventId: number[] = [];
+ private systemCallSwitch: HTMLSelectElement | undefined | null;
+
+
+ connectedCallback(): void {
+ this.systemCallInput?.addEventListener('mousedown', this.systemCallSelectMousedownHandler);
+ this.systemCallSelect?.addEventListener('blur', this.systemCallSelectBlurHandler);
+ }
+
+ disconnectedCallback(): void {
+ super.disconnectedCallback();
+ this.systemCallInput?.removeEventListener('mousedown', this.systemCallSelectMousedownHandler);
+ this.systemCallSelect?.removeEventListener('blur', this.systemCallSelectBlurHandler);
+ }
initElements(): void {
let parentElement = this.parentNode as HTMLElement;
parentElement.style.overflow = 'hidden';
this.bodyEl = this.shadowRoot?.querySelector('.body');
this.initConfigList();
+ this.systemCallSelect = this.shadowRoot?.querySelector
("lit-select-v[title='SystemCall']");
+ this.systemCallSwitch = this.shadowRoot?.querySelector("select[title='System Calls']");
+ this.systemCallInput = this.systemCallSelect!.shadowRoot?.querySelector('input') as HTMLInputElement;
+ this.updateSystemCallSelect();
}
+ private updateSystemCallSelect(): void {
+ if (this.systemCallSwitch?.title === 'System Calls' && this.systemCallSwitch.selectedOptions[0].value === 'Enabled') {
+ this.systemCallSelect?.removeAttribute('disabled');
+ this.systemCallSelect?.dataSource([], '');
+ } else {
+ this.systemCallSelect?.setAttribute('disabled', 'disabled');
+ this.systemCallSelect?.dataSource([], '');
+ }
+ }
+
+ private systemCallSelectBlurHandler = () => {
+ let systemCallSelectOptions = this.systemCallSelect!.shadowRoot?.querySelectorAll('.option');
+ this.systemCallEventId = [];
+ systemCallSelectOptions!.forEach((option) => {
+ if (option.hasAttribute('selected')) {
+ const systemCallEventItem = Array.from(SysCallMap.entries())
+ .find(([id, name]) => name === option.getAttribute('value'));
+ if (systemCallEventItem) {
+ this.handleSystemCallEventId(systemCallEventItem[0]);
+ }
+ }
+ });
+ FlagsConfig.updateSystemcallEventId(this.systemCallEventId, 'SystemParsing');
+ return this.systemCallEventId;
+ };
+
+ private handleSystemCallEventId = (systemCallEventId: number): void => {
+ this.systemCallEventId.push(systemCallEventId);
+ };
+
+ private systemCallSelectMousedownHandler = (): void => {
+ if (this.systemCallSwitch)
+ systemCallConfigList[0].selectArray = Array.from(SysCallMap.entries())
+ .map(([id, name]) => `${name}`);
+ this.systemCallSelect?.dataSource(systemCallConfigList[0].selectArray, 'ALL-SystemCall')
+ };
+
initHtml(): string {
return SpFlagHtml;
}
@@ -102,6 +162,11 @@ export class SpFlags extends BaseElement {
this.xiaoLubanEl?.removeAttribute('enabled');
}
}
+ if (configSelect.title === 'System Calls' && configSelect.selectedOptions[0].value === 'Enabled') {
+ this.systemCallSelect?.removeAttribute('disabled');
+ } else {
+ this.systemCallSelect?.setAttribute('disabled', 'disabled');
+ }
});
let userIdInput: HTMLInputElement | null | undefined = this.shadowRoot?.querySelector('#user_id_input');
if (configSelect.title === 'AI' && configSelect.selectedOptions[0].value === 'Enabled' && userIdInput?.value === '') {
@@ -226,10 +291,51 @@ export class SpFlags extends BaseElement {
configFooterDiv.appendChild(userIdInputEl);
configDiv.appendChild(configFooterDiv);
}
+ if (config.title === 'System Calls') {
+ let configFooterDiv = document.createElement('div');
+ configFooterDiv.className = 'config_footer';
+ let systemCallConfigEl = document.createElement('div');
+ systemCallConfigEl.className = 'system-call-config';
+ systemCallConfigList.forEach((config) => {
+ let systemCallConfigDiv = document.createElement('div');
+ if (config.hidden) {
+ systemCallConfigDiv.className = 'systemCall-config-div hidden';
+ } else {
+ systemCallConfigDiv.className = 'systemCall-config-div';
+ }
+ switch (config.type) {
+ case 'select-multiple':
+ this.configTypeBySelectMultiple(config, systemCallConfigDiv);
+ break;
+ default:
+ break;
+ }
+ systemCallConfigEl.appendChild(systemCallConfigDiv);
+ })
+ configFooterDiv.appendChild(systemCallConfigEl);
+ configDiv.appendChild(configFooterDiv);
+ }
this.bodyEl!.appendChild(configDiv);
});
}
+ private configTypeBySelectMultiple(config: unknown, systemCallConfigDiv: HTMLDivElement): void {
+ let html = '';
+ //@ts-ignore
+ let placeholder = config.selectArray[0];
+ html += ``;
+ //@ts-ignore
+ config.selectArray.forEach((value: string) => {
+ html += `${value}`;
+ });
+ html += '';
+ systemCallConfigDiv.innerHTML = systemCallConfigDiv.innerHTML + html;
+ }
+
private createPersonOption(list: unknown, key: string, config: unknown): HTMLDivElement {
let configFooterDiv = document.createElement('div');
configFooterDiv.className = 'config_footer';
@@ -279,6 +385,7 @@ export type Params = {
export class FlagsConfig {
static FLAGS_CONFIG_KEY = 'FlagsConfig';
+ static SYSTEM_PRASE = 'SystemParsing';
static DEFAULT_CONFIG: Array = [
{
title: 'TaskPool',
@@ -359,6 +466,12 @@ export class FlagsConfig {
switchOptions: [{ option: 'Enabled' }, { option: 'Disabled', selected: true }],
describeContent: 'Start AI',
addInfo: { userId: '' },
+ },
+ {
+ title: 'System Calls',
+ switchOptions: [{ option: 'Enabled' }, { option: 'Disabled', selected: true }],
+ describeContent: 'Start System Call Parsing',
+ addInfo: { userId: '' },
}
];
@@ -417,6 +530,11 @@ export class FlagsConfig {
});
// @ts-ignore
parseConfig[configItem.title] = selectedOption[0].option === 'Enabled' ? 1 : 0;
+ // @ts-ignore
+ if (configItem.title === 'System Calls') {
+ // @ts-ignore
+ parseConfig[configItem.title] = selectedOption[0].option === 'Enabled' ? FlagsConfig.getSystemcallEventId('SystemParsing').join(';') : '';
+ }
});
return JSON.stringify({ config: parseConfig });
}
@@ -471,6 +589,21 @@ export class FlagsConfig {
flagConfigObj[key] = value;
window.localStorage.setItem(FlagsConfig.FLAGS_CONFIG_KEY, JSON.stringify(flagConfigObj));
}
+
+
+ static getSystemcallEventId(value: string): number[] {
+ let list = window.localStorage.getItem(FlagsConfig.SYSTEM_PRASE);
+ return JSON.parse(list!);
+ }
+
+ static updateSystemcallEventId(systemCallEventId: number[], value: unknown): void {
+ let systemcallEventId = window.localStorage.getItem(FlagsConfig.SYSTEM_PRASE);
+ let systemCallEventIdArray:number[] = [];
+ if (systemcallEventId !== null) {
+ systemCallEventIdArray = systemCallEventId;
+ }
+ window.localStorage.setItem(FlagsConfig.SYSTEM_PRASE, JSON.stringify(systemCallEventIdArray));
+ }
}
export interface FlagConfigItem {
@@ -484,3 +617,12 @@ export interface OptionItem {
option: string;
selected?: boolean;
}
+
+const systemCallConfigList = [
+ {
+ title: 'SystemCall',
+ des: '',
+ hidden: true,
+ type: 'select-multiple',
+ selectArray: [''],
+ }]
diff --git a/ide/src/trace/component/SpSystemTrace.init.ts b/ide/src/trace/component/SpSystemTrace.init.ts
index e239e4f9..8d43e0cd 100644
--- a/ide/src/trace/component/SpSystemTrace.init.ts
+++ b/ide/src/trace/component/SpSystemTrace.init.ts
@@ -1190,6 +1190,7 @@ async function spSystemTraceInitBuffer(
sp: SpSystemTrace,
param: { buf?: ArrayBuffer; Url?: string; buf2?: ArrayBuffer },
wasmConfigUri: string,
+ configUri: string,
progress: Function
): Promise<{
status: boolean;
@@ -1203,13 +1204,23 @@ async function spSystemTraceInitBuffer(
error('getWasmConfigFailed', e);
}
let parseConfig = FlagsConfig.getSpTraceStreamParseConfig();
- let { status, msg, sdkConfigMap } = await threadPool.initSqlite(param.buf, parseConfig, configJson, progress);
+ let systemParseConfigJson = '';
+ try {
+ systemParseConfigJson = await fetch(configUri).then((res) => res.text());
+ let systemParseConfig = JSON.parse(systemParseConfigJson);
+ let parseConfigObj = JSON.parse(parseConfig);
+ systemParseConfig.config = parseConfigObj.config;
+ systemParseConfigJson = JSON.stringify(systemParseConfig);
+ } catch (e) {
+ error('systemParseConfigJsonFailed', e);
+ }
+ let { status, msg, sdkConfigMap } = await threadPool.initSqlite(param.buf, systemParseConfigJson, configJson, progress);
if (!status) {
return { status: false, msg: msg };
}
SpSystemTrace.SDK_CONFIG_MAP = sdkConfigMap;
if (param.buf2) {
- let { status, msg } = await threadPool2.initSqlite(param.buf2, parseConfig, configJson, progress);
+ let { status, msg } = await threadPool2.initSqlite(param.buf2, systemParseConfigJson, configJson, progress);
if (!status) {
return { status: false, msg: msg };
}
@@ -1223,6 +1234,7 @@ async function spSystemTraceInitUrl(
sp: SpSystemTrace,
param: { buf?: ArrayBuffer; url?: string },
wasmConfigUri: string,
+ configUri: string,
progress: Function
): Promise<{
status: boolean;
@@ -1243,16 +1255,17 @@ export async function spSystemTraceInit(
sp: SpSystemTrace,
param: { buf?: ArrayBuffer; url?: string; buf2?: ArrayBuffer; fileName1?: string; fileName2?: string },
wasmConfigUri: string,
+ configUri: string,
progress: Function,
isDistributed: boolean
): Promise {
progress('Load database', 6);
sp.rowsPaneEL!.scroll({ top: 0, left: 0 });
- let rsBuf = await spSystemTraceInitBuffer(sp, param, wasmConfigUri, progress);
+ let rsBuf = await spSystemTraceInitBuffer(sp, param, wasmConfigUri, configUri, progress);
if (rsBuf) {
return rsBuf;
}
- let rsUrl = await spSystemTraceInitUrl(sp, param, wasmConfigUri, progress);
+ let rsUrl = await spSystemTraceInitUrl(sp, param, wasmConfigUri, configUri, progress);
if (rsUrl) {
return rsUrl;
}
diff --git a/ide/src/trace/component/SpSystemTrace.ts b/ide/src/trace/component/SpSystemTrace.ts
index 32bcd136..8f1449ea 100644
--- a/ide/src/trace/component/SpSystemTrace.ts
+++ b/ide/src/trace/component/SpSystemTrace.ts
@@ -2257,7 +2257,7 @@ export class SpSystemTrace extends BaseElement {
complete?: ((res: { status: boolean; msg: string }) => void) | undefined
): void {
this.observerScrollHeightEnable = false;
- this.init({ url: url }, '', progress, false).then((res) => {
+ this.init({ url: url }, '', '', progress, false).then((res) => {
if (complete) {
// @ts-ignore
complete(res);
@@ -2271,6 +2271,7 @@ export class SpSystemTrace extends BaseElement {
loadDatabaseArrayBuffer(
buf: ArrayBuffer,
thirdPartyWasmConfigUrl: string,
+ configUrl:string,
progress: (name: string, percent: number) => void,
isDistributed: boolean,
complete?: ((res: { status: boolean; msg: string }) => void) | undefined,
@@ -2284,7 +2285,7 @@ export class SpSystemTrace extends BaseElement {
} else {
this.timerShaftEL?.removeAttribute('distributed');
}
- this.init({ buf, buf2, fileName1, fileName2 }, thirdPartyWasmConfigUrl, progress, isDistributed).then((res) => {
+ this.init({ buf, buf2, fileName1, fileName2 }, thirdPartyWasmConfigUrl, configUrl, progress, isDistributed).then((res) => {
// @ts-ignore
this.rowsEL?.querySelectorAll('trace-row').forEach((it: unknown) => this.observer.observe(it));
if (complete) {
@@ -2748,10 +2749,11 @@ export class SpSystemTrace extends BaseElement {
init = async (
param: { buf?: ArrayBuffer; url?: string; buf2?: ArrayBuffer; fileName1?: string; fileName2?: string },
wasmConfigUri: string,
+ configUrl: string,
progress: Function,
isDistributed: boolean
): Promise => {
- return spSystemTraceInit(this, param, wasmConfigUri, progress, isDistributed);
+ return spSystemTraceInit(this, param, wasmConfigUri, configUrl, progress, isDistributed);
};
// @ts-ignore
extracted(it: TraceRow) {
diff --git a/ide/src/trace/component/chart/SpProcessChart.ts b/ide/src/trace/component/chart/SpProcessChart.ts
index ab9af407..f73df505 100644
--- a/ide/src/trace/component/chart/SpProcessChart.ts
+++ b/ide/src/trace/component/chart/SpProcessChart.ts
@@ -620,7 +620,9 @@ export class SpProcessChart {
processRow.rowType = TraceRow.ROW_TYPE_PROCESS;
processRow.rowParentId = '';
processRow.style.height = '40px';
- this.processRowSettingConfig(processRow);
+ if (FlagsConfig.getFlagsConfigEnableStatus('System Calls')) {
+ this.processRowSettingConfig(processRow);
+ }
processRow.folder = true;
if (
//@ts-ignore
diff --git a/ide/src/trace/component/trace/base/SysCallUtils.ts b/ide/src/trace/component/trace/base/SysCallUtils.ts
index 3b8609a1..eda34c18 100644
--- a/ide/src/trace/component/trace/base/SysCallUtils.ts
+++ b/ide/src/trace/component/trace/base/SysCallUtils.ts
@@ -14,282 +14,334 @@
*/
export const SysCallMap = new Map([
- [0, "sys_io_setup"],
- [1, "sys_io_destroy"],
- [2, "sys_io_submit"],
- [3, "sys_io_cancel"],
- [4, "sys_io_getevents"],
- [5, "sys_setxattr"],
- [6, "sys_lsetxattr"],
- [7, "sys_fsetxattr"],
- [8, "sys_getxattr"],
- [9, "sys_lgetxattr"],
- [10, "sys_fgetxattr"],
- [11, "sys_listxattr"],
- [12, "sys_llistxattr"],
- [13, "sys_flistxattr"],
- [14, "sys_removexattr"],
- [15, "sys_lremovexattr"],
- [16, "sys_fremovexattr"],
- [17, "sys_getcwd"],
- [18, "sys_lookup_dcookie"],
- [19, "sys_eventfd2"],
- [20, "sys_epoll_create1"],
- [21, "sys_epoll_ctl"],
- [22, "sys_epoll_pwait"],
- [23, "sys_dup"],
- [24, "sys_dup3"],
- [25, "sys_fcntl"],
- [26, "sys_inotify_init1"],
- [27, "sys_inotify_add_watch"],
- [28, "sys_inotify_rm_watch"],
- [29, "sys_ioctl"],
- [30, "sys_ioprio_set"],
- [31, "sys_ioprio_get"],
- [32, "sys_flock"],
- [33, "sys_mknodat"],
- [34, "sys_mkdirat"],
- [35, "sys_unlinkat"],
- [36, "sys_symlinkat"],
- [37, "sys_linkat"],
- [38, "sys_renameat"],
- [39, "sys_umount2"],
- [40, "sys_mount"],
- [41, "sys_pivot_root"],
- [42, "sys_nfsservctl"],
- [43, "sys_statfs"],
- [44, "sys_fstatfs"],
- [45, "sys_truncate"],
- [46, "sys_ftruncate"],
- [47, "sys_fallocate"],
- [48, "sys_faccessat"],
- [49, "sys_chdir"],
- [50, "sys_fchdir"],
- [51, "sys_chroot"],
- [52, "sys_fchmod"],
- [53, "sys_fchmodat"],
- [54, "sys_fchownat"],
- [55, "sys_fchown"],
- [56, "sys_openat"],
- [57, "sys_close"],
- [58, "sys_vhangup"],
- [59, "sys_pipe2"],
- [60, "sys_quotactl"],
- [61, "sys_getdents64"],
- [62, "sys_lseek"],
- [63, "sys_read"],
- [64, "sys_write"],
- [65, "sys_readlinkat"],
- [66, "sys_fstatat"],
- [67, "sys_fstat"],
- [68, "sys_sync"],
- [69, "sys_fsync"],
- [70, "sys_fdatasync"],
- [71, "sys_sync_file_range"],
- [72, "sys_timerfd_create"],
- [73, "sys_timerfd_settime"],
- [74, "sys_timerfd_gettime"],
- [75, "sys_utimensat"],
- [76, "sys_acct"],
- [77, "sys_capget"],
- [78, "sys_capset"],
- [79, "sys_personality"],
- [93, "sys_exit"],
- [94, "sys_exit_group"],
- [95, "sys_waitid"],
- [96, "sys_set_tid_address"],
- [97, "sys_unshare"],
- [98, "sys_futex"],
- [99, "sys_set_robust_list"],
- [100, "sys_get_robust_list"],
- [101, "sys_nanosleep"],
- [102, "sys_getitimer"],
- [103, "sys_setitimer"],
- [104, "sys_kexec_load"],
- [105, "sys_init_module"],
- [106, "sys_delete_module"],
- [107, "sys_timer_create"],
- [108, "sys_timer_settime"],
- [109, "sys_timer_gettime"],
- [110, "sys_timer_getoverrun"],
- [111, "sys_timer_delete"],
- [112, "sys_clock_settime"],
- [113, "sys_clock_gettime"],
- [114, "sys_clock_getres"],
- [115, "sys_clock_nanosleep"],
- [116, "sys_syslog"],
- [117, "sys_ptrace"],
- [118, "sys_sched_setparam"],
- [119, "sys_sched_setscheduler"],
- [120, "sys_sched_getscheduler"],
- [121, "sys_sched_getparam"],
- [122, "sys_sched_setaffinity"],
- [123, "sys_sched_getaffinity"],
- [124, "sys_sched_yield"],
- [125, "sys_sched_get_priority_max"],
- [126, "sys_sched_get_priority_min"],
- [127, "sys_sched_rr_get_interval"],
- [128, "sys_restart_syscall"],
- [129, "sys_kill"],
- [130, "sys_tkill"],
- [131, "sys_tgkill"],
- [132, "sys_sigaltstack"],
- [133, "sys_rt_sigsuspend"],
- [134, "sys_rt_sigaction"],
- [135, "sys_rt_sigprocmask"],
- [136, "sys_rt_sigpending"],
- [137, "sys_rt_sigtimedwait"],
- [138, "sys_rt_sigqueueinfo"],
- [139, "sys_rt_sigreturn"],
- [140, "sys_setpriority"],
- [141, "sys_getpriority"],
- [142, "sys_reboot"],
- [143, "sys_setregid"],
- [144, "sys_setgid"],
- [145, "sys_setreuid"],
- [146, "sys_setuid"],
- [147, "sys_setresuid"],
- [148, "sys_getresuid"],
- [149, "sys_setresgid"],
- [150, "sys_getresgid"],
- [151, "sys_setfsuid"],
- [152, "sys_setfsgid"],
- [153, "sys_times"],
- [154, "sys_setpgid"],
- [155, "sys_getpgid"],
- [156, "sys_getsid"],
- [157, "sys_setsid"],
- [158, "sys_getgroups"],
- [159, "sys_setgroups"],
- [160, "sys_uname"],
- [161, "sys_sethostname"],
- [162, "sys_setdomainname"],
- [163, "sys_getrlimit"],
- [164, "sys_setrlimit"],
- [165, "sys_getrusage"],
- [166, "sys_umask"],
- [167, "sys_prctl"],
- [168, "sys_getcpu"],
- [169, "sys_gettimeofday"],
- [170, "sys_settimeofday"],
- [171, "sys_adjtimex"],
- [172, "sys_getpid"],
- [173, "sys_getppid"],
- [174, "sys_getuid"],
- [175, "sys_geteuid"],
- [176, "sys_getgid"],
- [177, "sys_getegid"],
- [178, "sys_gettid"],
- [179, "sys_sysinfo"],
- [180, "sys_mq_open"],
- [181, "sys_mq_unlink"],
- [182, "sys_mq_timedsend"],
- [183, "sys_mq_timedreceive"],
- [184, "sys_mq_notify"],
- [185, "sys_mq_getsetattr"],
- [186, "sys_msgget"],
- [187, "sys_msgctl"],
- [188, "sys_msgrcv"],
- [189, "sys_msgsnd"],
- [190, "sys_semget"],
- [191, "sys_semctl"],
- [192, "sys_semop"],
- [193, "sys_semtimedop"],
- [194, "sys_shmget"],
- [195, "sys_shmctl"],
- [196, "sys_shmat"],
- [197, "sys_shmdt"],
- [198, "sys_socket"],
- [199, "sys_socketpair"],
- [200, "sys_bind"],
- [201, "sys_listen"],
- [202, "sys_accept"],
- [203, "sys_connect"],
- [204, "sys_getsockname"],
- [205, "sys_getpeername"],
- [206, "sys_sendto"],
- [207, "sys_recvfrom"],
- [208, "sys_setsockopt"],
- [209, "sys_getsockopt"],
- [210, "sys_shutdown"],
- [211, "sys_sendmsg"],
- [212, "sys_recvmsg"],
- [213, "sys_readahead"],
- [214, "sys_brk"],
- [215, "sys_munmap"],
- [216, "sys_mremap"],
- [217, "sys_add_key"],
- [218, "sys_request_key"],
- [219, "sys_keyctl"],
- [220, "sys_clone"],
- [221, "sys_execve"],
- [222, "sys_mmap"],
- [223, "sys_fadvise64"],
- [224, "sys_swapon"],
- [225, "sys_swapoff"],
- [226, "sys_mprotect"],
- [227, "sys_msync"],
- [228, "sys_mlock"],
- [229, "sys_munlock"],
- [230, "sys_mlockall"],
- [231, "sys_munlockall"],
- [232, "sys_mincore"],
- [233, "sys_madvise"],
- [234, "sys_remap_file_pages"],
- [235, "sys_mbind"],
- [236, "sys_get_mempolicy"],
- [237, "sys_set_mempolicy"],
- [238, "sys_migrate_pages"],
- [239, "sys_move_pages"],
- [240, "sys_rt_tgsigqueueinfo"],
- [241, "sys_perf_event_open"],
- [242, "sys_accept4"],
- [243, "sys_recvmmsg"],
- [260, "sys_wait4"],
- [261, "sys_prlimit64"],
- [262, "sys_fanotify_init"],
- [263, "sys_fanotify_mark"],
- [264, "sys_name_to_handle_at"],
- [265, "sys_open_by_handle_at"],
- [266, "sys_clock_adjtime"],
- [267, "sys_syncfs"],
- [268, "sys_setns"],
- [269, "sys_sendmmsg"],
- [270, "sys_process_vm_readv"],
- [271, "sys_process_vm_writev"],
- [272, "sys_kcmp"],
- [273, "sys_finit_module"],
- [274, "sys_sched_setattr"],
- [275, "sys_sched_getattr"],
- [276, "sys_renameat2"],
- [277, "sys_seccomp"],
- [278, "sys_getrandom"],
- [279, "sys_memfd_create"],
- [280, "sys_bpf"],
- [281, "sys_execveat"],
- [282, "sys_userfaultfd"],
- [283, "sys_membarrier"],
- [284, "sys_mlock2"],
- [285, "sys_copy_file_range"],
- [286, "sys_preadv2"],
- [287, "sys_pwritev2"],
- [288, "sys_pkey_mprotect"],
- [289, "sys_pkey_alloc"],
- [290, "sys_pkey_free"],
- [291, "sys_statx"],
- [292, "sys_io_pgetevents"],
- [293, "sys_rseq"],
- [294, "sys_kexec_file_load"],
- [424, "sys_pidfd_send_signal"],
- [425, "sys_io_uring_setup"],
- [426, "sys_io_uring_enter"],
- [427, "sys_io_uring_register"],
- [428, "sys_open_tree"],
- [429, "sys_move_mount"],
- [430, "sys_fsopen"],
- [431, "sys_fsconfig"],
- [432, "sys_fsmount"],
- [433, "sys_fspick"],
- [434, "sys_pidfd_open"],
- [435, "sys_clone3"]
+ [0, "sys_io_setup"],
+ [1, "sys_io_destroy"],
+ [2, "sys_io_submit"],
+ [3, "sys_io_cancel"],
+ [4, "sys_io_getevents"],
+ [5, "sys_setxattr"],
+ [6, "sys_lsetxattr"],
+ [7, "sys_fsetxattr"],
+ [8, "sys_getxattr"],
+ [9, "sys_lgetxattr"],
+ [10, "sys_fgetxattr"],
+ [11, "sys_listxattr"],
+ [12, "sys_llistxattr"],
+ [13, "sys_flistxattr"],
+ [14, "sys_removexattr"],
+ [15, "sys_lremovexattr"],
+ [16, "sys_fremovexattr"],
+ [17, "sys_getcwd"],
+ [18, "sys_lookup_dcookie"],
+ [19, "sys_eventfd2"],
+ [20, "sys_epoll_create1"],
+ [21, "sys_epoll_ctl"],
+ [22, "sys_epoll_pwait"],
+ [23, "sys_dup"],
+ [24, "sys_dup3"],
+ [25, "sys_fcntl"],
+ [26, "sys_inotify_init1"],
+ [27, "sys_inotify_add_watch"],
+ [28, "sys_inotify_rm_watch"],
+ [29, "sys_ioctl"],
+ [30, "sys_ioprio_set"],
+ [31, "sys_ioprio_get"],
+ [32, "sys_flock"],
+ [33, "sys_mknodat"],
+ [34, "sys_mkdirat"],
+ [35, "sys_unlinkat"],
+ [36, "sys_symlinkat"],
+ [37, "sys_linkat"],
+ [38, "sys_renameat"],
+ [39, "sys_umount2"],
+ [40, "sys_mount"],
+ [41, "sys_pivot_root"],
+ [42, "sys_nfsservctl"],
+ [43, "sys_statfs"],
+ [44, "sys_fstatfs"],
+ [45, "sys_truncate"],
+ [46, "sys_ftruncate"],
+ [47, "sys_fallocate"],
+ [48, "sys_faccessat"],
+ [49, "sys_chdir"],
+ [50, "sys_fchdir"],
+ [51, "sys_chroot"],
+ [52, "sys_fchmod"],
+ [53, "sys_fchmodat"],
+ [54, "sys_fchownat"],
+ [55, "sys_fchown"],
+ [56, "sys_openat"],
+ [57, "sys_close"],
+ [58, "sys_vhangup"],
+ [59, "sys_pipe2"],
+ [60, "sys_quotactl"],
+ [61, "sys_getdents64"],
+ [62, "sys_lseek"],
+ [63, "sys_read"],
+ [64, "sys_write"],
+ [65, "sys_readv"],
+ [66, "sys_writev"],
+ [67, "sys_pread64"],
+ [68, "sys_pwrite64"],
+ [69, "sys_preadv"],
+ [70, "sys_pwritev"],
+ [71, "sys_sendfile"],
+ [72, "sys_pselect6"],
+ [73, "sys_ppoll"],
+ [74, "sys_signalfd4"],
+ [75, "sys_vmsplice"],
+ [76, "sys_splice"],
+ [77, "sys_tee"],
+ [78, "sys_readlinkat"],
+ [79, "sys_fstatat"],
+ [80, "sys_fstat"],
+ [81, "sys_sync"],
+ [82, "sys_fsync"],
+ [83, "sys_fdatasync"],
+ [84, "sys_sync_file_range"],
+ [85, "sys_timerfd_create"],
+ [86, "sys_timerfd_settime"],
+ [87, "sys_timerfd_gettime"],
+ [88, "sys_utimensat"],
+ [89, "sys_acct"],
+ [90, "sys_capget"],
+ [91, "sys_capset"],
+ [92, "sys_personality"],
+ [93, "sys_exit"],
+ [94, "sys_exit_group"],
+ [95, "sys_waitid"],
+ [96, "sys_set_tid_address"],
+ [97, "sys_unshare"],
+ [98, "sys_futex"],
+ [99, "sys_set_robust_list"],
+ [100, "sys_get_robust_list"],
+ [101, "sys_nanosleep"],
+ [102, "sys_getitimer"],
+ [103, "sys_setitimer"],
+ [104, "sys_kexec_load"],
+ [105, "sys_init_module"],
+ [106, "sys_delete_module"],
+ [107, "sys_timer_create"],
+ [108, "sys_timer_gettime"],
+ [109, "sys_timer_getoverrun"],
+ [110, "sys_timer_settime"],
+ [111, "sys_timer_delete"],
+ [112, "sys_clock_settime"],
+ [113, "sys_clock_gettime"],
+ [114, "sys_clock_getres"],
+ [115, "sys_clock_nanosleep"],
+ [116, "sys_syslog"],
+ [117, "sys_ptrace"],
+ [118, "sys_sched_setparam"],
+ [119, "sys_sched_setscheduler"],
+ [120, "sys_sched_getscheduler"],
+ [121, "sys_sched_getparam"],
+ [122, "sys_sched_setaffinity"],
+ [123, "sys_sched_getaffinity"],
+ [124, "sys_sched_yield"],
+ [125, "sys_sched_get_priority_max"],
+ [126, "sys_sched_get_priority_min"],
+ [127, "sys_sched_rr_get_interval"],
+ [128, "sys_restart_syscall"],
+ [129, "sys_kill"],
+ [130, "sys_tkill"],
+ [131, "sys_tgkill"],
+ [132, "sys_sigaltstack"],
+ [133, "sys_rt_sigsuspend"],
+ [134, "sys_rt_sigaction"],
+ [135, "sys_rt_sigprocmask"],
+ [136, "sys_rt_sigpending"],
+ [137, "sys_rt_sigtimedwait"],
+ [138, "sys_rt_sigqueueinfo"],
+ [139, "sys_rt_sigreturn"],
+ [140, "sys_setpriority"],
+ [141, "sys_getpriority"],
+ [142, "sys_reboot"],
+ [143, "sys_setregid"],
+ [144, "sys_setgid"],
+ [145, "sys_setreuid"],
+ [146, "sys_setuid"],
+ [147, "sys_setresuid"],
+ [148, "sys_getresuid"],
+ [149, "sys_setresgid"],
+ [150, "sys_getresgid"],
+ [151, "sys_setfsuid"],
+ [152, "sys_setfsgid"],
+ [153, "sys_times"],
+ [154, "sys_setpgid"],
+ [155, "sys_getpgid"],
+ [156, "sys_getsid"],
+ [157, "sys_setsid"],
+ [158, "sys_getgroups"],
+ [159, "sys_setgroups"],
+ [160, "sys_uname"],
+ [161, "sys_sethostname"],
+ [162, "sys_setdomainname"],
+ [163, "sys_getrlimit"],
+ [164, "sys_setrlimit"],
+ [165, "sys_getrusage"],
+ [166, "sys_umask"],
+ [167, "sys_prctl"],
+ [168, "sys_getcpu"],
+ [169, "sys_gettimeofday"],
+ [170, "sys_settimeofday"],
+ [171, "sys_adjtimex"],
+ [172, "sys_getpid"],
+ [173, "sys_getppid"],
+ [174, "sys_getuid"],
+ [175, "sys_geteuid"],
+ [176, "sys_getgid"],
+ [177, "sys_getegid"],
+ [178, "sys_gettid"],
+ [179, "sys_sysinfo"],
+ [180, "sys_mq_open"],
+ [181, "sys_mq_unlink"],
+ [182, "sys_mq_timedsend"],
+ [183, "sys_mq_timedreceive"],
+ [184, "sys_mq_notify"],
+ [185, "sys_mq_getsetattr"],
+ [186, "sys_msgget"],
+ [187, "sys_msgctl"],
+ [188, "sys_msgrcv"],
+ [189, "sys_msgsnd"],
+ [190, "sys_semget"],
+ [191, "sys_semctl"],
+ [192, "sys_semtimedop"],
+ [193, "sys_semop"],
+ [194, "sys_shmget"],
+ [195, "sys_shmctl"],
+ [196, "sys_shmat"],
+ [197, "sys_shmdt"],
+ [198, "sys_socket"],
+ [199, "sys_socketpair"],
+ [200, "sys_bind"],
+ [201, "sys_listen"],
+ [202, "sys_accept"],
+ [203, "sys_connect"],
+ [204, "sys_getsockname"],
+ [205, "sys_getpeername"],
+ [206, "sys_sendto"],
+ [207, "sys_recvfrom"],
+ [208, "sys_setsockopt"],
+ [209, "sys_getsockopt"],
+ [210, "sys_shutdown"],
+ [211, "sys_sendmsg"],
+ [212, "sys_recvmsg"],
+ [213, "sys_readahead"],
+ [214, "sys_brk"],
+ [215, "sys_munmap"],
+ [216, "sys_mremap"],
+ [217, "sys_add_key"],
+ [218, "sys_request_key"],
+ [219, "sys_keyctl"],
+ [220, "sys_clone"],
+ [221, "sys_execve"],
+ [222, "sys_mmap"],
+ [223, "sys_fadvise64"],
+ [224, "sys_swapon"],
+ [225, "sys_swapoff"],
+ [226, "sys_mprotect"],
+ [227, "sys_msync"],
+ [228, "sys_mlock"],
+ [229, "sys_munlock"],
+ [230, "sys_mlockall"],
+ [231, "sys_munlockall"],
+ [232, "sys_mincore"],
+ [233, "sys_madvise"],
+ [234, "sys_remap_file_pages"],
+ [235, "sys_mbind"],
+ [236, "sys_get_mempolicy"],
+ [237, "sys_set_mempolicy"],
+ [238, "sys_migrate_pages"],
+ [239, "sys_move_pages"],
+ [240, "sys_rt_tgsigqueueinfo"],
+ [241, "sys_perf_event_open"],
+ [242, "sys_accept4"],
+ [243, "sys_recvmmsg"],
+ [244, "sys_arch_specific_syscall"],
+ [260, "sys_wait4"],
+ [261, "sys_prlimit64"],
+ [262, "sys_fanotify_init"],
+ [263, "sys_fanotify_mark"],
+ [264, "sys_name_to_handle_at"],
+ [265, "sys_open_by_handle_at"],
+ [266, "sys_clock_adjtime"],
+ [267, "sys_syncfs"],
+ [268, "sys_setns"],
+ [269, "sys_sendmmsg"],
+ [270, "sys_process_vm_readv"],
+ [271, "sys_process_vm_writev"],
+ [272, "sys_kcmp"],
+ [273, "sys_finit_module"],
+ [274, "sys_sched_setattr"],
+ [275, "sys_sched_getattr"],
+ [276, "sys_renameat2"],
+ [277, "sys_seccomp"],
+ [278, "sys_getrandom"],
+ [279, "sys_memfd_create"],
+ [280, "sys_bpf"],
+ [281, "sys_execveat"],
+ [282, "sys_userfaultfd"],
+ [283, "sys_membarrier"],
+ [284, "sys_mlock2"],
+ [285, "sys_copy_file_range"],
+ [286, "sys_preadv2"],
+ [287, "sys_pwritev2"],
+ [288, "sys_pkey_mprotect"],
+ [289, "sys_pkey_alloc"],
+ [290, "sys_pkey_free"],
+ [291, "sys_statx"],
+ [292, "sys_io_pgetevents"],
+ [293, "sys_rseq"],
+ [294, "sys_kexec_file_load"],
+ [403, "sys_clock_gettime64"],
+ [404, "sys_clock_settime64"],
+ [405, "sys_clock_adjtime64"],
+ [406, "sys_clock_getres_time64"],
+ [407, "sys_clock_nanosleep_time64"],
+ [408, "sys_timer_gettime64"],
+ [409, "sys_timer_settime64"],
+ [410, "sys_timerfd_gettime64"],
+ [411, "sys_timerfd_settime64"],
+ [412, "sys_utimensat_time64"],
+ [413, "sys_pselect6_time64"],
+ [414, "sys_ppoll_time64"],
+ [416, "sys_io_pgetevents_time64"],
+ [417, "sys_recvmmsg_time64"],
+ [418, "sys_mq_timedsend_time64"],
+ [419, "sys_mq_timedreceive_time64"],
+ [420, "sys_semtimedop_time64"],
+ [421, "sys_rt_sigtimedwait_time64"],
+ [422, "sys_futex_time64"],
+ [423, "sys_sched_rr_get_interval_time64"],
+ [424, "sys_pidfd_send_signal"],
+ [425, "sys_io_uring_setup"],
+ [426, "sys_io_uring_enter"],
+ [427, "sys_io_uring_register"],
+ [428, "sys_open_tree"],
+ [429, "sys_move_mount"],
+ [430, "sys_fsopen"],
+ [431, "sys_fsconfig"],
+ [432, "sys_fsmount"],
+ [433, "sys_fspick"],
+ [434, "sys_pidfd_open"],
+ [435, "sys_clone3"],
+ [436, "sys_close_range"],
+ [437, "sys_openat2"],
+ [438, "sys_pidfd_getfd"],
+ [439, "sys_faccessat2"],
+ [440, "sys_process_madvise"],
+ [441, "sys_epoll_pwait2"],
+ [442, "sys_mount_setattr"],
+ [443, "sys_quotactl_fd"],
+ [444, "sys_landlock_create_ruleset"],
+ [445, "sys_landlock_add_rule"],
+ [446, "sys_landlock_restrict_self"],
+ [447, "sys_memfd_secret"],
+ [448, "sys_process_mrelease"],
+ [449, "sys_futex_waitv"],
+ [450, "sys_set_mempolicy_home_node"],
+ [451, "sys_cachestat"],
+ [452, "sys_fchmodat2"],
+ [453, "sys_syscalls"]
]);
\ No newline at end of file
diff --git a/ide/src/trace/database/TraceWorker.ts b/ide/src/trace/database/TraceWorker.ts
index 1923ed8a..b9bb33ee 100644
--- a/ide/src/trace/database/TraceWorker.ts
+++ b/ide/src/trace/database/TraceWorker.ts
@@ -332,7 +332,7 @@ function parseThirdWasmByOpenAction(e: MessageEvent): void {
if (parseConfig !== '') {
let parseConfigArray = enc.encode(parseConfig);
//@ts-ignore
- let parseConfigAddr = wasmModule._InitializeParseConfig(1024);
+ let parseConfigAddr = wasmModule._InitializeParseConfig(parseConfigArray.length);
//@ts-ignore
wasmModule.HEAPU8.set(parseConfigArray, parseConfigAddr);
//@ts-ignore
diff --git a/ide/src/trace/database/data-trafic/process/ThreadSysCallDataReceiver.ts b/ide/src/trace/database/data-trafic/process/ThreadSysCallDataReceiver.ts
index 61af08b9..8001f4c0 100644
--- a/ide/src/trace/database/data-trafic/process/ThreadSysCallDataReceiver.ts
+++ b/ide/src/trace/database/data-trafic/process/ThreadSysCallDataReceiver.ts
@@ -12,22 +12,46 @@
// limitations under the License.
import { Args } from '../CommonArgs';
+import { threadSysCallList } from '../utils/AllMemoryCache';
+import { filterDataByGroup } from '../utils/DataFilter';
import { TraficEnum } from '../utils/QueryEnum';
export const chartThreadSysCallDataSql = (args: Args):unknown => {
- return `SELECT syscall_number as id, itid, ts - ${args.recordStartNS} as startTs, dur
+ return `SELECT syscall_number as id, itid, ts - ${args.recordStartNS} as startTs, max(dur) as dur,
+ ((ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px
from syscall
where itid = ${args.itid}
and startTs + dur >= ${Math.floor(args.startNS)}
and startTs <= ${Math.floor(args.endNS)}
+ group by px
`;
};
+export const sysCallMemSql = (args: Args): unknown => {
+ return `select syscall_number as id, (ts - ${args.recordStartNS}) as startTs, dur from syscall where itid = ${args.itid}`
+}
+
export function threadSysCallDataReceiver(data: unknown, proc: Function): void {
//@ts-ignore
- let sql = chartThreadSysCallDataSql(data.params);
- let res = proc(sql); //@ts-ignore
- arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer, false);
+ let itid: number = data.params.itid;
+ let arr: unknown[] = [];
+ if (threadSysCallList.has(itid)) {
+ arr = threadSysCallList.get(itid) || [];
+ } else {
+ //@ts-ignore
+ let sql = sysCallMemSql(data.params);
+ arr = proc(sql); //@ts-ignore
+ threadSysCallList.set(itid, arr);
+ }
+ let res = filterDataByGroup(
+ arr,
+ 'startTs',
+ 'dur', //@ts-ignore
+ data.params.startNS, //@ts-ignore
+ data.params.endNS, //@ts-ignore
+ data.params.width
+ );
+ arrayBufferHandler(data, res, true, false);
}
function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean, isEmpty: boolean): void {
@@ -42,7 +66,7 @@ function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean, is
startTs[i] = it.startTs; //@ts-ignore
dur[i] = it.dur; //@ts-ignore
id[i] = it.id; //@ts-ignore
- itid[i] = it.itid; //@ts-ignore
+ itid[i] = data.params.itid; //@ts-ignore
});
(self as unknown as Worker).postMessage(
{
diff --git a/ide/src/trace/database/data-trafic/process/ThreadSysCallDataSender.ts b/ide/src/trace/database/data-trafic/process/ThreadSysCallDataSender.ts
index 2e296f12..f874b4f4 100644
--- a/ide/src/trace/database/data-trafic/process/ThreadSysCallDataSender.ts
+++ b/ide/src/trace/database/data-trafic/process/ThreadSysCallDataSender.ts
@@ -73,7 +73,7 @@ function arrayBufferHandler(buffers: unknown, len: number, tid: number, pid: num
dur: dur[i],
id: id[i],
itid: itid[i],
- name: SysCallMap.get(id[i]),
+ name: SysCallMap.get(id[i]) || 'unknown event',
tid: tid,
pid: pid,
} as ThreadSysCallStruct);
diff --git a/ide/src/trace/database/data-trafic/utils/AllMemoryCache.ts b/ide/src/trace/database/data-trafic/utils/AllMemoryCache.ts
index d73f3e6f..3abdb0f6 100644
--- a/ide/src/trace/database/data-trafic/utils/AllMemoryCache.ts
+++ b/ide/src/trace/database/data-trafic/utils/AllMemoryCache.ts
@@ -47,6 +47,8 @@ export const processList: Map> = new Map();
export const memList: Map> = new Map();
//线程状态 泳道图 memory 模式缓存
export const threadStateList: Map> = new Map();
+//线程系统调用 泳道图 memory数据缓存
+export const threadSysCallList: Map> = new Map();
//进程下卡顿丢帧 泳道图 memory 模式缓存
export const processFrameList: Map> = new Map();
//hiSysEvent 泳道图 memory 模式缓存
@@ -78,6 +80,7 @@ export function clearMemoryCache(data: unknown, proc: Function): void {
processList.clear();
memList.clear();
threadStateList.clear();
+ threadSysCallList.clear();
processFrameList.clear();
lostFrameList.clear();
hitchTimeList.clear();
diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerThreadSysCall.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerThreadSysCall.ts
index aac9df64..823fe4f2 100644
--- a/ide/src/trace/database/ui-worker/ProcedureWorkerThreadSysCall.ts
+++ b/ide/src/trace/database/ui-worker/ProcedureWorkerThreadSysCall.ts
@@ -107,7 +107,7 @@ export class ThreadSysCallStruct extends BaseStruct {
threadContext.fillStyle = ColorUtils.funcTextColor(textColor);
threadContext.textBaseline = 'middle';
threadContext.font = '8px sans-serif';
- data.frame.width > 7 && drawString(threadContext, data.name!, 2, data.frame, data);
+ data.frame.width > 7 && data.name && drawString(threadContext, data.name, 2, data.frame, data);
if (
ThreadSysCallStruct.selectStruct &&
ThreadSysCallStruct.equals(ThreadSysCallStruct.selectStruct, data)
diff --git a/ide/webpack.config.js b/ide/webpack.config.js
index 598d3265..4ff1db13 100644
--- a/ide/webpack.config.js
+++ b/ide/webpack.config.js
@@ -147,6 +147,10 @@ const config = {
from: './src/doc',
to: 'doc',
},
+ {
+ from: './src/config',
+ to: 'config',
+ },
{
from: './src/base-ui/icon.svg',
to: 'base-ui/icon.svg',
--
Gitee
From 4277877b5ea4e99971edf101207296df9fefa87b Mon Sep 17 00:00:00 2001
From: JustinYT
Date: Tue, 20 May 2025 09:47:42 +0800
Subject: [PATCH 17/51] update compile script for bzip2.
Signed-off-by: JustinYT
---
trace_streamer/pare_third_party.sh | 3 ---
1 file changed, 3 deletions(-)
diff --git a/trace_streamer/pare_third_party.sh b/trace_streamer/pare_third_party.sh
index a0b7cfa8..a3d03073 100755
--- a/trace_streamer/pare_third_party.sh
+++ b/trace_streamer/pare_third_party.sh
@@ -57,9 +57,6 @@ fi
if [ ! -f "bzip2/BUILD.gn" ];then
git clone --depth=1 git@gitee.com:openharmony/third_party_bzip2.git bzip2
- cd bzip2
- ./install.sh $(pwd)
- cd ..
fi
if [ ! -f "googletest/BUILD.gn" ];then
--
Gitee
From 1dd0024168dbb4f00183ccd5ae6df3f3b8cf5e18 Mon Sep 17 00:00:00 2001
From: JustinYT
Date: Wed, 21 May 2025 11:09:31 +0800
Subject: [PATCH 18/51] fix config.json not find
Signed-off-by: JustinYT
---
ide/src/trace/component/SpSystemTrace.init.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/ide/src/trace/component/SpSystemTrace.init.ts b/ide/src/trace/component/SpSystemTrace.init.ts
index 8d43e0cd..75b7b3ea 100644
--- a/ide/src/trace/component/SpSystemTrace.init.ts
+++ b/ide/src/trace/component/SpSystemTrace.init.ts
@@ -1212,6 +1212,7 @@ async function spSystemTraceInitBuffer(
systemParseConfig.config = parseConfigObj.config;
systemParseConfigJson = JSON.stringify(systemParseConfig);
} catch (e) {
+ systemParseConfigJson = parseConfig;
error('systemParseConfigJsonFailed', e);
}
let { status, msg, sdkConfigMap } = await threadPool.initSqlite(param.buf, systemParseConfigJson, configJson, progress);
--
Gitee
From e77dbc37075a7606335e3177a7ab2c5deb1b6f31 Mon Sep 17 00:00:00 2001
From: JustinYT
Date: Wed, 21 May 2025 11:19:01 +0800
Subject: [PATCH 19/51] adjust syscalls json for use value
Signed-off-by: JustinYT
---
trace_streamer/src/filter/config_filter.cpp | 4 ++--
trace_streamer/src/rpc/rpc_server.cpp | 3 +--
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/trace_streamer/src/filter/config_filter.cpp b/trace_streamer/src/filter/config_filter.cpp
index d184bb8f..dd03a20c 100644
--- a/trace_streamer/src/filter/config_filter.cpp
+++ b/trace_streamer/src/filter/config_filter.cpp
@@ -42,7 +42,7 @@ ConfigFilter::ConfigFilter(TraceDataCache *dataCache, const TraceStreamerFilters
ConfigFilter::~ConfigFilter() {}
bool ConfigFilter::SetConfig(const std::string &configFile)
{
- json configResult = json::parse(configFile);
+ json configResult = json::parse(configFile, nullptr, false);
if (configResult.is_discarded()) {
TS_LOGE("Failed to parse config file.");
return false;
@@ -154,7 +154,7 @@ SwitchConfig::SwitchConfig(const json &config)
HMKernelTraceEnabled_ = config.value("HMKernel", 0) == 1;
rawTraceCutStartTsEnabled_ = config.value("RawTraceCutStartTs", 0) == 1;
ffrtConvertEnabled_ = config.value("FFRTConvert", 0) == 1;
- std::string syscalls = config.at("System Calls");
+ std::string syscalls = config.value("System Calls", "");
UpdateSyscallsTsSet(syscalls);
TS_LOGI(
"appConfigEnabled_=%d, animationConfigEnabled_=%d, taskPoolConfigEnabled_=%d, binderRunnableConfigEnabled_=%d, "
diff --git a/trace_streamer/src/rpc/rpc_server.cpp b/trace_streamer/src/rpc/rpc_server.cpp
index 39dc4f49..7adcc8a4 100644
--- a/trace_streamer/src/rpc/rpc_server.cpp
+++ b/trace_streamer/src/rpc/rpc_server.cpp
@@ -837,8 +837,7 @@ bool RpcServer::SplitFile(std::string timeSnaps)
bool RpcServer::ParserConfig(std::string parserConfigJson)
{
- json jMessage = json::parse(parserConfigJson);
- jsonns::ParserConfig parserConfig = jMessage.at("config");
+ TS_LOGI("parserConfigJson=%s", parserConfigJson.c_str());
ts_->SetConfigFile(parserConfigJson);
ffrtConvertEnabled_ = ts_->GetFfrtConfig();
startParseTime_ =
--
Gitee
From e1c5491833e2cdd8fd0cc1bc5eb9c83c1ffaf02f Mon Sep 17 00:00:00 2001
From: danghongquan
Date: Fri, 23 May 2025 14:30:46 +0800
Subject: [PATCH 20/51] =?UTF-8?q?fix:=E6=B1=87=E7=BC=96=E6=89=93=E7=82=B9?=
=?UTF-8?q?=E4=B8=8A=E6=8A=A5=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: danghongquan
---
.../component/trace/sheet/hiperf/TabPanePerfAnalysis.ts | 5 -----
ide/src/trace/component/trace/sheet/hiperf/TabPerfFuncAsm.ts | 5 +++++
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts
index 9b10f55a..c04d2ce9 100644
--- a/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts
+++ b/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts
@@ -27,7 +27,6 @@ import { TabpanePerfProfile } from './TabPerfProfile';
import { TabPanePerfAnalysisHtml } from './TabPanePerfAnalysis.html';
import { WebSocketManager } from '../../../../../webSocket/WebSocketManager';
import { Constants, TypeConstants } from '../../../../../webSocket/Constants';
-import { SpStatisticsHttpUtil } from '../../../../../statistics/util/SpStatisticsHttpUtil';
@element('tabpane-perf-analysis')
export class TabPanePerfAnalysis extends BaseElement {
@@ -592,10 +591,6 @@ export class TabPanePerfAnalysis extends BaseElement {
}
private functionClickEvent(it: unknown) {
- SpStatisticsHttpUtil.addOrdinaryVisitAction({
- event: 'hiperf_func',
- action: 'hiperf_func',
- });
// @ts-ignore
this.perfAnalysisHeadTips?.innerHTML = '';
if (this.selectedTabfileName.indexOf('.an') === -1 && this.selectedTabfileName.indexOf('.so') === -1) {
diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfFuncAsm.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfFuncAsm.ts
index b0db75e2..67d55a23 100644
--- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfFuncAsm.ts
+++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfFuncAsm.ts
@@ -22,6 +22,7 @@ import {
} from '../../../../bean/PerfAnalysis';
import { WebSocketManager } from '../../../../../webSocket/WebSocketManager';
import { Constants, TypeConstants } from '../../../../../webSocket/Constants';
+import { SpStatisticsHttpUtil } from '../../../../../statistics/util/SpStatisticsHttpUtil';
@element('tab-perf-func-asm')
export class TabPerfFuncAsm extends BaseElement {
@@ -170,6 +171,10 @@ export class TabPerfFuncAsm extends BaseElement {
if (cmd === Constants.DISASSEMBLY_QUERY_BACK_CMD) {
const result = JSON.parse(new TextDecoder().decode(e));
if (result.resultCode === 0) {
+ SpStatisticsHttpUtil.addOrdinaryVisitAction({
+ event: 'hiperf_func',
+ action: 'hiperf_func',
+ });
if (result.anFileOff) {
this.textFileOffElement!.innerHTML = `.text section: ${result.anFileOff}`;
this.textFileOffElement!.style.display = 'block';
--
Gitee
From 41ec4561c80157cf088ff5e0603bd414e0fc74f4 Mon Sep 17 00:00:00 2001
From: zhangzhuozhou
Date: Thu, 29 May 2025 10:37:50 +0800
Subject: [PATCH 21/51] =?UTF-8?q?feat:=E9=80=82=E9=85=8DH:Marsh=E6=89=93?=
=?UTF-8?q?=E7=82=B9=E5=8F=98=E6=9B=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: zhangzhuozhou
---
.../src/parser/print_event_parser.cpp | 26 +++++++++----------
.../src/parser/print_event_parser.h | 2 +-
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/trace_streamer/src/parser/print_event_parser.cpp b/trace_streamer/src/parser/print_event_parser.cpp
index a7271814..43d0d506 100644
--- a/trace_streamer/src/parser/print_event_parser.cpp
+++ b/trace_streamer/src/parser/print_event_parser.cpp
@@ -375,21 +375,10 @@ bool PrintEventParser::OnRwTransaction(size_t callStackRow, std::string &args, c
{
// H:MarshRSTransactionData cmdCount:20 transactionFlag:[3799,8] isUni:1
std::smatch match;
- if (std::regex_search(args, match, transFlagPattern_)) {
- std::string mainTheadId = match.str(1);
- std::string flag2 = match.str(2);
- // use to update dstRenderSlice_
- auto mainThreadId =
- streamFilters_->processFilter_->GetInternalTid(base::StrToInt(mainTheadId).value());
- // use to update vsyncRenderSlice_
- auto currentThreadId = streamFilters_->processFilter_->GetInternalTid(line.pid);
- return streamFilters_->frameFilter_->BeginRSTransactionData(
- currentThreadId, base::StrToInt(flag2).value(), mainThreadId);
- }
if (std::regex_search(args, match, newTransFlagPattern_)) {
std::string mainTheadId = match.str(1);
- std::string currentThread = match.str(2);
- std::string flag2 = match.str(3);
+ std::string flag2 = match.str(2);
+ std::string currentThread = match.str(3);
std::string timeFlag = match.str(4);
auto mainThreadId =
streamFilters_->processFilter_->GetInternalTid(base::StrToInt(mainTheadId).value());
@@ -399,6 +388,17 @@ bool PrintEventParser::OnRwTransaction(size_t callStackRow, std::string &args, c
return streamFilters_->frameFilter_->BeginRSTransactionData(
currentThreadId, base::StrToInt(flag2).value(), mainThreadId, timeId);
}
+ if (std::regex_search(args, match, transFlagPattern_)) {
+ std::string mainTheadId = match.str(1);
+ std::string flag2 = match.str(2);
+ // use to update dstRenderSlice_
+ auto mainThreadId =
+ streamFilters_->processFilter_->GetInternalTid(base::StrToInt(mainTheadId).value());
+ // use to update vsyncRenderSlice_
+ auto currentThreadId = streamFilters_->processFilter_->GetInternalTid(line.pid);
+ return streamFilters_->frameFilter_->BeginRSTransactionData(
+ currentThreadId, base::StrToInt(flag2).value(), mainThreadId);
+ }
return true;
}
bool PrintEventParser::OnMainThreadProcessCmd(size_t callStackRow, std::string &args, const BytraceLine &line)
diff --git a/trace_streamer/src/parser/print_event_parser.h b/trace_streamer/src/parser/print_event_parser.h
index 2a6aab55..d3d80a1f 100644
--- a/trace_streamer/src/parser/print_event_parser.h
+++ b/trace_streamer/src/parser/print_event_parser.h
@@ -100,7 +100,7 @@ private:
const std::regex uiVsyncTaskPattern_ = std::regex("\\[(\\w+):(\\d+)\\]");
const std::regex transFlagPattern_ = std::regex(R"(transactionFlag:\[(\d+),(\d+)\])");
const std::regex newTransFlagPattern_ =
- std::regex(R"(transactionFlag:\[(\d+),\s*(\d+),\s*(\d+)\],\s*timestamp:(\d+))");
+ std::regex(R"(transactionFlag:\[(\d+),(\d+)\],\s*tid:(\d+),\s*timestamp:(\d+))");
const std::regex mainProcessCmdPattern_ = std::regex("\\[(\\d+),(\\d+)\\]");
const std::regex distributeMatcher_ = std::regex(R"(H:\[([a-z0-9]+),([a-z0-9]+),([a-z0-9]+)\]#([CS]?)##(.*))");
std::vector frameCallIds_ = {};
--
Gitee
From 914ee178f803f8964412087a5a2289f988b561b1 Mon Sep 17 00:00:00 2001
From: zhangzhuozhou
Date: Thu, 29 May 2025 10:41:23 +0800
Subject: [PATCH 22/51] =?UTF-8?q?feat:=E9=80=82=E9=85=8Draw=20trace?=
=?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8F=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: zhangzhuozhou
---
.../rawtrace_parser/ftrace_event_processor.cpp | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp
index 5e83ac8c..1c8e1678 100644
--- a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp
+++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp
@@ -299,11 +299,12 @@ bool FtraceEventProcessor::SchedWakeup(FtraceEvent &ftraceEvent, uint8_t data[],
schedWakeupMsg->set_pid(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
if (format.fields[index].size == NEW_SCHED_PRIO_SIZE) {
schedWakeupMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ schedWakeupMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
} else {
schedWakeupMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ schedWakeupMsg->set_success(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ schedWakeupMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
}
- schedWakeupMsg->set_success(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
- schedWakeupMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
return true;
}
bool FtraceEventProcessor::SchedWaking(FtraceEvent &ftraceEvent, uint8_t data[], size_t size, const EventFormat &format)
@@ -314,11 +315,12 @@ bool FtraceEventProcessor::SchedWaking(FtraceEvent &ftraceEvent, uint8_t data[],
schedWakingMsg->set_pid(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
if (format.fields[index].size == NEW_SCHED_PRIO_SIZE) {
schedWakingMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ schedWakingMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
} else {
schedWakingMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ schedWakingMsg->set_success(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ schedWakingMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
}
- schedWakingMsg->set_success(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
- schedWakingMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
return true;
}
bool FtraceEventProcessor::SchedWakeupNew(FtraceEvent &ftraceEvent,
@@ -332,11 +334,12 @@ bool FtraceEventProcessor::SchedWakeupNew(FtraceEvent &ftraceEvent,
wakeupNewMsg->set_pid(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
if (format.fields[index].size == NEW_SCHED_PRIO_SIZE) {
wakeupNewMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ wakeupNewMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
} else {
wakeupNewMsg->set_prio(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ wakeupNewMsg->set_success(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
+ wakeupNewMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
}
- wakeupNewMsg->set_success(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
- wakeupNewMsg->set_target_cpu(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size));
return true;
}
bool FtraceEventProcessor::SchedProcessExit(FtraceEvent &ftraceEvent,
--
Gitee
From f1885ecac20ee829881f927d0c7528b9fa64dfd9 Mon Sep 17 00:00:00 2001
From: JustinYT
Date: Thu, 29 May 2025 17:23:14 +0800
Subject: [PATCH 23/51] fix hiviewdfx_faultloggerd build.
Signed-off-by: JustinYT
---
.../patch_hiperf/hiviewdfx_faultloggerd.patch | 76 +++++++++++++++++--
1 file changed, 71 insertions(+), 5 deletions(-)
diff --git a/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch b/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch
index 088df2a3..42e2c46b 100644
--- a/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch
+++ b/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch
@@ -1,5 +1,21 @@
+diff --git a/common/dfxutil/dfx_util.cpp b/common/dfxutil/dfx_util.cpp
+index a90f4303..9429fd43 100644
+--- a/common/dfxutil/dfx_util.cpp
++++ b/common/dfxutil/dfx_util.cpp
+@@ -229,7 +229,11 @@ bool ReadFdToString(int fd, std::string& content)
+ void CloseFd(int &fd)
+ {
+ if (fd > 0) {
++#if is_ohos
+ fdsan_close_with_tag(fd, fdsan_create_owner_tag(FDSAN_OWNER_TYPE_FILE, LOG_DOMAIN));
++#else
++ close(fd);
++#endif
+ fd = -1;
+ }
+ }
diff --git a/common/dfxutil/string_view_util.h b/common/dfxutil/string_view_util.h
-index b44a59ea775b368b93391ce19b440f617c309477..7dbd3568df9035edea91e920bf12fa5c58fe116f 100644
+index b44a59ea..7dbd3568 100644
--- a/common/dfxutil/string_view_util.h
+++ b/common/dfxutil/string_view_util.h
@@ -24,6 +24,24 @@
@@ -106,7 +122,7 @@ index b44a59ea775b368b93391ce19b440f617c309477..7dbd3568df9035edea91e920bf12fa5c
} // namespace HiviewDFX
} // namespace OHOS
diff --git a/interfaces/common/byte_order.h b/interfaces/common/byte_order.h
-index 3c40993ec56288deec6e40420a97d182587e9b62..a55d9db076a6fe1476a52a102fb968adb08073d7 100644
+index 3c40993e..a55d9db0 100644
--- a/interfaces/common/byte_order.h
+++ b/interfaces/common/byte_order.h
@@ -16,7 +16,7 @@
@@ -119,7 +135,7 @@ index 3c40993ec56288deec6e40420a97d182587e9b62..a55d9db076a6fe1476a52a102fb968ad
#define UNWIND_BIG_ENDIAN 4321
#define UNWIND_BYTE_ORDER -1 // Unknown
diff --git a/interfaces/innerkits/unwinder/include/dfx_elf_define.h b/interfaces/innerkits/unwinder/include/dfx_elf_define.h
-index 6bc9394912c193417cbfe588551b07c255fce62a..a71d76b5641ec347f014736173137cf1115c446b 100644
+index 6bc93949..a71d76b5 100644
--- a/interfaces/innerkits/unwinder/include/dfx_elf_define.h
+++ b/interfaces/innerkits/unwinder/include/dfx_elf_define.h
@@ -17,7 +17,7 @@
@@ -132,7 +148,7 @@ index 6bc9394912c193417cbfe588551b07c255fce62a..a71d76b5641ec347f014736173137cf1
#include
#endif
diff --git a/interfaces/innerkits/unwinder/include/dfx_elf_parser.h b/interfaces/innerkits/unwinder/include/dfx_elf_parser.h
-index b4c84437735176d28f7756930a8027152fc08155..86a4bdd197918e6246edf683eec2d213b1414803 100644
+index b4c84437..86a4bdd1 100644
--- a/interfaces/innerkits/unwinder/include/dfx_elf_parser.h
+++ b/interfaces/innerkits/unwinder/include/dfx_elf_parser.h
@@ -16,7 +16,7 @@
@@ -145,7 +161,7 @@ index b4c84437735176d28f7756930a8027152fc08155..86a4bdd197918e6246edf683eec2d213
#else
#include
diff --git a/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp b/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp
-index 9398e59acea6722bb1bfebcd0f312ee826a6f5a1..d071f2b934610fb15a921972a9eb97f3c646506f 100644
+index 9398e59a..d071f2b9 100644
--- a/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp
+++ b/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp
@@ -20,7 +20,7 @@
@@ -157,3 +173,53 @@ index 9398e59acea6722bb1bfebcd0f312ee826a6f5a1..d071f2b934610fb15a921972a9eb97f3
#include "dfx_nonlinux_define.h"
#else
#include
+diff --git a/interfaces/innerkits/unwinder/src/elf/elf_factory.cpp b/interfaces/innerkits/unwinder/src/elf/elf_factory.cpp
+index cbe67062..52ced531 100644
+--- a/interfaces/innerkits/unwinder/src/elf/elf_factory.cpp
++++ b/interfaces/innerkits/unwinder/src/elf/elf_factory.cpp
+@@ -151,8 +151,10 @@ std::shared_ptr RegularElfFactory::Create()
+ DFXLOGE("Failed to open file: %{public}s, errno(%{public}d)", filePath_.c_str(), errno);
+ return regularElf;
+ }
++#if is_ohos
+ uint64_t ownerTag = fdsan_create_owner_tag(FDSAN_OWNER_TYPE_FILE, LOG_DOMAIN);
+ fdsan_exchange_owner_tag(fd, 0, ownerTag);
++#endif
+ do {
+ auto size = static_cast(GetFileSize(fd));
+ auto mMap = std::make_shared();
+@@ -162,7 +164,11 @@ std::shared_ptr RegularElfFactory::Create()
+ }
+ regularElf->SetMmap(mMap);
+ } while (false);
++#if is_ohos
+ fdsan_close_with_tag(fd, ownerTag);
++#else
++ close(fd);
++#endif
+ return regularElf;
+ }
+
+@@ -215,8 +221,10 @@ std::shared_ptr CompressHapElfFactory::Create()
+ DFXLOGE("Failed to open hap file, errno(%{public}d)", errno);
+ return nullptr;
+ }
++#if is_ohos
+ uint64_t ownerTag = fdsan_create_owner_tag(FDSAN_OWNER_TYPE_FILE, LOG_DOMAIN);
+ fdsan_exchange_owner_tag(fd, 0, ownerTag);
++#endif
+ std::shared_ptr compressHapElf = nullptr;
+ do {
+ size_t elfSize = 0;
+@@ -237,7 +245,11 @@ std::shared_ptr CompressHapElfFactory::Create()
+ break;
+ }
+ } while (false);
++#if is_ohos
+ fdsan_close_with_tag(fd, ownerTag);
++#else
++ close(fd);
++#endif
+ return compressHapElf;
+ }
+
--
Gitee
From c25f27c3a9e665a5fbdbd19011dda43e0f7523c4 Mon Sep 17 00:00:00 2001
From: wangyujie
Date: Thu, 29 May 2025 20:01:43 +0800
Subject: [PATCH 24/51] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E5=91=8A=E8=AD=A6?=
=?UTF-8?q?=E5=BD=B1=E5=93=8D=E5=BF=AB=E7=85=A7=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: wangyujie
---
ide/src/trace/component/chart/SpChartManager.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ide/src/trace/component/chart/SpChartManager.ts b/ide/src/trace/component/chart/SpChartManager.ts
index 3590d966..816d1fe3 100644
--- a/ide/src/trace/component/chart/SpChartManager.ts
+++ b/ide/src/trace/component/chart/SpChartManager.ts
@@ -62,7 +62,7 @@ import { SpUserFileChart } from './SpUserPluginChart';
import { SpImportUserPluginsChart } from './SpImportUserPluginsChart';
import { queryDmaFenceIdAndCat } from '../../database/sql/dmaFence.sql';
import { queryAllFuncNames } from '../../database/sql/Func.sql';
-import {SpSnapShotChart} from './spSnapShotChart';
+import { SpSnapShotChart } from './spSnapShotChart';
import { SpRecordTrace } from '../SpRecordTrace';
export class SpChartManager {
@@ -197,7 +197,7 @@ export class SpChartManager {
await this.initCpu(progress);
await this.logChart.init();
await this.spHiSysEvent.init();
- if (SpRecordTrace.snapShotList.length > 0) {
+ if (SpRecordTrace.snapShotList.length > 0 && SpRecordTrace.isSnapShotCapture) {
await this.spSnapShotChart.init();
}
let idAndNameArr = await queryDmaFenceIdAndCat();
--
Gitee
From d77ebda4efd37315a6cc07b2878c5b4ebe647639 Mon Sep 17 00:00:00 2001
From: wangyujie
Date: Fri, 30 May 2025 10:21:29 +0800
Subject: [PATCH 25/51] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E9=9A=94=E5=A4=A9?=
=?UTF-8?q?=E5=AF=BC=E5=85=A5trace=E8=A3=81=E5=89=AA=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: wangyujie
---
ide/src/trace/SpApplication.ts | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/ide/src/trace/SpApplication.ts b/ide/src/trace/SpApplication.ts
index dd3c76b9..4ec46ec8 100644
--- a/ide/src/trace/SpApplication.ts
+++ b/ide/src/trace/SpApplication.ts
@@ -182,6 +182,7 @@ export class SpApplication extends BaseElement {
static traceType: String = '';
private isZipFile: boolean = false;
isClear: boolean = false;
+ isOpenTrace: boolean = false;
static spSnapShotView: SpSnapShotView | undefined | null;
static get observedAttributes(): Array {
@@ -649,6 +650,7 @@ export class SpApplication extends BaseElement {
private openTraceFile(ev: File): void {
SpApplication.isTraceLoaded = false;
+ this.isOpenTrace = true;
this.returnOriginalUrl();
this.removeAttribute('custom-color');
this.chartFilter!.setAttribute('hidden', '');
@@ -2062,7 +2064,7 @@ export class SpApplication extends BaseElement {
});
this.cutTraceFile!.addEventListener('click', (ev) => {
this.validateFileCacheLost();
- if (this.isClear) {
+ if (this.isClear && !this.isOpenTrace) {
let search = document.querySelector('body > sp-application')!.shadowRoot!.querySelector('#lit-search');
let progressEL = document.querySelector("body > sp-application")!.shadowRoot!.querySelector("div > div.search-vessel > lit-progress-bar");
progressEL!.loading = false;
@@ -2345,6 +2347,7 @@ export class SpApplication extends BaseElement {
});
});
this.isClear = true;
+ this.isOpenTrace = false;
this.mainMenu!.menus = this.mainMenu!.menus;
} else {
this.isClear = false;
--
Gitee
From 3075fa44cf0642e2a569f00a0aa19bdc548576ce Mon Sep 17 00:00:00 2001
From: danghongquan
Date: Fri, 30 May 2025 10:25:56 +0800
Subject: [PATCH 26/51] =?UTF-8?q?fix:=E6=B1=87=E7=BC=96=E6=8C=87=E4=BB=A4?=
=?UTF-8?q?=E9=BC=A0=E6=A0=87=E6=82=AC=E5=81=9C=E6=97=B6=E5=B7=A6=E5=8F=B3?=
=?UTF-8?q?=E5=B0=96=E6=8B=AC=E5=8F=B7=E6=9C=AA=E8=A2=AB=E8=BD=AC=E4=B9=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: danghongquan
---
ide/src/base-ui/table/lit-table.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ide/src/base-ui/table/lit-table.ts b/ide/src/base-ui/table/lit-table.ts
index d5b41051..339b77a5 100644
--- a/ide/src/base-ui/table/lit-table.ts
+++ b/ide/src/base-ui/table/lit-table.ts
@@ -1649,7 +1649,7 @@ export class LitTable extends HTMLElement {
(child as HTMLElement).title = rowObject.data.time + 'ns';
} else {
//@ts-ignore
- (child as HTMLElement).title = text;
+ (child as HTMLElement).title = text.replace(/</g,'<').replace(/>/g,'>');
}
}
}
--
Gitee
From 0a8b42a7593f42683325cc767e2440eea60028e3 Mon Sep 17 00:00:00 2001
From: danghongquan
Date: Fri, 30 May 2025 10:34:45 +0800
Subject: [PATCH 27/51] =?UTF-8?q?fix:=E4=BC=98=E5=8C=96CPU=E6=98=BE?=
=?UTF-8?q?=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: danghongquan
---
ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts | 1 -
1 file changed, 1 deletion(-)
diff --git a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts
index 01730f73..9419ba8e 100644
--- a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts
+++ b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts
@@ -273,7 +273,6 @@ export class CpuStruct extends BaseStruct {
ctx.globalAlpha = 1;
ctx.fillStyle = '#e0e0e0';
}
- ctx.clearRect(data.frame.x, data.frame.y, width, data.frame.height);
ctx.fillRect(data.frame.x, data.frame.y, width, data.frame.height);
ctx.globalAlpha = 1;
CpuStruct.drawText(ctx, data, width, pid, tid);
--
Gitee
From 46b2687ab0ca732d93268fe25ff37160e7ddea74 Mon Sep 17 00:00:00 2001
From: danghongquan
Date: Fri, 30 May 2025 16:16:03 +0800
Subject: [PATCH 28/51] =?UTF-8?q?fix:Async=20Call=20Profile=E7=81=AB?=
=?UTF-8?q?=E7=84=B0=E5=9B=BE=E9=BC=A0=E6=A0=87=E6=82=AC=E6=B5=AE=E6=98=BE?=
=?UTF-8?q?=E7=A4=BA=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: danghongquan
---
ide/src/trace/component/chart/FrameChart.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ide/src/trace/component/chart/FrameChart.ts b/ide/src/trace/component/chart/FrameChart.ts
index 9c0bb5d8..fa96428b 100644
--- a/ide/src/trace/component/chart/FrameChart.ts
+++ b/ide/src/trace/component/chart/FrameChart.ts
@@ -920,7 +920,7 @@ export class FrameChart extends BaseElement {
const label = ChartMode.Count === this._mode ? 'Count' : 'EventCount';
const count = this.getNodeValue(hoverNode);
let sourceHint = '';
- if (hoverNode.sourceFile !== '') {
+ if (hoverNode.sourceFile) {
const lines = Array.from(hoverNode.lineNumber).sort((a, b) => a - b).join(',');
sourceHint = `Source: ${hoverNode?.sourceFile} : ${lines}
`;
}
--
Gitee
From bbb47f016c18d12cdf825ede9641c92f330f861f Mon Sep 17 00:00:00 2001
From: JustinYT
Date: Wed, 4 Jun 2025 14:09:23 +0800
Subject: [PATCH 29/51] fix hiviewdfx_faultloggerd patch for win/linux/mac,
CRLF to LF.
Signed-off-by: JustinYT
---
trace_streamer/pare_third_party.sh | 1 +
.../patch_hiperf/hiviewdfx_faultloggerd.patch | 1510 ++++++++++++++++-
2 files changed, 1501 insertions(+), 10 deletions(-)
diff --git a/trace_streamer/pare_third_party.sh b/trace_streamer/pare_third_party.sh
index a3d03073..ea6a1352 100755
--- a/trace_streamer/pare_third_party.sh
+++ b/trace_streamer/pare_third_party.sh
@@ -84,6 +84,7 @@ fi
if [ ! -d "hiviewdfx/faultloggerd" ];then
git clone --depth=1 git@gitee.com:openharmony/hiviewdfx_faultloggerd.git hiviewdfx/faultloggerd/
cd hiviewdfx/faultloggerd
+ perl -pi -e 's/\r$//' interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp
$patch -p1 < ../../../prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch
cd ../../
fi
diff --git a/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch b/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch
index 42e2c46b..56803cb2 100644
--- a/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch
+++ b/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_faultloggerd.patch
@@ -161,18 +161,1508 @@ index b4c84437..86a4bdd1 100644
#else
#include
diff --git a/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp b/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp
-index 9398e59a..d071f2b9 100644
+index 9398e59a..79d230e0 100644
--- a/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp
+++ b/interfaces/innerkits/unwinder/src/elf/dfx_elf.cpp
-@@ -20,7 +20,7 @@
- #include
- #include
- #include
--#if is_mingw
-+#if is_mingw || is_mac
- #include "dfx_nonlinux_define.h"
- #else
- #include
+@@ -1,749 +1,749 @@
+-/*
+- * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
+- * Licensed under the Apache License, Version 2.0 (the "License");
+- * you may not use this file except in compliance with the License.
+- * You may obtain a copy of the License at
+- *
+- * http://www.apache.org/licenses/LICENSE-2.0
+- *
+- * Unless required by applicable law or agreed to in writing, software
+- * distributed under the License is distributed on an "AS IS" BASIS,
+- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+- * See the License for the specific language governing permissions and
+- * limitations under the License.
+- */
+-
+-#include "dfx_elf.h"
+-
+-#include
+-#include
+-#include
+-#include
+-#include
+-#if is_mingw
+-#include "dfx_nonlinux_define.h"
+-#else
+-#include
+-#include
+-#endif
+-#include
+-#include
+-#include
+-#include
+-
+-#include "dfx_define.h"
+-#include "dfx_log.h"
+-#include "dfx_instr_statistic.h"
+-#include "dfx_util.h"
+-#include "dfx_maps.h"
+-#include "dfx_trace_dlsym.h"
+-#include "dwarf_define.h"
+-#include "elf_factory.h"
+-#include "string_util.h"
+-#include "unwinder_config.h"
+-
+-namespace OHOS {
+-namespace HiviewDFX {
+-namespace {
+-#undef LOG_DOMAIN
+-#undef LOG_TAG
+-#define LOG_DOMAIN 0xD002D11
+-#define LOG_TAG "DfxElf"
+-#if is_ohos && !is_mingw
+-enum HdrSection {
+- SECTION_TEXT = 0,
+- SECTION_ARMEXIDX = 1,
+- SECTION_DYNAMIC = 2,
+- SECTION_EHFRAMEHDR = 3
+-};
+-#endif
+-}
+-
+-void DfxElf::Init()
+-{
+- uti_.namePtr = 0;
+- uti_.format = -1;
+- hasTableInfo_ = false;
+-}
+-
+-void DfxElf::Clear()
+-{
+- if (elfParse_ != nullptr) {
+- elfParse_.reset();
+- elfParse_ = nullptr;
+- }
+-
+- if (mmap_ != nullptr) {
+- mmap_->Clear();
+- mmap_.reset();
+- mmap_ = nullptr;
+- }
+-}
+-
+-bool DfxElf::InitHeaders()
+-{
+- if (mmap_ == nullptr) {
+- return false;
+- }
+-
+- if (elfParse_ != nullptr) {
+- return true;
+- }
+-
+- uint8_t ident[SELFMAG + 1];
+- if (!Read(0, ident, SELFMAG) || !IsValidElf(ident, SELFMAG)) {
+- return false;
+- }
+-
+- if (!Read(EI_CLASS, &classType_, sizeof(uint8_t))) {
+- return false;
+- }
+-
+- if (classType_ == ELFCLASS32) {
+- elfParse_ = std::unique_ptr(new ElfParser32(mmap_));
+- } else if (classType_ == ELFCLASS64) {
+- elfParse_ = std::unique_ptr(new ElfParser64(mmap_));
+- } else {
+- DFXLOGW("InitHeaders failed, classType: %{public}d", classType_);
+- return false;
+- }
+- if (elfParse_ != nullptr) {
+- valid_ = true;
+- elfParse_->InitHeaders();
+- }
+- return valid_;
+-}
+-
+-bool DfxElf::IsValid()
+-{
+- if (valid_ == false) {
+- InitHeaders();
+- }
+- return valid_;
+-}
+-
+-uint8_t DfxElf::GetClassType()
+-{
+- if (IsValid()) {
+- return classType_;
+- }
+- return ELFCLASSNONE;
+-}
+-
+-ArchType DfxElf::GetArchType()
+-{
+- if (IsValid()) {
+- elfParse_->GetArchType();
+- }
+- return ARCH_UNKNOWN;
+-}
+-
+-int64_t DfxElf::GetLoadBias()
+-{
+- if (loadBias_ == 0) {
+- if (IsValid()) {
+- loadBias_ = elfParse_->GetLoadBias();
+- DFXLOGU("Elf loadBias: %{public}" PRIx64 "", (uint64_t)loadBias_);
+- }
+- }
+- return loadBias_;
+-}
+-
+-uint64_t DfxElf::GetLoadBase(uint64_t mapStart, uint64_t mapOffset)
+-{
+- if (loadBase_ == static_cast(-1)) {
+- if (IsValid()) {
+- DFXLOGU("mapStart: %{public}" PRIx64 ", mapOffset: %{public}" PRIx64 "",
+- (uint64_t)mapStart, (uint64_t)mapOffset);
+- loadBase_ = mapStart - mapOffset - static_cast(GetLoadBias());
+- DFXLOGU("Elf loadBase: %{public}" PRIx64 "", (uint64_t)loadBase_);
+- }
+- }
+- return loadBase_;
+-}
+-
+-void DfxElf::SetLoadBase(uint64_t base)
+-{
+- loadBase_ = base;
+-}
+-
+-void DfxElf::SetBaseOffset(uint64_t offset)
+-{
+- baseOffset_ = offset;
+-}
+-
+-uint64_t DfxElf::GetBaseOffset()
+-{
+- return baseOffset_;
+-}
+-
+-uint64_t DfxElf::GetStartPc()
+-{
+- if (startPc_ == static_cast(-1)) {
+- if (IsValid()) {
+- auto startVaddr = elfParse_->GetStartVaddr();
+- if (loadBase_ != static_cast(-1) && startVaddr != static_cast(-1)) {
+- startPc_ = startVaddr + loadBase_;
+- DFXLOGU("Elf startPc: %{public}" PRIx64 "", (uint64_t)startPc_);
+- }
+- }
+- }
+- return startPc_;
+-}
+-
+-uint64_t DfxElf::GetStartVaddr()
+-{
+- if (IsValid()) {
+- return elfParse_->GetStartVaddr();
+- }
+- return 0;
+-}
+-
+-uint64_t DfxElf::GetEndPc()
+-{
+- if (endPc_ == 0) {
+- if (IsValid()) {
+- auto endVaddr = elfParse_->GetEndVaddr();
+- if (loadBase_ != static_cast(-1) && endVaddr != 0) {
+- endPc_ = endVaddr + loadBase_;
+- DFXLOGU("Elf endPc: %{public}" PRIx64 "", (uint64_t)endPc_);
+- }
+- }
+- }
+- return endPc_;
+-}
+-
+-uint64_t DfxElf::GetEndVaddr()
+-{
+- if (IsValid()) {
+- return elfParse_->GetEndVaddr();
+- }
+- return 0;
+-}
+-
+-uint64_t DfxElf::GetStartOffset()
+-{
+- if (IsValid()) {
+- return elfParse_->GetStartOffset();
+- }
+- return 0;
+-}
+-
+-uint64_t DfxElf::GetRelPc(uint64_t pc, uint64_t mapStart, uint64_t mapOffset)
+-{
+- return (pc - GetLoadBase(mapStart, mapOffset));
+-}
+-
+-uint64_t DfxElf::GetElfSize()
+-{
+- if (!IsValid()) {
+- return 0;
+- }
+- return elfParse_->GetElfSize();
+-}
+-
+-std::string DfxElf::GetElfName()
+-{
+- if (!IsValid()) {
+- return "";
+- }
+- return elfParse_->GetElfName();
+-}
+-
+-void DfxElf::SetBuildId(const std::string& buildId)
+-{
+- buildId_ = buildId;
+-}
+-
+-std::string DfxElf::GetBuildId(uint64_t noteAddr, uint64_t noteSize)
+-{
+- return ElfParser::ParseHexBuildId(noteAddr, noteSize);
+-}
+-
+-std::string DfxElf::GetBuildId()
+-{
+- if (buildId_.empty()) {
+- if (!IsValid()) {
+- return "";
+- }
+- return elfParse_->GetBuildId();
+- }
+- return buildId_;
+-}
+-
+-
+-uintptr_t DfxElf::GetGlobalPointer()
+-{
+- if (!IsValid()) {
+- return 0;
+- }
+- return elfParse_->GetGlobalPointer();
+-}
+-
+-bool DfxElf::GetSectionInfo(ShdrInfo& shdr, const std::string secName)
+-{
+- if (!IsValid()) {
+- return false;
+- }
+- return elfParse_->GetSectionInfo(shdr, secName);
+-}
+-
+-bool DfxElf::GetSectionData(unsigned char* buf, uint64_t size, std::string secName)
+-{
+- if (!IsValid()) {
+- return false;
+- }
+- return elfParse_->GetSectionData(buf, size, secName);
+-}
+-
+-GnuDebugDataHdr DfxElf::GetGnuDebugDataHdr()
+-{
+- if (!IsValid()) {
+- return {};
+- }
+- return elfParse_->GetGnuDebugDataHdr();
+-}
+-
+-bool DfxElf::IsMiniDebugInfoValid()
+-{
+- if (miniDebugInfo_ == nullptr) {
+-#if defined(ENABLE_MINIDEBUGINFO)
+- MiniDebugInfoFactory miniDebugInfoFactory(elfParse_->GetGnuDebugDataHdr());
+- miniDebugInfo_ = miniDebugInfoFactory.Create();
+-#endif
+- }
+- return miniDebugInfo_ != nullptr;
+-}
+-
+-const std::set& DfxElf::GetFuncSymbols()
+-{
+- if (!IsValid() || !funcSymbols_.empty()) {
+- return funcSymbols_;
+- }
+- if (IsMiniDebugInfoValid()) {
+- funcSymbols_ = miniDebugInfo_->elfParse_->GetFuncSymbols();
+- DFXLOGU("Get MiniDebugInfo FuncSymbols, size: %{public}zu", funcSymbols_.size());
+- }
+- const auto &symbols = elfParse_->GetFuncSymbols();
+- funcSymbols_.insert(symbols.begin(), symbols.end());
+- DFXLOGU("GetFuncSymbols, size: %{public}zu", funcSymbols_.size());
+- return funcSymbols_;
+-}
+-
+-bool DfxElf::GetFuncInfoLazily(uint64_t addr, ElfSymbol& elfSymbol)
+-{
+- DFX_TRACE_SCOPED_DLSYM("GetFuncInfoLazily");
+- if (FindFuncSymbol(addr, funcSymbols_, elfSymbol)) {
+- return true;
+- }
+- bool findSymbol = elfParse_->GetFuncSymbolByAddr(addr, elfSymbol);
+- if (!findSymbol && IsMiniDebugInfoValid()) {
+- findSymbol = miniDebugInfo_->elfParse_->GetFuncSymbolByAddr(addr, elfSymbol);
+- }
+-
+- if (findSymbol) {
+- funcSymbols_.emplace(elfSymbol);
+- DFXLOGU("GetFuncInfoLazily, size: %{public}zu", funcSymbols_.size());
+- }
+- return findSymbol;
+-}
+-
+-bool DfxElf::GetFuncInfo(uint64_t addr, ElfSymbol& elfSymbol)
+-{
+- if (!IsValid()) {
+- return false;
+- }
+- if (UnwinderConfig::GetEnableLoadSymbolLazily()) {
+- return GetFuncInfoLazily(addr, elfSymbol);
+- }
+-
+- const auto &symbols = GetFuncSymbols();
+- return FindFuncSymbol(addr, symbols, elfSymbol);
+-}
+-
+-bool DfxElf::FindFuncSymbol(uint64_t addr, const std::set& symbols, ElfSymbol& elfSymbol)
+-{
+- DFX_TRACE_SCOPED_DLSYM("FindFuncSymbol");
+- if (symbols.empty()) {
+- return false;
+- }
+- // Find the first position that is not less than value
+- ElfSymbol tmpSym;
+- tmpSym.value = addr;
+- auto next = symbols.upper_bound(tmpSym);
+- if (next != symbols.begin()) {
+- next--;
+- }
+- if (next->value <= addr && addr < (next->value + next->size)) {
+- elfSymbol = *next;
+- return true;
+- }
+- return false;
+-}
+-
+-const std::unordered_map& DfxElf::GetPtLoads()
+-{
+- return elfParse_->GetPtLoads();
+-}
+-
+-bool DfxElf::FillUnwindTableByExidx(ShdrInfo shdr, uintptr_t loadBase, struct UnwindTableInfo* uti)
+-{
+- if (uti == nullptr) {
+- return false;
+- }
+- uti->gp = 0;
+- uti->tableData = loadBase + shdr.addr;
+- uti->tableLen = shdr.size;
+- INSTR_STATISTIC(InstructionEntriesArmExidx, shdr.size, 0);
+- uti->format = UNW_INFO_FORMAT_ARM_EXIDX;
+- DFXLOGU("[%{public}d]: tableData: %{public}" PRIx64 ", tableLen: %{public}d", __LINE__,
+- (uint64_t)uti->tableData, (int)uti->tableLen);
+- return true;
+-}
+-
+-#if is_ohos && !is_mingw
+-bool DfxElf::FillUnwindTableByEhhdrLocal(struct DwarfEhFrameHdr* hdr, struct UnwindTableInfo* uti)
+-{
+- if (hdr == nullptr) {
+- return false;
+- }
+- if (hdr->version != DW_EH_VERSION) {
+- DFXLOGE("[%{public}d]: version(%{public}d) error", __LINE__, hdr->version);
+- return false;
+- }
+-
+- uintptr_t ptr = (uintptr_t)(&(hdr->ehFrame));
+- DFXLOGU("[%{public}d]: hdr: %{public}" PRIx64 ", ehFrame: %{public}" PRIx64 "", __LINE__,
+- (uint64_t)hdr, (uint64_t)ptr);
+- auto memory = std::make_shared(UNWIND_TYPE_LOCAL);
+- DFXLOGU("[%{public}d]: gp: %{public}" PRIx64 ", ehFramePtrEnc: %{public}x, fdeCountEnc: %{public}x", __LINE__,
+- (uint64_t)uti->gp, hdr->ehFramePtrEnc, hdr->fdeCountEnc);
+- memory->SetDataOffset(uti->gp);
+- MAYBE_UNUSED uintptr_t ehFrameStart = memory->ReadEncodedValue(ptr, hdr->ehFramePtrEnc);
+- uintptr_t fdeCount = memory->ReadEncodedValue(ptr, hdr->fdeCountEnc);
+- DFXLOGU("[%{public}d]: ehFrameStart: %{public}" PRIx64 ", fdeCount: %{public}d", __LINE__,
+- (uint64_t)ehFrameStart, (int)fdeCount);
+-
+- if (hdr->tableEnc != (DW_EH_PE_datarel | DW_EH_PE_sdata4)) {
+- DFXLOGU("tableEnc: %{public}x", hdr->tableEnc);
+- if (hdr->fdeCountEnc == DW_EH_PE_omit) {
+- fdeCount = ~0UL;
+- }
+- if (hdr->ehFramePtrEnc == DW_EH_PE_omit) {
+- DFXLOGE("ehFramePtrEnc(%{public}x) error", hdr->ehFramePtrEnc);
+- return false;
+- }
+- uti->isLinear = true;
+- uti->tableLen = fdeCount;
+- uti->tableData = ehFrameStart;
+- } else {
+- uti->isLinear = false;
+- uti->tableLen = (fdeCount * sizeof(DwarfTableEntry)) / sizeof(uintptr_t);
+- uti->tableData = ptr;
+- uti->segbase = (uintptr_t)hdr;
+- }
+- uti->format = UNW_INFO_FORMAT_REMOTE_TABLE;
+- DFXLOGU("[%{public}d]: tableData: %{public}" PRIx64 ", tableLen: %{public}d", __LINE__,
+- (uint64_t)uti->tableData, (int)uti->tableLen);
+- return true;
+-}
+-#endif
+-
+-bool DfxElf::FillUnwindTableByEhhdr(struct DwarfEhFrameHdr* hdr, uintptr_t shdrBase, struct UnwindTableInfo* uti)
+-{
+- if ((hdr == nullptr) || (uti == nullptr)) {
+- return false;
+- }
+- if (hdr->version != DW_EH_VERSION) {
+- DFXLOGE("[%{public}d]: version(%{public}d) error", __LINE__, hdr->version);
+- return false;
+- }
+- uintptr_t ptr = (uintptr_t)(&(hdr->ehFrame));
+- DFXLOGU("[%{public}d]: hdr: %{public}" PRIx64 ", ehFrame: %{public}" PRIx64 "", __LINE__,
+- (uint64_t)hdr, (uint64_t)ptr);
+-
+- uti->gp = GetGlobalPointer();
+- DFXLOGU("[%{public}d]: gp: %{public}" PRIx64 ", ehFramePtrEnc: %{public}x, fdeCountEnc: %{public}x", __LINE__,
+- (uint64_t)uti->gp, hdr->ehFramePtrEnc, hdr->fdeCountEnc);
+- mmap_->SetDataOffset(uti->gp);
+- auto ptrOffset = ptr - reinterpret_cast(GetMmapPtr());
+- MAYBE_UNUSED uintptr_t ehFrameStart = mmap_->ReadEncodedValue(ptrOffset, hdr->ehFramePtrEnc);
+- uintptr_t fdeCount = mmap_->ReadEncodedValue(ptrOffset, hdr->fdeCountEnc);
+- DFXLOGU("[%{public}d]: ehFrameStart: %{public}" PRIx64 ", fdeCount: %{public}d", __LINE__,
+- (uint64_t)ehFrameStart, (int)fdeCount);
+- ptr = reinterpret_cast(GetMmapPtr()) + ptrOffset;
+-
+- if (hdr->tableEnc != (DW_EH_PE_datarel | DW_EH_PE_sdata4)) {
+- DFXLOGU("[%{public}d]: tableEnc: %{public}x", __LINE__, hdr->tableEnc);
+- if (hdr->fdeCountEnc == DW_EH_PE_omit) {
+- fdeCount = ~0UL;
+- }
+- if (hdr->ehFramePtrEnc == DW_EH_PE_omit) {
+- DFXLOGE("[%{public}d]: ehFramePtrEnc(%{public}x) error", __LINE__, hdr->ehFramePtrEnc);
+- return false;
+- }
+- uti->isLinear = true;
+- uti->tableLen = fdeCount;
+- uti->tableData = shdrBase + ehFrameStart;
+- uti->segbase = shdrBase;
+- } else {
+- uti->isLinear = false;
+- uti->tableLen = (fdeCount * sizeof(DwarfTableEntry)) / sizeof(uintptr_t);
+- uti->tableData = shdrBase + ptr - (uintptr_t)hdr;
+- uti->segbase = shdrBase;
+- }
+- uti->format = UNW_INFO_FORMAT_REMOTE_TABLE;
+- DFXLOGU("[%{public}d]: tableData: %{public}" PRIx64 ", tableLen: %{public}d", __LINE__,
+- (uint64_t)uti->tableData, (int)uti->tableLen);
+- return true;
+-}
+-
+-int DfxElf::FindUnwindTableInfo(uintptr_t pc, std::shared_ptr map, struct UnwindTableInfo& uti)
+-{
+- if (hasTableInfo_ && pc >= uti_.startPc && pc < uti_.endPc) {
+- uti = uti_;
+- DFXLOGU("FindUnwindTableInfo had found");
+- return UNW_ERROR_NONE;
+- }
+- if (map == nullptr) {
+- return UNW_ERROR_INVALID_MAP;
+- }
+- uintptr_t loadBase = GetLoadBase(map->begin, map->offset);
+- uti.startPc = GetStartPc();
+- uti.endPc = GetEndPc();
+- if (pc < uti.startPc || pc >= uti.endPc) {
+- DFXLOGU("Elf startPc: %{public}" PRIx64 ", endPc: %{public}" PRIx64 "",
+- (uint64_t)uti.startPc, (uint64_t)uti.endPc);
+- return UNW_ERROR_PC_NOT_IN_UNWIND_INFO;
+- }
+-
+- ShdrInfo shdr;
+-#if defined(__arm__)
+- if (GetSectionInfo(shdr, ARM_EXIDX)) {
+- hasTableInfo_ = FillUnwindTableByExidx(shdr, loadBase, &uti);
+- }
+-#endif
+-
+- if (!hasTableInfo_) {
+- struct DwarfEhFrameHdr* hdr = nullptr;
+- struct DwarfEhFrameHdr synthHdr;
+- if (GetSectionInfo(shdr, EH_FRAME_HDR) && GetMmapPtr() != nullptr) {
+- INSTR_STATISTIC(InstructionEntriesEhFrame, shdr.size, 0);
+- hdr = (struct DwarfEhFrameHdr *) (shdr.offset + (char *)GetMmapPtr());
+- } else if (GetSectionInfo(shdr, EH_FRAME) && GetMmapPtr() != nullptr) {
+- DFXLOGW("[%{public}d]: Elf(%{public}s) no found .eh_frame_hdr section, " \
+- "using synthetic .eh_frame section", __LINE__, map->name.c_str());
+- INSTR_STATISTIC(InstructionEntriesEhFrame, shdr.size, 0);
+- synthHdr.version = DW_EH_VERSION;
+- synthHdr.ehFramePtrEnc = DW_EH_PE_absptr |
+- ((sizeof(ElfW(Addr)) == 4) ? DW_EH_PE_udata4 : DW_EH_PE_udata8); // 4 : four bytes
+- synthHdr.fdeCountEnc = DW_EH_PE_omit;
+- synthHdr.tableEnc = DW_EH_PE_omit;
+- synthHdr.ehFrame = (ElfW(Addr))(shdr.offset + (char*)GetMmapPtr());
+- hdr = &synthHdr;
+- }
+- uintptr_t shdrBase = static_cast(loadBase + shdr.addr);
+- hasTableInfo_ = FillUnwindTableByEhhdr(hdr, shdrBase, &uti);
+- }
+-
+- if (hasTableInfo_) {
+- uti_ = uti;
+- return UNW_ERROR_NONE;
+- }
+- return UNW_ERROR_NO_UNWIND_INFO;
+-}
+-
+-int DfxElf::FindUnwindTableLocal(uintptr_t pc, struct UnwindTableInfo& uti)
+-{
+-#if is_ohos && !is_mingw
+- DlCbData cbData;
+- (void)memset_s(&cbData, sizeof(cbData), 0, sizeof(cbData));
+- cbData.pc = pc;
+- cbData.uti.format = -1;
+- int ret = dl_iterate_phdr(DlPhdrCb, &cbData);
+- if (ret > 0) {
+- if (cbData.uti.format != -1) {
+- uti = cbData.uti;
+- return UNW_ERROR_NONE;
+- }
+- }
+- return UNW_ERROR_NO_UNWIND_INFO;
+-#else
+- return UNW_ERROR_UNSUPPORTED_VERSION;
+-#endif
+-}
+-
+-#if is_ohos && !is_mingw
+-bool DfxElf::FindSection(struct dl_phdr_info* info, const std::string secName, ShdrInfo& shdr)
+-{
+- if (info == nullptr) {
+- return false;
+- }
+- const char* file = info->dlpi_name;
+- if (strlen(file) == 0) {
+- file = PROC_SELF_EXE_PATH;
+- }
+- RegularElfFactory elfFactory(file);
+- auto elf = elfFactory.Create();
+- if (elf == nullptr) {
+- return false;
+- }
+-
+- return elf->GetSectionInfo(shdr, secName);
+-}
+-
+-void DfxElf::ParsePhdr(struct dl_phdr_info* info, const ElfW(Phdr)* (&pHdrSections)[4], const uintptr_t pc)
+-{
+- const ElfW(Phdr)* phdr = info->dlpi_phdr;
+- for (size_t i = 0; i < info->dlpi_phnum && phdr != nullptr; i++, phdr++) {
+- switch (phdr->p_type) {
+- case PT_LOAD: {
+- ElfW(Addr) vaddr = phdr->p_vaddr + info->dlpi_addr;
+- if (pc >= vaddr && pc < vaddr + phdr->p_memsz) {
+- pHdrSections[SECTION_TEXT] = phdr;
+- }
+- break;
+- }
+-#if defined(__arm__)
+- case PT_ARM_EXIDX: {
+- pHdrSections[SECTION_ARMEXIDX] = phdr;
+- break;
+- }
+-#endif
+- case PT_GNU_EH_FRAME: {
+- pHdrSections[SECTION_EHFRAMEHDR] = phdr;
+- break;
+- }
+- case PT_DYNAMIC: {
+- pHdrSections[SECTION_DYNAMIC] = phdr;
+- break;
+- }
+- default:
+- break;
+- }
+- }
+-}
+-
+-bool DfxElf::ProccessDynamic(const ElfW(Phdr)* pDynamic, ElfW(Addr) loadBase, UnwindTableInfo* uti)
+-{
+- ElfW(Dyn)* dyn = reinterpret_cast(pDynamic->p_vaddr + loadBase);
+- if (dyn == nullptr) {
+- return false;
+- }
+- for (; dyn->d_tag != DT_NULL; ++dyn) {
+- if (dyn->d_tag == DT_PLTGOT) {
+- uti->gp = dyn->d_un.d_ptr;
+- break;
+- }
+- }
+- return true;
+-}
+-
+-struct DwarfEhFrameHdr* DfxElf::InitHdr(struct DwarfEhFrameHdr& synthHdr,
+- struct dl_phdr_info* info, const ElfW(Phdr)* pEhHdr)
+-{
+- struct DwarfEhFrameHdr* hdr = nullptr;
+- if (pEhHdr) {
+- INSTR_STATISTIC(InstructionEntriesEhFrame, pEhHdr->p_memsz, 0);
+- hdr = reinterpret_cast(pEhHdr->p_vaddr + info->dlpi_addr);
+- } else {
+- ShdrInfo shdr;
+- if (FindSection(info, EH_FRAME, shdr)) {
+- DFXLOGW("[%{public}d]: Elf(%{public}s) no found .eh_frame_hdr section, " \
+- "using synthetic .eh_frame section", __LINE__, info->dlpi_name);
+- INSTR_STATISTIC(InstructionEntriesEhFrame, shdr.size, 0);
+- synthHdr.version = DW_EH_VERSION;
+- synthHdr.ehFramePtrEnc = DW_EH_PE_absptr |
+- ((sizeof(ElfW(Addr)) == 4) ? DW_EH_PE_udata4 : DW_EH_PE_udata8); // 4 : four bytes
+- synthHdr.fdeCountEnc = DW_EH_PE_omit;
+- synthHdr.tableEnc = DW_EH_PE_omit;
+- synthHdr.ehFrame = (ElfW(Addr))(shdr.addr + info->dlpi_addr);
+- hdr = &synthHdr;
+- }
+- }
+- return hdr;
+-}
+-
+-int DfxElf::DlPhdrCb(struct dl_phdr_info* info, size_t size, void* data)
+-{
+- struct DlCbData* cbData = reinterpret_cast(data);
+- if ((info == nullptr) || (cbData == nullptr)) {
+- return -1;
+- }
+- UnwindTableInfo* uti = &cbData->uti;
+- uintptr_t pc = cbData->pc;
+- const int numOfPhdrSections = 4;
+- const ElfW(Phdr)* pHdrSections[numOfPhdrSections] = {nullptr};
+- ParsePhdr(info, pHdrSections, pc);
+-
+- if (pHdrSections[SECTION_TEXT] == nullptr) {
+- return 0;
+- }
+- ElfW(Addr) loadBase = info->dlpi_addr;
+- uti->startPc = pHdrSections[SECTION_TEXT]->p_vaddr + loadBase;
+- uti->endPc = uti->startPc + pHdrSections[SECTION_TEXT]->p_memsz;
+- DFXLOGU("Elf name: %{public}s", info->dlpi_name);
+- uti->namePtr = reinterpret_cast(info->dlpi_name);
+-
+-#if defined(__arm__)
+- if (pHdrSections[SECTION_ARMEXIDX]) {
+- ShdrInfo shdr;
+- shdr.addr = pHdrSections[SECTION_ARMEXIDX]->p_vaddr;
+- shdr.size = pHdrSections[SECTION_ARMEXIDX]->p_memsz;
+- return FillUnwindTableByExidx(shdr, loadBase, uti);
+- }
+-#endif
+-
+- if (pHdrSections[SECTION_DYNAMIC]) {
+- if (!ProccessDynamic(pHdrSections[SECTION_DYNAMIC], loadBase, uti)) {
+- return 0;
+- }
+- } else {
+- uti->gp = 0;
+- }
+-
+- struct DwarfEhFrameHdr synthHdr;
+- struct DwarfEhFrameHdr* hdr = InitHdr(synthHdr, info, pHdrSections[SECTION_EHFRAMEHDR]);
+-
+- return FillUnwindTableByEhhdrLocal(hdr, uti);
+-}
+-#endif
+-
+-bool DfxElf::Read(uintptr_t pos, void* buf, size_t size)
+-{
+- if ((mmap_ != nullptr) && (mmap_->Read(pos, buf, size) == size)) {
+- return true;
+- }
+- return false;
+-}
+-
+-const uint8_t* DfxElf::GetMmapPtr()
+-{
+- if (mmap_ == nullptr) {
+- return nullptr;
+- }
+- return static_cast(mmap_->Get());
+-}
+-
+-size_t DfxElf::GetMmapSize()
+-{
+- if (mmap_ == nullptr) {
+- return 0;
+- }
+- return mmap_->Size();
+-}
+-
+-bool DfxElf::IsValidElf(const void* ptr, size_t size)
+-{
+- if (ptr == nullptr) {
+- return false;
+- }
+-
+- if (memcmp(ptr, ELFMAG, size) != 0) {
+- DFXLOGD("Invalid elf hdr?");
+- return false;
+- }
+- return true;
+-}
+-} // namespace HiviewDFX
+-} // namespace OHOS
++/*
++ * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "dfx_elf.h"
++
++#include
++#include
++#include
++#include
++#include
++#if is_mingw || is_mac
++#include "dfx_nonlinux_define.h"
++#else
++#include
++#include
++#endif
++#include
++#include
++#include
++#include
++
++#include "dfx_define.h"
++#include "dfx_log.h"
++#include "dfx_instr_statistic.h"
++#include "dfx_util.h"
++#include "dfx_maps.h"
++#include "dfx_trace_dlsym.h"
++#include "dwarf_define.h"
++#include "elf_factory.h"
++#include "string_util.h"
++#include "unwinder_config.h"
++
++namespace OHOS {
++namespace HiviewDFX {
++namespace {
++#undef LOG_DOMAIN
++#undef LOG_TAG
++#define LOG_DOMAIN 0xD002D11
++#define LOG_TAG "DfxElf"
++#if is_ohos && !is_mingw
++enum HdrSection {
++ SECTION_TEXT = 0,
++ SECTION_ARMEXIDX = 1,
++ SECTION_DYNAMIC = 2,
++ SECTION_EHFRAMEHDR = 3
++};
++#endif
++}
++
++void DfxElf::Init()
++{
++ uti_.namePtr = 0;
++ uti_.format = -1;
++ hasTableInfo_ = false;
++}
++
++void DfxElf::Clear()
++{
++ if (elfParse_ != nullptr) {
++ elfParse_.reset();
++ elfParse_ = nullptr;
++ }
++
++ if (mmap_ != nullptr) {
++ mmap_->Clear();
++ mmap_.reset();
++ mmap_ = nullptr;
++ }
++}
++
++bool DfxElf::InitHeaders()
++{
++ if (mmap_ == nullptr) {
++ return false;
++ }
++
++ if (elfParse_ != nullptr) {
++ return true;
++ }
++
++ uint8_t ident[SELFMAG + 1];
++ if (!Read(0, ident, SELFMAG) || !IsValidElf(ident, SELFMAG)) {
++ return false;
++ }
++
++ if (!Read(EI_CLASS, &classType_, sizeof(uint8_t))) {
++ return false;
++ }
++
++ if (classType_ == ELFCLASS32) {
++ elfParse_ = std::unique_ptr(new ElfParser32(mmap_));
++ } else if (classType_ == ELFCLASS64) {
++ elfParse_ = std::unique_ptr(new ElfParser64(mmap_));
++ } else {
++ DFXLOGW("InitHeaders failed, classType: %{public}d", classType_);
++ return false;
++ }
++ if (elfParse_ != nullptr) {
++ valid_ = true;
++ elfParse_->InitHeaders();
++ }
++ return valid_;
++}
++
++bool DfxElf::IsValid()
++{
++ if (valid_ == false) {
++ InitHeaders();
++ }
++ return valid_;
++}
++
++uint8_t DfxElf::GetClassType()
++{
++ if (IsValid()) {
++ return classType_;
++ }
++ return ELFCLASSNONE;
++}
++
++ArchType DfxElf::GetArchType()
++{
++ if (IsValid()) {
++ elfParse_->GetArchType();
++ }
++ return ARCH_UNKNOWN;
++}
++
++int64_t DfxElf::GetLoadBias()
++{
++ if (loadBias_ == 0) {
++ if (IsValid()) {
++ loadBias_ = elfParse_->GetLoadBias();
++ DFXLOGU("Elf loadBias: %{public}" PRIx64 "", (uint64_t)loadBias_);
++ }
++ }
++ return loadBias_;
++}
++
++uint64_t DfxElf::GetLoadBase(uint64_t mapStart, uint64_t mapOffset)
++{
++ if (loadBase_ == static_cast(-1)) {
++ if (IsValid()) {
++ DFXLOGU("mapStart: %{public}" PRIx64 ", mapOffset: %{public}" PRIx64 "",
++ (uint64_t)mapStart, (uint64_t)mapOffset);
++ loadBase_ = mapStart - mapOffset - static_cast(GetLoadBias());
++ DFXLOGU("Elf loadBase: %{public}" PRIx64 "", (uint64_t)loadBase_);
++ }
++ }
++ return loadBase_;
++}
++
++void DfxElf::SetLoadBase(uint64_t base)
++{
++ loadBase_ = base;
++}
++
++void DfxElf::SetBaseOffset(uint64_t offset)
++{
++ baseOffset_ = offset;
++}
++
++uint64_t DfxElf::GetBaseOffset()
++{
++ return baseOffset_;
++}
++
++uint64_t DfxElf::GetStartPc()
++{
++ if (startPc_ == static_cast(-1)) {
++ if (IsValid()) {
++ auto startVaddr = elfParse_->GetStartVaddr();
++ if (loadBase_ != static_cast(-1) && startVaddr != static_cast(-1)) {
++ startPc_ = startVaddr + loadBase_;
++ DFXLOGU("Elf startPc: %{public}" PRIx64 "", (uint64_t)startPc_);
++ }
++ }
++ }
++ return startPc_;
++}
++
++uint64_t DfxElf::GetStartVaddr()
++{
++ if (IsValid()) {
++ return elfParse_->GetStartVaddr();
++ }
++ return 0;
++}
++
++uint64_t DfxElf::GetEndPc()
++{
++ if (endPc_ == 0) {
++ if (IsValid()) {
++ auto endVaddr = elfParse_->GetEndVaddr();
++ if (loadBase_ != static_cast(-1) && endVaddr != 0) {
++ endPc_ = endVaddr + loadBase_;
++ DFXLOGU("Elf endPc: %{public}" PRIx64 "", (uint64_t)endPc_);
++ }
++ }
++ }
++ return endPc_;
++}
++
++uint64_t DfxElf::GetEndVaddr()
++{
++ if (IsValid()) {
++ return elfParse_->GetEndVaddr();
++ }
++ return 0;
++}
++
++uint64_t DfxElf::GetStartOffset()
++{
++ if (IsValid()) {
++ return elfParse_->GetStartOffset();
++ }
++ return 0;
++}
++
++uint64_t DfxElf::GetRelPc(uint64_t pc, uint64_t mapStart, uint64_t mapOffset)
++{
++ return (pc - GetLoadBase(mapStart, mapOffset));
++}
++
++uint64_t DfxElf::GetElfSize()
++{
++ if (!IsValid()) {
++ return 0;
++ }
++ return elfParse_->GetElfSize();
++}
++
++std::string DfxElf::GetElfName()
++{
++ if (!IsValid()) {
++ return "";
++ }
++ return elfParse_->GetElfName();
++}
++
++void DfxElf::SetBuildId(const std::string& buildId)
++{
++ buildId_ = buildId;
++}
++
++std::string DfxElf::GetBuildId(uint64_t noteAddr, uint64_t noteSize)
++{
++ return ElfParser::ParseHexBuildId(noteAddr, noteSize);
++}
++
++std::string DfxElf::GetBuildId()
++{
++ if (buildId_.empty()) {
++ if (!IsValid()) {
++ return "";
++ }
++ return elfParse_->GetBuildId();
++ }
++ return buildId_;
++}
++
++
++uintptr_t DfxElf::GetGlobalPointer()
++{
++ if (!IsValid()) {
++ return 0;
++ }
++ return elfParse_->GetGlobalPointer();
++}
++
++bool DfxElf::GetSectionInfo(ShdrInfo& shdr, const std::string secName)
++{
++ if (!IsValid()) {
++ return false;
++ }
++ return elfParse_->GetSectionInfo(shdr, secName);
++}
++
++bool DfxElf::GetSectionData(unsigned char* buf, uint64_t size, std::string secName)
++{
++ if (!IsValid()) {
++ return false;
++ }
++ return elfParse_->GetSectionData(buf, size, secName);
++}
++
++GnuDebugDataHdr DfxElf::GetGnuDebugDataHdr()
++{
++ if (!IsValid()) {
++ return {};
++ }
++ return elfParse_->GetGnuDebugDataHdr();
++}
++
++bool DfxElf::IsMiniDebugInfoValid()
++{
++ if (miniDebugInfo_ == nullptr) {
++#if defined(ENABLE_MINIDEBUGINFO)
++ MiniDebugInfoFactory miniDebugInfoFactory(elfParse_->GetGnuDebugDataHdr());
++ miniDebugInfo_ = miniDebugInfoFactory.Create();
++#endif
++ }
++ return miniDebugInfo_ != nullptr;
++}
++
++const std::set& DfxElf::GetFuncSymbols()
++{
++ if (!IsValid() || !funcSymbols_.empty()) {
++ return funcSymbols_;
++ }
++ if (IsMiniDebugInfoValid()) {
++ funcSymbols_ = miniDebugInfo_->elfParse_->GetFuncSymbols();
++ DFXLOGU("Get MiniDebugInfo FuncSymbols, size: %{public}zu", funcSymbols_.size());
++ }
++ const auto &symbols = elfParse_->GetFuncSymbols();
++ funcSymbols_.insert(symbols.begin(), symbols.end());
++ DFXLOGU("GetFuncSymbols, size: %{public}zu", funcSymbols_.size());
++ return funcSymbols_;
++}
++
++bool DfxElf::GetFuncInfoLazily(uint64_t addr, ElfSymbol& elfSymbol)
++{
++ DFX_TRACE_SCOPED_DLSYM("GetFuncInfoLazily");
++ if (FindFuncSymbol(addr, funcSymbols_, elfSymbol)) {
++ return true;
++ }
++ bool findSymbol = elfParse_->GetFuncSymbolByAddr(addr, elfSymbol);
++ if (!findSymbol && IsMiniDebugInfoValid()) {
++ findSymbol = miniDebugInfo_->elfParse_->GetFuncSymbolByAddr(addr, elfSymbol);
++ }
++
++ if (findSymbol) {
++ funcSymbols_.emplace(elfSymbol);
++ DFXLOGU("GetFuncInfoLazily, size: %{public}zu", funcSymbols_.size());
++ }
++ return findSymbol;
++}
++
++bool DfxElf::GetFuncInfo(uint64_t addr, ElfSymbol& elfSymbol)
++{
++ if (!IsValid()) {
++ return false;
++ }
++ if (UnwinderConfig::GetEnableLoadSymbolLazily()) {
++ return GetFuncInfoLazily(addr, elfSymbol);
++ }
++
++ const auto &symbols = GetFuncSymbols();
++ return FindFuncSymbol(addr, symbols, elfSymbol);
++}
++
++bool DfxElf::FindFuncSymbol(uint64_t addr, const std::set& symbols, ElfSymbol& elfSymbol)
++{
++ DFX_TRACE_SCOPED_DLSYM("FindFuncSymbol");
++ if (symbols.empty()) {
++ return false;
++ }
++ // Find the first position that is not less than value
++ ElfSymbol tmpSym;
++ tmpSym.value = addr;
++ auto next = symbols.upper_bound(tmpSym);
++ if (next != symbols.begin()) {
++ next--;
++ }
++ if (next->value <= addr && addr < (next->value + next->size)) {
++ elfSymbol = *next;
++ return true;
++ }
++ return false;
++}
++
++const std::unordered_map& DfxElf::GetPtLoads()
++{
++ return elfParse_->GetPtLoads();
++}
++
++bool DfxElf::FillUnwindTableByExidx(ShdrInfo shdr, uintptr_t loadBase, struct UnwindTableInfo* uti)
++{
++ if (uti == nullptr) {
++ return false;
++ }
++ uti->gp = 0;
++ uti->tableData = loadBase + shdr.addr;
++ uti->tableLen = shdr.size;
++ INSTR_STATISTIC(InstructionEntriesArmExidx, shdr.size, 0);
++ uti->format = UNW_INFO_FORMAT_ARM_EXIDX;
++ DFXLOGU("[%{public}d]: tableData: %{public}" PRIx64 ", tableLen: %{public}d", __LINE__,
++ (uint64_t)uti->tableData, (int)uti->tableLen);
++ return true;
++}
++
++#if is_ohos && !is_mingw
++bool DfxElf::FillUnwindTableByEhhdrLocal(struct DwarfEhFrameHdr* hdr, struct UnwindTableInfo* uti)
++{
++ if (hdr == nullptr) {
++ return false;
++ }
++ if (hdr->version != DW_EH_VERSION) {
++ DFXLOGE("[%{public}d]: version(%{public}d) error", __LINE__, hdr->version);
++ return false;
++ }
++
++ uintptr_t ptr = (uintptr_t)(&(hdr->ehFrame));
++ DFXLOGU("[%{public}d]: hdr: %{public}" PRIx64 ", ehFrame: %{public}" PRIx64 "", __LINE__,
++ (uint64_t)hdr, (uint64_t)ptr);
++ auto memory = std::make_shared(UNWIND_TYPE_LOCAL);
++ DFXLOGU("[%{public}d]: gp: %{public}" PRIx64 ", ehFramePtrEnc: %{public}x, fdeCountEnc: %{public}x", __LINE__,
++ (uint64_t)uti->gp, hdr->ehFramePtrEnc, hdr->fdeCountEnc);
++ memory->SetDataOffset(uti->gp);
++ MAYBE_UNUSED uintptr_t ehFrameStart = memory->ReadEncodedValue(ptr, hdr->ehFramePtrEnc);
++ uintptr_t fdeCount = memory->ReadEncodedValue(ptr, hdr->fdeCountEnc);
++ DFXLOGU("[%{public}d]: ehFrameStart: %{public}" PRIx64 ", fdeCount: %{public}d", __LINE__,
++ (uint64_t)ehFrameStart, (int)fdeCount);
++
++ if (hdr->tableEnc != (DW_EH_PE_datarel | DW_EH_PE_sdata4)) {
++ DFXLOGU("tableEnc: %{public}x", hdr->tableEnc);
++ if (hdr->fdeCountEnc == DW_EH_PE_omit) {
++ fdeCount = ~0UL;
++ }
++ if (hdr->ehFramePtrEnc == DW_EH_PE_omit) {
++ DFXLOGE("ehFramePtrEnc(%{public}x) error", hdr->ehFramePtrEnc);
++ return false;
++ }
++ uti->isLinear = true;
++ uti->tableLen = fdeCount;
++ uti->tableData = ehFrameStart;
++ } else {
++ uti->isLinear = false;
++ uti->tableLen = (fdeCount * sizeof(DwarfTableEntry)) / sizeof(uintptr_t);
++ uti->tableData = ptr;
++ uti->segbase = (uintptr_t)hdr;
++ }
++ uti->format = UNW_INFO_FORMAT_REMOTE_TABLE;
++ DFXLOGU("[%{public}d]: tableData: %{public}" PRIx64 ", tableLen: %{public}d", __LINE__,
++ (uint64_t)uti->tableData, (int)uti->tableLen);
++ return true;
++}
++#endif
++
++bool DfxElf::FillUnwindTableByEhhdr(struct DwarfEhFrameHdr* hdr, uintptr_t shdrBase, struct UnwindTableInfo* uti)
++{
++ if ((hdr == nullptr) || (uti == nullptr)) {
++ return false;
++ }
++ if (hdr->version != DW_EH_VERSION) {
++ DFXLOGE("[%{public}d]: version(%{public}d) error", __LINE__, hdr->version);
++ return false;
++ }
++ uintptr_t ptr = (uintptr_t)(&(hdr->ehFrame));
++ DFXLOGU("[%{public}d]: hdr: %{public}" PRIx64 ", ehFrame: %{public}" PRIx64 "", __LINE__,
++ (uint64_t)hdr, (uint64_t)ptr);
++
++ uti->gp = GetGlobalPointer();
++ DFXLOGU("[%{public}d]: gp: %{public}" PRIx64 ", ehFramePtrEnc: %{public}x, fdeCountEnc: %{public}x", __LINE__,
++ (uint64_t)uti->gp, hdr->ehFramePtrEnc, hdr->fdeCountEnc);
++ mmap_->SetDataOffset(uti->gp);
++ auto ptrOffset = ptr - reinterpret_cast(GetMmapPtr());
++ MAYBE_UNUSED uintptr_t ehFrameStart = mmap_->ReadEncodedValue(ptrOffset, hdr->ehFramePtrEnc);
++ uintptr_t fdeCount = mmap_->ReadEncodedValue(ptrOffset, hdr->fdeCountEnc);
++ DFXLOGU("[%{public}d]: ehFrameStart: %{public}" PRIx64 ", fdeCount: %{public}d", __LINE__,
++ (uint64_t)ehFrameStart, (int)fdeCount);
++ ptr = reinterpret_cast(GetMmapPtr()) + ptrOffset;
++
++ if (hdr->tableEnc != (DW_EH_PE_datarel | DW_EH_PE_sdata4)) {
++ DFXLOGU("[%{public}d]: tableEnc: %{public}x", __LINE__, hdr->tableEnc);
++ if (hdr->fdeCountEnc == DW_EH_PE_omit) {
++ fdeCount = ~0UL;
++ }
++ if (hdr->ehFramePtrEnc == DW_EH_PE_omit) {
++ DFXLOGE("[%{public}d]: ehFramePtrEnc(%{public}x) error", __LINE__, hdr->ehFramePtrEnc);
++ return false;
++ }
++ uti->isLinear = true;
++ uti->tableLen = fdeCount;
++ uti->tableData = shdrBase + ehFrameStart;
++ uti->segbase = shdrBase;
++ } else {
++ uti->isLinear = false;
++ uti->tableLen = (fdeCount * sizeof(DwarfTableEntry)) / sizeof(uintptr_t);
++ uti->tableData = shdrBase + ptr - (uintptr_t)hdr;
++ uti->segbase = shdrBase;
++ }
++ uti->format = UNW_INFO_FORMAT_REMOTE_TABLE;
++ DFXLOGU("[%{public}d]: tableData: %{public}" PRIx64 ", tableLen: %{public}d", __LINE__,
++ (uint64_t)uti->tableData, (int)uti->tableLen);
++ return true;
++}
++
++int DfxElf::FindUnwindTableInfo(uintptr_t pc, std::shared_ptr map, struct UnwindTableInfo& uti)
++{
++ if (hasTableInfo_ && pc >= uti_.startPc && pc < uti_.endPc) {
++ uti = uti_;
++ DFXLOGU("FindUnwindTableInfo had found");
++ return UNW_ERROR_NONE;
++ }
++ if (map == nullptr) {
++ return UNW_ERROR_INVALID_MAP;
++ }
++ uintptr_t loadBase = GetLoadBase(map->begin, map->offset);
++ uti.startPc = GetStartPc();
++ uti.endPc = GetEndPc();
++ if (pc < uti.startPc || pc >= uti.endPc) {
++ DFXLOGU("Elf startPc: %{public}" PRIx64 ", endPc: %{public}" PRIx64 "",
++ (uint64_t)uti.startPc, (uint64_t)uti.endPc);
++ return UNW_ERROR_PC_NOT_IN_UNWIND_INFO;
++ }
++
++ ShdrInfo shdr;
++#if defined(__arm__)
++ if (GetSectionInfo(shdr, ARM_EXIDX)) {
++ hasTableInfo_ = FillUnwindTableByExidx(shdr, loadBase, &uti);
++ }
++#endif
++
++ if (!hasTableInfo_) {
++ struct DwarfEhFrameHdr* hdr = nullptr;
++ struct DwarfEhFrameHdr synthHdr;
++ if (GetSectionInfo(shdr, EH_FRAME_HDR) && GetMmapPtr() != nullptr) {
++ INSTR_STATISTIC(InstructionEntriesEhFrame, shdr.size, 0);
++ hdr = (struct DwarfEhFrameHdr *) (shdr.offset + (char *)GetMmapPtr());
++ } else if (GetSectionInfo(shdr, EH_FRAME) && GetMmapPtr() != nullptr) {
++ DFXLOGW("[%{public}d]: Elf(%{public}s) no found .eh_frame_hdr section, " \
++ "using synthetic .eh_frame section", __LINE__, map->name.c_str());
++ INSTR_STATISTIC(InstructionEntriesEhFrame, shdr.size, 0);
++ synthHdr.version = DW_EH_VERSION;
++ synthHdr.ehFramePtrEnc = DW_EH_PE_absptr |
++ ((sizeof(ElfW(Addr)) == 4) ? DW_EH_PE_udata4 : DW_EH_PE_udata8); // 4 : four bytes
++ synthHdr.fdeCountEnc = DW_EH_PE_omit;
++ synthHdr.tableEnc = DW_EH_PE_omit;
++ synthHdr.ehFrame = (ElfW(Addr))(shdr.offset + (char*)GetMmapPtr());
++ hdr = &synthHdr;
++ }
++ uintptr_t shdrBase = static_cast(loadBase + shdr.addr);
++ hasTableInfo_ = FillUnwindTableByEhhdr(hdr, shdrBase, &uti);
++ }
++
++ if (hasTableInfo_) {
++ uti_ = uti;
++ return UNW_ERROR_NONE;
++ }
++ return UNW_ERROR_NO_UNWIND_INFO;
++}
++
++int DfxElf::FindUnwindTableLocal(uintptr_t pc, struct UnwindTableInfo& uti)
++{
++#if is_ohos && !is_mingw
++ DlCbData cbData;
++ (void)memset_s(&cbData, sizeof(cbData), 0, sizeof(cbData));
++ cbData.pc = pc;
++ cbData.uti.format = -1;
++ int ret = dl_iterate_phdr(DlPhdrCb, &cbData);
++ if (ret > 0) {
++ if (cbData.uti.format != -1) {
++ uti = cbData.uti;
++ return UNW_ERROR_NONE;
++ }
++ }
++ return UNW_ERROR_NO_UNWIND_INFO;
++#else
++ return UNW_ERROR_UNSUPPORTED_VERSION;
++#endif
++}
++
++#if is_ohos && !is_mingw
++bool DfxElf::FindSection(struct dl_phdr_info* info, const std::string secName, ShdrInfo& shdr)
++{
++ if (info == nullptr) {
++ return false;
++ }
++ const char* file = info->dlpi_name;
++ if (strlen(file) == 0) {
++ file = PROC_SELF_EXE_PATH;
++ }
++ RegularElfFactory elfFactory(file);
++ auto elf = elfFactory.Create();
++ if (elf == nullptr) {
++ return false;
++ }
++
++ return elf->GetSectionInfo(shdr, secName);
++}
++
++void DfxElf::ParsePhdr(struct dl_phdr_info* info, const ElfW(Phdr)* (&pHdrSections)[4], const uintptr_t pc)
++{
++ const ElfW(Phdr)* phdr = info->dlpi_phdr;
++ for (size_t i = 0; i < info->dlpi_phnum && phdr != nullptr; i++, phdr++) {
++ switch (phdr->p_type) {
++ case PT_LOAD: {
++ ElfW(Addr) vaddr = phdr->p_vaddr + info->dlpi_addr;
++ if (pc >= vaddr && pc < vaddr + phdr->p_memsz) {
++ pHdrSections[SECTION_TEXT] = phdr;
++ }
++ break;
++ }
++#if defined(__arm__)
++ case PT_ARM_EXIDX: {
++ pHdrSections[SECTION_ARMEXIDX] = phdr;
++ break;
++ }
++#endif
++ case PT_GNU_EH_FRAME: {
++ pHdrSections[SECTION_EHFRAMEHDR] = phdr;
++ break;
++ }
++ case PT_DYNAMIC: {
++ pHdrSections[SECTION_DYNAMIC] = phdr;
++ break;
++ }
++ default:
++ break;
++ }
++ }
++}
++
++bool DfxElf::ProccessDynamic(const ElfW(Phdr)* pDynamic, ElfW(Addr) loadBase, UnwindTableInfo* uti)
++{
++ ElfW(Dyn)* dyn = reinterpret_cast(pDynamic->p_vaddr + loadBase);
++ if (dyn == nullptr) {
++ return false;
++ }
++ for (; dyn->d_tag != DT_NULL; ++dyn) {
++ if (dyn->d_tag == DT_PLTGOT) {
++ uti->gp = dyn->d_un.d_ptr;
++ break;
++ }
++ }
++ return true;
++}
++
++struct DwarfEhFrameHdr* DfxElf::InitHdr(struct DwarfEhFrameHdr& synthHdr,
++ struct dl_phdr_info* info, const ElfW(Phdr)* pEhHdr)
++{
++ struct DwarfEhFrameHdr* hdr = nullptr;
++ if (pEhHdr) {
++ INSTR_STATISTIC(InstructionEntriesEhFrame, pEhHdr->p_memsz, 0);
++ hdr = reinterpret_cast(pEhHdr->p_vaddr + info->dlpi_addr);
++ } else {
++ ShdrInfo shdr;
++ if (FindSection(info, EH_FRAME, shdr)) {
++ DFXLOGW("[%{public}d]: Elf(%{public}s) no found .eh_frame_hdr section, " \
++ "using synthetic .eh_frame section", __LINE__, info->dlpi_name);
++ INSTR_STATISTIC(InstructionEntriesEhFrame, shdr.size, 0);
++ synthHdr.version = DW_EH_VERSION;
++ synthHdr.ehFramePtrEnc = DW_EH_PE_absptr |
++ ((sizeof(ElfW(Addr)) == 4) ? DW_EH_PE_udata4 : DW_EH_PE_udata8); // 4 : four bytes
++ synthHdr.fdeCountEnc = DW_EH_PE_omit;
++ synthHdr.tableEnc = DW_EH_PE_omit;
++ synthHdr.ehFrame = (ElfW(Addr))(shdr.addr + info->dlpi_addr);
++ hdr = &synthHdr;
++ }
++ }
++ return hdr;
++}
++
++int DfxElf::DlPhdrCb(struct dl_phdr_info* info, size_t size, void* data)
++{
++ struct DlCbData* cbData = reinterpret_cast