From b75ac7e078aeae998fde35efcd3d09ad43141cd2 Mon Sep 17 00:00:00 2001 From: zhangzepeng Date: Mon, 4 Mar 2024 16:38:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E2=80=991.hisysevent=E7=9A=84=E6=B3=B3?= =?UTF-8?q?=E9=81=93=E5=9B=BE=E6=94=BE=E5=A4=A7=E7=BC=A9=E5=B0=8F=E4=BC=9A?= =?UTF-8?q?=E6=B6=88=E5=A4=B12.=E4=BF=AE=E5=A4=8D=E5=BC=95=E5=85=A5?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E7=A7=B0=E5=A4=A7=E5=B0=8F=E5=86=99?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=AF=BC=E8=87=B4=E7=9A=84linux=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E4=B8=8D=E8=BF=87=E7=9A=84=E9=97=AE=E9=A2=983.?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=AF=BC=E5=85=A5so=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9A=84Tab=E9=A1=B5=EF=BC=8C=E6=B3=B3=E9=81=93=E5=9B=BE?= =?UTF-8?q?=E6=A1=86=E9=80=89=E4=BD=BF=E7=94=A8m=E9=94=AE=E6=88=96shift+m?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E5=AF=BC=E5=85=A5so=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=B6=88=E5=A4=B14.TaskPoll=E8=BF=9E=E7=BA=BF=E9=97=AA?= =?UTF-8?q?=E7=83=81=E6=8A=A5=E9=94=995.=E4=BB=A3=E7=A0=81=E6=95=B4?= =?UTF-8?q?=E6=94=B9=E5=BC=95=E8=B5=B7=E7=9A=84NativeMemory-AnalysisTab?= =?UTF-8?q?=E9=A1=B5=E6=95=B0=E6=8D=AE=E5=BC=82=E5=B8=B86.=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Dtrace=E4=BD=BF=E7=94=A8liunx=E4=BA=8C=E8=BF=9B?= =?UTF-8?q?=E5=88=B6=E8=BD=AC=E6=8D=A2=E6=88=90=E5=8A=9F=E4=BD=86=E7=BD=91?= =?UTF-8?q?=E7=AB=99=E8=BD=AC=E6=8D=A2=E5=A4=B1=E8=B4=A57.Taskpool?= =?UTF-8?q?=E8=BF=9E=E7=BA=BFexecuteId=E6=94=B9=E4=B8=BAtaskId=E9=80=82?= =?UTF-8?q?=E9=85=8D8.rawtrace=E5=88=87=E5=89=B2=E9=80=82=E9=85=8D9.?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=88=87=E5=89=B2=E8=BF=94=E5=9B=9E=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=BA=E7=A9=BA=E6=97=B6=E5=A2=9E=E5=8A=A0=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E4=BF=A1=E6=81=AF=E2=80=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangzepeng --- ide/src/base-ui/table/lit-table.ts | 62 ++++---- ide/src/trace/SpApplication.ts | 6 + ide/src/trace/bean/StateModle.ts | 15 -- ide/src/trace/component/SpFlags.ts | 5 + ide/src/trace/component/SpSystemTrace.line.ts | 26 +++- ide/src/trace/component/SpSystemTrace.ts | 3 +- .../trace/component/trace/base/TraceSheet.ts | 2 +- .../component/trace/base/TraceSheetConfig.ts | 2 +- .../component/trace/sheet/TabPaneCurrent.ts | 1 - .../TabPaneNMStatisticAnalysis.ts | 64 +++++++-- .../trace/sheet/task/TabPaneTaskFrames.ts | 23 +-- .../trace/timer-shaft/TabPaneFlag.ts | 1 - ide/src/trace/database/ConvertTraceWorker.ts | 49 ++++--- ide/src/trace/database/TraceWorker.ts | 63 ++++++-- .../data-trafic/EnergySysEventReceiver.ts | 23 +-- ide/src/trace/database/sql/Perf.sql.ts | 4 +- .../trace/database/sql/ProcessThread.sql.ts | 2 +- ide/src/trace/database/sql/SqlLite.sql.ts | 8 +- trace_streamer/build.sh | 2 +- trace_streamer/build_operator.sh | 2 +- trace_streamer/gn/BUILD.gn | 17 ++- .../patch_googletest/googletestbuild.gn | 4 +- .../prebuilts/patch_hiperf/hiviewdfx_BUILD.gn | 2 +- trace_streamer/src/base/index_map.h | 40 +++--- trace_streamer/src/filter/cpu_filter.cpp | 6 +- .../src/filter/native_hook_filter.cpp | 48 ++++++- .../src/filter/native_hook_filter.h | 14 +- .../src/filter/task_pool_filter.cpp | 55 +++---- trace_streamer/src/filter/task_pool_filter.h | 11 +- .../bytrace_parser/bytrace_event_parser.cpp | 35 +++-- .../bytrace_parser/bytrace_event_parser.h | 3 +- .../htrace_event_parser.cpp | 2 +- .../htrace_native_hook_parser.cpp | 53 +++++-- .../htrace_native_hook_parser.h | 1 + .../htrace_pbreader_parser/htrace_parser.cpp | 10 +- .../rawtrace_parser/ftrace_processor.cpp | 54 ++++--- .../parser/rawtrace_parser/ftrace_processor.h | 24 +++- .../rawtrace_parser/rawtrace_parser.cpp | 136 ++++++++++++++---- .../parser/rawtrace_parser/rawtrace_parser.h | 35 ++++- .../native_hook/native_hook_result.proto | 1 + trace_streamer/src/rpc/rpc_server.cpp | 40 ++++++ trace_streamer/src/rpc/rpc_server.h | 2 + .../src/table/ftrace/task_pool_table.cpp | 12 +- .../native_hook/native_hook_frame_table.cpp | 18 ++- .../src/trace_data/trace_data_cache.cpp | 9 ++ .../src/trace_data/trace_data_cache.h | 3 + .../trace_stdtype/common_stdtype.cpp | 5 +- .../ftrace/template/task_pool_stdtype.cpp | 18 +-- .../ftrace/template/task_pool_stdtype.h | 14 +- .../htrace/native_memory_stdtype.cpp | 12 +- .../htrace/native_memory_stdtype.h | 9 +- .../trace_streamer_selector.cpp | 4 + .../trace_streamer/trace_streamer_selector.h | 5 + trace_streamer/src/version.cpp | 4 +- 54 files changed, 742 insertions(+), 327 deletions(-) diff --git a/ide/src/base-ui/table/lit-table.ts b/ide/src/base-ui/table/lit-table.ts index a611a21c9..4e218de42 100644 --- a/ide/src/base-ui/table/lit-table.ts +++ b/ide/src/base-ui/table/lit-table.ts @@ -817,7 +817,7 @@ export class LitTable extends HTMLElement { return !item.rowHidden; }); let top = this.tableElement!.scrollTop; - this.treeElement!.style.transform = `translateY(${top}px)`; + this.treeElement && (this.treeElement!.style.transform = `translateY(${top}px)`); let skip = 0; for (let index = 0; index < visibleObjects.length; index++) { if (visibleObjects[index].top <= top && visibleObjects[index].top + visibleObjects[index].height >= top) { @@ -1089,7 +1089,10 @@ export class LitTable extends HTMLElement { // 但是对于Current Selection tab页来说,表格前两列是时间,第三列是input标签,第四列是button标签 // 而第一行的数据只有第四列一个button,和模板中的数据并不一样,所以要特别处理一下 if (column.template) { - if (dataIndex === 'color' && rowData.data.colorEl === undefined) { + if ( + (dataIndex === 'color' && rowData.data.colorEl === undefined) || + (dataIndex === 'text' && rowData.data.text === undefined) + ) { td.innerHTML = ''; td.template = ''; } else if (dataIndex === 'operate' && rowData.data.operate && rowData.data.operate.innerHTML === 'RemoveAll') { @@ -1240,36 +1243,39 @@ export class LitTable extends HTMLElement { } }); this.tbodyElement && (this.tbodyElement.style.height = totalHeight + (this.isScrollXOutSide ? 0 : 0) + 'px'); - this.treeElement!.style.height = this.tableElement!.clientHeight - this.theadElement!.clientHeight + 'px'; + this.treeElement && + (this.treeElement.style.height = this.tableElement!.clientHeight - this.theadElement!.clientHeight + 'px'); let visibleObjects = this.recycleDs.filter((item) => { return !item.rowHidden; }); - let top = this.tableElement!.scrollTop; - let skip = 0; - for (let i = 0; i < visibleObjects.length; i++) { - if (visibleObjects[i].top <= top && visibleObjects[i].top + visibleObjects[i].height >= top) { - skip = i; - break; + if (this.tableElement) { + let top = this.tableElement!.scrollTop; + let skip = 0; + for (let i = 0; i < visibleObjects.length; i++) { + if (visibleObjects[i].top <= top && visibleObjects[i].top + visibleObjects[i].height >= top) { + skip = i; + break; + } } - } - let reduce = this.currentRecycleList.map((item) => item.clientHeight).reduce((a, b) => a + b, 0); - if (reduce === 0) { - return; - } - while (reduce <= this.tableElement!.clientHeight + 1) { - let isTree = this.hasAttribute('tree'); - let newTableElement = this.addTableElement(visibleObjects[skip], isTree, isTree, false); - reduce += newTableElement.clientHeight; - } - for (let i = 0; i < this.currentRecycleList.length; i++) { - if (this.hasAttribute('tree')) { - this.freshCurrentLine( - this.currentRecycleList[i], - visibleObjects[i + skip], - this.treeElement?.children[i] as HTMLElement - ); - } else { - this.freshLineHandler(i, skip, visibleObjects); + let reduce = this.currentRecycleList.map((item) => item.clientHeight).reduce((a, b) => a + b, 0); + if (reduce === 0) { + return; + } + while (reduce <= this.tableElement!.clientHeight + 1) { + let isTree = this.hasAttribute('tree'); + let newTableElement = this.addTableElement(visibleObjects[skip], isTree, isTree, false); + reduce += newTableElement.clientHeight; + } + for (let i = 0; i < this.currentRecycleList.length; i++) { + if (this.hasAttribute('tree')) { + this.freshCurrentLine( + this.currentRecycleList[i], + visibleObjects[i + skip], + this.treeElement?.children[i] as HTMLElement + ); + } else { + this.freshLineHandler(i, skip, visibleObjects); + } } } } diff --git a/ide/src/trace/SpApplication.ts b/ide/src/trace/SpApplication.ts index 57b9b5278..9ec7d6273 100644 --- a/ide/src/trace/SpApplication.ts +++ b/ide/src/trace/SpApplication.ts @@ -1958,6 +1958,12 @@ export class SpApplication extends BaseElement { if (cutIndex !== -1) { traceName = traceName.substring(0, cutIndex); } + if (cutBuffer !== undefined && cutBuffer.byteLength <= 12) { + this.litSearch!.setPercent('The cut is empty data. Select a time range for valid data!', -1); + this.progressEL!.loading = false; + this.freshMenuDisable(false); + return; + } let blobUrl = URL.createObjectURL(new Blob([cutBuffer!])); window.open( `index.html?link=true&local=true&traceName=${traceName}_cut_${cutLeftTs}${fileType}&trace=${encodeURIComponent( diff --git a/ide/src/trace/bean/StateModle.ts b/ide/src/trace/bean/StateModle.ts index 60ca7c956..efd5e584b 100644 --- a/ide/src/trace/bean/StateModle.ts +++ b/ide/src/trace/bean/StateModle.ts @@ -1,18 +1,3 @@ -/* - * Copyright (C) 2024 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. - */ - export class StateGroup { SleepingCount: number = 0; RunningCount: number = 0; diff --git a/ide/src/trace/component/SpFlags.ts b/ide/src/trace/component/SpFlags.ts index dd2332e39..6a37385ae 100644 --- a/ide/src/trace/component/SpFlags.ts +++ b/ide/src/trace/component/SpFlags.ts @@ -258,6 +258,11 @@ export class FlagsConfig { switchOptions: [{ option: 'Enabled' }, { option: 'Disabled', selected: true }], describeContent: 'Ffrt Convert templates', }, + { + title: 'HMKernel', + switchOptions: [{ option: 'Enabled' }, { option: 'Disabled', selected: true }], + describeContent: '', + }, ]; static getAllFlagConfig(): Array { diff --git a/ide/src/trace/component/SpSystemTrace.line.ts b/ide/src/trace/component/SpSystemTrace.line.ts index 878fdadff..d369a628b 100644 --- a/ide/src/trace/component/SpSystemTrace.line.ts +++ b/ide/src/trace/component/SpSystemTrace.line.ts @@ -274,7 +274,11 @@ function taskPoolOtherRelationData( relationDataList: FuncStruct[], res: any ): void { + sp.clearPointPair(); selectRow!.fixedList = relationDataList; + if (FuncStruct.selectFuncStruct === undefined || FuncStruct.selectFuncStruct === null) { + return; + } relationDataList.forEach((value) => { TabPaneTaskFrames.TaskArray.push(value); // allocation to execute @@ -283,7 +287,6 @@ function taskPoolOtherRelationData( const selectRowY = selectRow?.translateY!; const selectStartTs = FuncStruct.selectFuncStruct!.startTs!; const selectDur = FuncStruct.selectFuncStruct!.dur!; - if (value.id === res[0].allocation_task_row) { sp.addPointPair( sp.makePoint(value.startTs!, 0, selectRowY, selectRow, offSetY, 'task', LineType.bezierCurve, true), @@ -306,6 +309,10 @@ function taskPoolRelationDataAllocation( relationDataList: FuncStruct[], res: any ): void { + sp.clearPointPair(); + if (FuncStruct.selectFuncStruct === undefined || FuncStruct.selectFuncStruct === null) { + return; + } let executeStruct = relationDataList.filter((item) => item.id === res[0].execute_task_row)[0]; relationDataList.forEach((value) => { const selectY = (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20; @@ -344,6 +351,10 @@ function taskPoolRelationDataPerformTask( relationDataList: FuncStruct[], res: any ): void { + sp.clearPointPair(); + if (FuncStruct.selectFuncStruct === undefined || FuncStruct.selectFuncStruct === null) { + return; + } let executeStruct = relationDataList.filter((item) => item.id === res[0].execute_task_row)[0]; relationDataList.forEach((value) => { const executeRowY = executeRow?.translateY!; @@ -378,7 +389,11 @@ function taskPoolRelationDataPerformTask( function taskAllocationOrPerformTask(sp: SpSystemTrace, row: TraceRow, executeID: string): void { TabPaneTaskFrames.IsShowConcurrency = false; + sp.clearPointPair(); queryBySelectAllocationOrReturn(executeID, FuncStruct.selectFuncStruct!.itid!).then((res) => { + if (!FuncStruct.selectFuncStruct) { + return; + } if (FuncStruct.selectFuncStruct!.funName!.indexOf('H:Task Allocation:') >= 0 && res.length > 0) { let executeRow = sp.shadowRoot?.querySelector>( `trace-row[row-id='${res[0].tid}'][row-type='func']` @@ -422,14 +437,17 @@ function taskAllocationOrPerformTask(sp: SpSystemTrace, row: TraceRow, exec } export function spSystemTraceDrawTaskPollLine(sp: SpSystemTrace, row?: TraceRow): void { - let executeID = TabPaneTaskFrames.getExecuteId(FuncStruct.selectFuncStruct!.funName!); + if (FuncStruct.selectFuncStruct === undefined || FuncStruct.selectFuncStruct === null) { + return; + } + let relationId = TabPaneTaskFrames.getRelationId(FuncStruct.selectFuncStruct!.funName!); TabPaneTaskFrames.TaskArray.push(FuncStruct.selectFuncStruct!); if (!row) { return; } if (FuncStruct.selectFuncStruct!.funName!.indexOf('H:Task Perform:') >= 0) { TabPaneTaskFrames.IsShowConcurrency = true; - queryBySelectExecute(executeID, FuncStruct.selectFuncStruct!.itid!).then((res) => { + queryBySelectExecute(relationId, FuncStruct.selectFuncStruct!.itid!).then((res) => { if (res.length === 1) { let allocationRowId = res[0].tid; let selectRow = sp.shadowRoot?.querySelector>( @@ -457,7 +475,7 @@ export function spSystemTraceDrawTaskPollLine(sp: SpSystemTrace, row?: TraceRow< } }); } else { - taskAllocationOrPerformTask(sp, row, executeID); + taskAllocationOrPerformTask(sp, row, relationId); } } diff --git a/ide/src/trace/component/SpSystemTrace.ts b/ide/src/trace/component/SpSystemTrace.ts index 0897bcdd0..5695ff611 100644 --- a/ide/src/trace/component/SpSystemTrace.ts +++ b/ide/src/trace/component/SpSystemTrace.ts @@ -778,6 +778,7 @@ export class SpSystemTrace extends BaseElement { SoStruct.selectSoStruct || AllAppStartupStruct.selectStartupStruct || FrameAnimationStruct.selectFrameAnimationStruct || + SampleStruct.selectSampleStruct || JsCpuProfilerStruct.selectJsCpuProfilerStruct; this.calculateSlicesTime(selectedStruct, shiftKey); @@ -1343,7 +1344,7 @@ export class SpSystemTrace extends BaseElement { this.addEventListener('click', this.documentOnClick); this.addEventListener('mousedown', this.documentOnMouseDown); this.addEventListener('mouseup', this.documentOnMouseUp); - this.addEventListener('mouseout', this.documentOnMouseOut); + this.addEventListener('mouseout', this.documentOnMouseOut); document.addEventListener('keydown', this.documentOnKeyDown); document.addEventListener('keypress', this.documentOnKeyPress); diff --git a/ide/src/trace/component/trace/base/TraceSheet.ts b/ide/src/trace/component/trace/base/TraceSheet.ts index 12c256db1..8efd91ff0 100644 --- a/ide/src/trace/component/trace/base/TraceSheet.ts +++ b/ide/src/trace/component/trace/base/TraceSheet.ts @@ -132,7 +132,7 @@ export class TraceSheet extends BaseElement { displayTab(...names: string[]): T { this.setMode('max'); - if (names.includes('box-flag')) { + if (names.includes('box-flag') || names.includes('tabpane-current')) { this.showUploadSoBt(this.selection); this.showSwitchProcessBt(this.selection); } else { diff --git a/ide/src/trace/component/trace/base/TraceSheetConfig.ts b/ide/src/trace/component/trace/base/TraceSheetConfig.ts index f3fb106d4..3ee495c35 100644 --- a/ide/src/trace/component/trace/base/TraceSheetConfig.ts +++ b/ide/src/trace/component/trace/base/TraceSheetConfig.ts @@ -127,7 +127,7 @@ import { TabPaneBinderDataCut } from '../sheet/binder/TabPaneBinderDataCut'; import { TabPaneBinders } from '../sheet/binder/TabPaneBinders'; import { TabPaneGpufreq } from '../sheet/gpufreq/TabPaneGpufreqUsage'; import { TabPaneGpufreqDataCut } from '../sheet/gpufreq/TabPaneGpufreqDataCut'; -import { TabPaneFreqStatesDataCut } from '../sheet/states/TabPaneFreqStatesDataCut' +import { TabPaneFreqStatesDataCut } from '../sheet/states/TabPaneFreqStatesDataCut'; import { TabPaneSampleInstruction } from '../sheet/sample/TabPaneSampleInstruction'; import { TabPaneSampleInstructionDistributions } from '../sheet/sample/TabPaneSampleInstructionDistributions'; import { TabPaneSampleInstructionTotalTime } from '../sheet/sample/TabPaneSampleInstructionSelectionTotalTime'; diff --git a/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts b/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts index 62dbe111a..3d68d17b7 100644 --- a/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts @@ -184,7 +184,6 @@ export class TabPaneCurrent extends BaseElement { */ private eventHandler(): void { let tr = this.panelTable!.shadowRoot!.querySelectorAll('.tr') as NodeListOf; - tr[0].querySelector('#text-input')!.disabled = true; this.trClickEvent(tr); // 第一个tr是移除全部,所以跳过,从第二个tr开始,和this.slicesTimeList数组的第一个对应……,所以i从1开始,在this.slicesTimeList数组中取值时用i-1 diff --git a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatisticAnalysis.ts b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatisticAnalysis.ts index 13c52c9f0..c192166ec 100644 --- a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatisticAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatisticAnalysis.ts @@ -162,11 +162,12 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { } if (this.functionUsageTbl) { // @ts-ignore - this.functionUsageTbl.shadowRoot.querySelector('.table').style.height = `${this.parentElement!.clientHeight - 30 + this.functionUsageTbl.shadowRoot.querySelector('.table').style.height = `${ + this.parentElement!.clientHeight - 30 }px`; } - this.reset(this.tableType!,false); - this.currentSelection = statisticAnalysisParam; + this.reset(this.tableType!, false); + this.currentSelection = statisticAnalysisParam; this.titleEl!.textContent = ''; this.tabName!.textContent = ''; this.range!.textContent = `Selected range: ${parseFloat( @@ -366,7 +367,7 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { for (let table of this.nmTableArray) { if (table === showTable) { initSort(table, this.nmSortColumn, this.nmSortType); - table.style.display = 'grid'; + table.style.display = 'grid'; table!.removeAttribute('hideDownload'); } else { table!.style.display = 'none'; @@ -674,7 +675,7 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { private nativeSoLevelClickEvent(it: any): void { this.reset(this.functionUsageTbl!, true); - this.showAssignLevel(this.functionUsageTbl!,this.soUsageTbl!, 3, this.eventTypeData); + this.showAssignLevel(this.functionUsageTbl!, this.soUsageTbl!, 3, this.eventTypeData); this.getNMFunctionSize(it); const typeName = this.type === TYPE_MAP_STRING ? TYPE_OTHER_MMAP : this.type; // @ts-ignore @@ -708,12 +709,12 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { for (let type of val.nativeMemory) { if (type === 'All Heap & Anonymous VM') { typeFilter = []; - typeFilter.push(...['\'AllocEvent\'', '\'FreeEvent\'', '\'MmapEvent\'', '\'MunmapEvent\'']); + typeFilter.push(...["'AllocEvent'", "'FreeEvent'", "'MmapEvent'", "'MunmapEvent'"]); break; } else if (type === 'All Heap') { - typeFilter.push(...['\'AllocEvent\'', '\'FreeEvent\'']); + typeFilter.push(...["'AllocEvent'", "'FreeEvent'"]); } else { - typeFilter.push(...['\'MmapEvent\'', '\'MunmapEvent\'']); + typeFilter.push(...["'MmapEvent'", "'MunmapEvent'"]); } } this.getDataFromWorker(val, typeFilter); @@ -842,7 +843,6 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { } } - private getNMLibSize(item: any): void { this.progressEL!.loading = true; let typeId = item.typeId; @@ -906,7 +906,7 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { return; } for (let data of this.processData) { - if (this.shouldSkipItem(typeName, types, data)) { + if (this.skipItemByType(typeName, types, data, libId)) { continue; } if (tid !== undefined && tid !== data.tid) { @@ -942,6 +942,43 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { this.functionPieChart(); } + private skipItemByType(typeName: string, types: Array, data: any, libId: number) { + if (typeName === TYPE_ALLOC_STRING) { + // @ts-ignore + if (!types.includes(data.type) || data.libId !== libId) { + return true; + } + } else if (typeName === TYPE_MAP_STRING) { + if (this.isStatistic) { + if (data.subType) { + // @ts-ignore + if (!types.includes(data.subType) || !types.includes(data.type) || data.libId !== libId) { + return true; + } + } else { + return true; + } + } else { + if (!data.subType) { + // @ts-ignore + if (!types.includes(data.type) || data.libId !== libId) { + return true; + } + } else { + return true; + } + } + } else { + if (data.subType) { + // @ts-ignore + if (!types.includes(data.subType) || !types.includes(data.type) || data.libId !== libId) { + return true; + } + } else { + return true; + } + } + } private baseSort(data: Array): void { if (data === this.functionData) { this.functionData.sort((a, b) => b.existSize - a.existSize); @@ -950,7 +987,6 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { this.currentLevel = 3; this.progressEL!.loading = false; } - ; if (data === this.soData) { this.soData.sort((a, b) => b.existSize - a.existSize); this.libStatisticsData = this.totalData(this.libStatisticsData); @@ -1239,8 +1275,10 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { return sortColumnArr; } - - private caseTableName(statisticAnalysisLeftData: { tableName: number; }, statisticAnalysisRightData: { tableName: number; }): number { + private caseTableName( + statisticAnalysisLeftData: { tableName: number }, + statisticAnalysisRightData: { tableName: number } + ): number { if (this.nmSortType === 1) { if (statisticAnalysisLeftData.tableName > statisticAnalysisRightData.tableName) { return 1; diff --git a/ide/src/trace/component/trace/sheet/task/TabPaneTaskFrames.ts b/ide/src/trace/component/trace/sheet/task/TabPaneTaskFrames.ts index c68d6cd17..5adeeb47a 100644 --- a/ide/src/trace/component/trace/sheet/task/TabPaneTaskFrames.ts +++ b/ide/src/trace/component/trace/sheet/task/TabPaneTaskFrames.ts @@ -73,13 +73,13 @@ export class TabPaneTaskFrames extends BaseElement { let executeStartTime = 0; let returnEndTime = 0; let priorityId = 1; - let executeId = ''; + let relationId = ''; let executeStruct: FuncStruct | undefined = undefined; taskArray.forEach((item) => { if (item.funName!.indexOf(ALLOCATION_TASK) >= 0) { allocationStartTime = item.startTs!; priorityId = TabPaneTaskFrames.getPriorityId(item.funName!); - executeId = TabPaneTaskFrames.getExecuteId(item.funName!); + relationId = TabPaneTaskFrames.getRelationId(item.funName!); } else if (item.funName!.indexOf(PERFORM_TASK) >= 0) { executeStruct = item; executeStartTime = item.startTs!; @@ -94,7 +94,7 @@ export class TabPaneTaskFrames extends BaseElement { let tableList: TaskTabStruct[] = []; this.buildConcurrencyTable(executeStruct!, tableList, framesParam, isClick); } else { - this.buildNoConcurrencyTable(executeId, priorityId, allocationTime, executeTime, returnTime); + this.buildNoConcurrencyTable(relationId, priorityId, allocationTime, executeTime, returnTime); } } } @@ -125,14 +125,14 @@ export class TabPaneTaskFrames extends BaseElement { }); } private buildNoConcurrencyTable( - executeId: string, + relationId: string, priorityId: number, sTime: number, eTime: number, rTime: number ): void { let task: TaskTabStruct = new TaskTabStruct(); - task.executeId = executeId; + task.executeId = relationId; task.taskPriority = Priority[priorityId]; task.taskST = this.getMsTime(sTime); task.taskET = this.getMsTime(eTime); @@ -160,7 +160,7 @@ export class TabPaneTaskFrames extends BaseElement { let tempExecuteTaskIds: number[] = []; for (let index = 0; index < groupsValue.length; index++) { let data = groupsValue[index]; - let executeId = TabPaneTaskFrames.getExecuteId(data.funName!); + let executeId = TabPaneTaskFrames.getRelationId(data.funName!); if (data.funName!.indexOf(PERFORM_TASK) >= 0) { tempExecuteTaskList.push(data); } @@ -217,7 +217,7 @@ export class TabPaneTaskFrames extends BaseElement { Selected range:0.0 ms - 1) { return executeIdMatch[1]; + } else { + executeIdMatch = funName.match(/taskId\s*:\s*(\d+)/i); + if (executeIdMatch && executeIdMatch.length > 1) { + return executeIdMatch[1]; + } } return ''; } diff --git a/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts b/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts index 1d60e4240..3b99e4138 100644 --- a/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts +++ b/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts @@ -131,7 +131,6 @@ export class TabPaneFlag extends BaseElement { */ private eventHandler(): void { let tr = this.panelTable!.shadowRoot!.querySelectorAll('.tr') as NodeListOf; - tr[0].querySelector('#text-input')!.disabled = true; tr[0].querySelector('.removeAll')!.addEventListener('click', () => { this.systemTrace!.flagList = []; let flagList = [...this.flagList]; diff --git a/ide/src/trace/database/ConvertTraceWorker.ts b/ide/src/trace/database/ConvertTraceWorker.ts index 06d6644e1..1307f0970 100644 --- a/ide/src/trace/database/ConvertTraceWorker.ts +++ b/ide/src/trace/database/ConvertTraceWorker.ts @@ -38,6 +38,11 @@ function initConvertWASM() { }); } +function isRawTrace(uint8Array: Uint8Array): boolean { + let rowTraceStr = Array.from(new Uint16Array(uint8Array.buffer.slice(0, 2))); + return rowTraceStr[0] === 57161; +} + const ARRAY_BUF_SIZE = 2 * 1024 * 1024; self.onmessage = async (e: MessageEvent) => { if (e.data.action === 'getConvertData') { @@ -47,16 +52,14 @@ self.onmessage = async (e: MessageEvent) => { let totalSize = fileData.byteLength; let traceInsPtr = convertModule._GetTraceConverterIns(); // 获取TraceConverter 实例 convertModule._SetDebugFlag(false, traceInsPtr); // 设置是否为debug模式 - let uint8Array = new Uint8Array(fileData.slice(0, 8)); // 获取前8个字节,用来判断文件是htrace还是raw trace - let enc = new TextDecoder(); - let headerStr = enc.decode(uint8Array); let currentPosition = 1024; let dataHeader = convertModule._malloc(1100); let traceAllData = new Uint8Array(e.data.buffer); - if (headerStr.indexOf('OHOSPROF') === 0) { - handleHTrace(fileData, dataHeader, traceInsPtr); + let isRawTraceConvert = isRawTrace(e.data); + if (isRawTraceConvert) { + [totalSize, currentPosition] = handleRowTrace(e, fileData, dataHeader, traceInsPtr, currentPosition, traceAllData, totalSize); } else { - handleRowTrace(e, fileData, dataHeader, traceInsPtr, currentPosition, traceAllData, totalSize); + handleHTrace(fileData, dataHeader, traceInsPtr); } let dataPtr = convertModule._malloc(stepSize); let arrayBufferPtr = convertModule._malloc(ARRAY_BUF_SIZE); @@ -70,7 +73,7 @@ self.onmessage = async (e: MessageEvent) => { }; let bodyFn = convertModule.addFunction(callback, 'vii'); convertModule._SetCallback(bodyFn, traceInsPtr); - convertData(currentPosition, traceAllData, arrayBufferPtr, dataPtr, traceInsPtr, headerStr, stepSize, totalSize); + convertData(currentPosition, traceAllData, arrayBufferPtr, dataPtr, traceInsPtr, isRawTraceConvert, stepSize, totalSize); convertModule._GetRemainingData(traceInsPtr); let headerData: string[] = []; let headerCallback = (heapPtr: number, size: number) => { @@ -89,11 +92,13 @@ self.onmessage = async (e: MessageEvent) => { postMessage(e, allDataStr); } }; + function handleHTrace(fileData: Array, dataHeader: any, traceInsPtr: any) { let uint8Array = new Uint8Array(fileData.slice(0, 1024)); convertModule.HEAPU8.set(uint8Array, dataHeader); convertModule._SendFileHeader(dataHeader, 1024, traceInsPtr); } + function handleRowTrace( e: MessageEvent, fileData: Array, @@ -102,18 +107,17 @@ function handleRowTrace( currentPosition: number, traceAllData: Uint8Array, totalSize: number -): void { +): [number, number] { let uint8Array = new Uint8Array(fileData.slice(0, 12)); convertModule.HEAPU8.set(uint8Array, dataHeader); convertModule._SendRawFileHeader(dataHeader, 12, traceInsPtr); currentPosition = 12; let allRowTraceData = new Uint8Array(e.data.buffer); let commonDataOffsetList: Array<{ - startOffset: number; - endOffset: number; + startOffset: number + endOffset: number }> = []; - let commonTotalLength = 0; - setCommonDataOffsetList(e, allRowTraceData, commonTotalLength, commonDataOffsetList); + let commonTotalLength = setCommonDataOffsetList(e, allRowTraceData, commonDataOffsetList); let commonTotalOffset = 0; let commonTotalData = new Uint8Array(commonTotalLength); commonDataOffsetList.forEach((item) => { @@ -125,13 +129,15 @@ function handleRowTrace( traceAllData.set(commonTotalData, currentPosition); traceAllData.set(allRowTraceData.slice(currentPosition), commonTotalData.length + currentPosition); totalSize += commonTotalData.length; + return [totalSize, currentPosition]; } + function setCommonDataOffsetList( e: MessageEvent, allRowTraceData: Uint8Array, - commonTotalLength: number, commonDataOffsetList: Array -): void { +): number { + let commonTotalLength: number = 0; let commonOffset = 12; let tlvTypeLength = 4; while (commonOffset < allRowTraceData.length) { @@ -152,14 +158,16 @@ function setCommonDataOffsetList( commonDataOffsetList.push(commonDataOffset); } } + return commonTotalLength; } + function convertData( currentPosition: number, traceAllData: Uint8Array, arrayBufferPtr: any, dataPtr: any, traceInsPtr: any, - headerStr: string, + isRawTraceConvert: boolean = false, stepSize: number, totalSize: number ): void { @@ -180,12 +188,10 @@ function convertData( let subArrayBuffer = convertModule.HEAPU8.subarray(blockPtr, blockPtr + blockSize); convertModule.HEAPU8.set(subArrayBuffer, arrayBufferPtr); // 调用分片转换接口 - if (headerStr.indexOf('OHOSPROF') === 0) { - // htrace - convertModule._ConvertBlockData(arrayBufferPtr, subArrayBuffer.length, traceInsPtr); + if (isRawTraceConvert) { + convertModule._ConvertRawBlockData(arrayBufferPtr, subArrayBuffer.length, traceInsPtr); // raw trace } else { - // raw trace - convertModule._ConvertRawBlockData(arrayBufferPtr, subArrayBuffer.length, traceInsPtr); + convertModule._ConvertBlockData(arrayBufferPtr, subArrayBuffer.length, traceInsPtr); // htrace } processedLen = processedLen + blockSize; blockPtr = dataPtr + processedLen; @@ -194,13 +200,14 @@ function convertData( currentPosition = endPosition; } } + function postMessage(e: MessageEvent, allDataStr: Array): void { self.postMessage( { id: e.data.id, action: 'convert', status: true, - results: new Blob(allDataStr, { type: 'text/plain' }), + results: new Blob(allDataStr, {type: 'text/plain'}), buffer: e.data.buffer, }, // @ts-ignore diff --git a/ide/src/trace/database/TraceWorker.ts b/ide/src/trace/database/TraceWorker.ts index 4d715a4b1..119d8dd70 100644 --- a/ide/src/trace/database/TraceWorker.ts +++ b/ide/src/trace/database/TraceWorker.ts @@ -369,8 +369,7 @@ self.onmessage = async (e: MessageEvent) => { } let wrSize = 0; let r2 = -1; - let rowTraceStr = Array.from(new Uint16Array(e.data.buffer.slice(0, 2))); - if (rowTraceStr[0] === 57161) { + if (isRawTrace(e.data)) { let commonDataOffsetList: Array<{ startOffset: number; endOffset: number; @@ -1052,18 +1051,60 @@ enum FileTypeEnum { json, } +function isRawTrace(uint8Array: Uint8Array): boolean { + let rowTraceStr = Array.from(new Uint16Array(uint8Array.buffer.slice(0, 2))); + return rowTraceStr[0] === 57161; +} + function cutFileBufferByOffSet(out: Uint8Array, uint8Array: Uint8Array) { let jsonStr: string = dec.decode(out); let jsonObj = JSON.parse(jsonStr); - let valueArray: Array<{ offset: number; size: number }> = jsonObj.value; - const sum = valueArray.reduce((total, obj) => total + obj.size, 0); - let cutBuffer = new Uint8Array(sum); - let offset = 0; - valueArray.forEach((item, index) => { - const dataSlice = uint8Array.subarray(item.offset, item.offset + item.size); - cutBuffer.set(dataSlice, offset); - offset += item.size; - }); + let valueArray: Array<{ type: number; offset: number; size: number }> = jsonObj.value; + let cutBuffer: Uint8Array; + if (isRawTrace(uint8Array)) { + let commDataSize = 0; + let otherDataSize = 0; + valueArray.forEach(item => { + const type = item.type; + if (type === 0) { + commDataSize += item.size; + } else { + otherDataSize += item.size; + otherDataSize += 8; + } + }); + cutBuffer = new Uint8Array(commDataSize + otherDataSize); + let commOffset = 0; + let tlvOffset = commDataSize; + valueArray.forEach((item) => { + if (item.type !== 0) { + let typeArray = new Uint32Array(1); + typeArray[0] = item.type; + cutBuffer.set(new Uint8Array(typeArray.buffer), tlvOffset); + tlvOffset += typeArray.byteLength; + let lengthArray = new Uint32Array(1); + lengthArray[0] = item.size; + cutBuffer.set(new Uint8Array(lengthArray.buffer), tlvOffset); + tlvOffset += typeArray.byteLength; + const dataSlice = uint8Array.subarray(item.offset, item.offset + item.size); + cutBuffer.set(dataSlice, tlvOffset); + tlvOffset += item.size; + } else { + const dataSlice = uint8Array.subarray(item.offset, item.offset + item.size); + cutBuffer.set(dataSlice, commOffset); + commOffset += item.size; + } + }); + } else { + const sum = valueArray.reduce((total, obj) => total + obj.size, 0); + cutBuffer = new Uint8Array(sum); + let offset = 0; + valueArray.forEach((item, index) => { + const dataSlice = uint8Array.subarray(item.offset, item.offset + item.size); + cutBuffer.set(dataSlice, offset); + offset += item.size; + }); + } return cutBuffer; } diff --git a/ide/src/trace/database/data-trafic/EnergySysEventReceiver.ts b/ide/src/trace/database/data-trafic/EnergySysEventReceiver.ts index 12742de59..bfcee83ba 100644 --- a/ide/src/trace/database/data-trafic/EnergySysEventReceiver.ts +++ b/ide/src/trace/database/data-trafic/EnergySysEventReceiver.ts @@ -91,7 +91,7 @@ export const queryPowerValueSql = (args: any): string => { ORDER BY eventName;`; }; -export const queryStateDataMemSql = (args: any): string => { +export const queryStateDataSql = (args: any): string => { return ` select S.id, S.ts - ${args.recordStartNS} as startNs, @@ -107,25 +107,6 @@ export const queryStateDataMemSql = (args: any): string => { group by S.serial, APP.app_key, D.data, D2.data;`; }; -export const queryStateDataSql = (args: any): string => { - return ` - select S.id, - S.ts - ${args.recordStartNS} as startNs, - D.data as eventName, - D2.data as appKey, - S.int_value as eventValue, - (S.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)}) + (S.int_value * ${args.width}) AS px - from hisys_event_measure as S - left join data_dict as D on D.id = S.name_id - left join app_name as APP on APP.id = S.key_id - left join data_dict as D2 on D2.id = APP.app_key - where (case when 'SENSOR_STATE'== '${args.eventName}' then D.data like '%SENSOR%' else D.data = '${args.eventName}' end) - and D2.data in ('BRIGHTNESS', 'STATE', 'VALUE', 'LEVEL', 'VOLUME', 'OPER_TYPE', 'VOLUME') - and (S.ts - ${args.recordStartNS}) >= ${Math.floor(args.startNS)} - and (S.ts - ${args.recordStartNS}) <= ${Math.floor(args.endNS)} - group by S.serial, APP.app_key, D.data, D2.data, px;`; -}; - export const queryStateProtoDataSql = (args: any): string => { return ` SELECT S.id, @@ -191,7 +172,7 @@ export function hiSysEnergyStateReceiver(data: any, proc: Function): void { if (data.params.trafic === TraficEnum.Memory) { let res: any[], list: any[]; if (!energyList.has(data.params.eventName)) { - list = proc(queryStateDataMemSql(data.params)); + list = proc(queryStateDataSql(data.params)); energyList.set(data.params.eventName, list); } else { list = energyList.get(data.params.eventName) || []; diff --git a/ide/src/trace/database/sql/Perf.sql.ts b/ide/src/trace/database/sql/Perf.sql.ts index c8cb8a3d6..6de015a83 100644 --- a/ide/src/trace/database/sql/Perf.sql.ts +++ b/ide/src/trace/database/sql/Perf.sql.ts @@ -437,14 +437,14 @@ export const queryConcurrencyTask = ( task_pool.allocation_task_row AS allocationTaskRow, task_pool.execute_task_row AS executeTaskRow, task_pool.return_task_row AS returnTaskRow, - task_pool.execute_id AS executeId + task_pool.task_id AS executeId FROM thread LEFT JOIN callstack ON thread.id = callstack.callid LEFT JOIN task_pool ON callstack.id = task_pool.execute_task_row WHERE ipid in (SELECT thread.ipid FROM thread WHERE thread.itid = $itid) - AND thread.name = 'TaskWorkThread' + AND thread.name LIKE '%TaskWork%' AND callstack.name LIKE 'H:Task Perform:%' AND -- 左包含 (($selectStartTime <= callstack.ts AND $selectEndTime > callstack.ts) diff --git a/ide/src/trace/database/sql/ProcessThread.sql.ts b/ide/src/trace/database/sql/ProcessThread.sql.ts index 242f32661..21a93e502 100644 --- a/ide/src/trace/database/sql/ProcessThread.sql.ts +++ b/ide/src/trace/database/sql/ProcessThread.sql.ts @@ -1273,7 +1273,7 @@ export const queryBySelectExecute = ( FROM task_pool LEFT JOIN callstack ON callstack.id = task_pool.allocation_task_row LEFT JOIN thread ON thread.id = callstack.callid - WHERE task_pool.execute_id = $executeId AND task_pool.execute_itid = $itid; + WHERE task_pool.task_id = $executeId AND task_pool.execute_itid = $itid; `; return query('queryBySelectExecute', sqlStr, { $executeId: executeId, $itid: itid }); }; diff --git a/ide/src/trace/database/sql/SqlLite.sql.ts b/ide/src/trace/database/sql/SqlLite.sql.ts index 515561dc2..199ab5c14 100644 --- a/ide/src/trace/database/sql/SqlLite.sql.ts +++ b/ide/src/trace/database/sql/SqlLite.sql.ts @@ -1083,7 +1083,7 @@ export const queryBySelectAllocationOrReturn = ( FROM task_pool LEFT JOIN callstack ON callstack.id = task_pool.execute_task_row LEFT JOIN thread ON thread.id = callstack.callid - WHERE task_pool.execute_task_row IS NOT NULL AND task_pool.execute_id = $executeId + WHERE task_pool.execute_task_row IS NOT NULL AND task_pool.task_id = $executeId AND task_pool.allocation_itid = $itid; `; return query('queryBySelectAllocationOrReturn', sqlStr, { $executeId: executeId, $itid: itid }); @@ -1098,12 +1098,12 @@ export const queryTaskListByExecuteTaskIds = ( task_pool.allocation_task_row AS allocationTaskRow, task_pool.execute_task_row AS executeTaskRow, task_pool.return_task_row AS returnTaskRow, - task_pool.execute_id AS executeId, + task_pool.task_id AS executeId, task_pool.priority FROM task_pool LEFT JOIN callstack ON callstack.id = task_pool.allocation_task_row LEFT JOIN thread ON thread.id = callstack.callid - WHERE task_pool.execute_id IN (${executeTaskIds.join(',')}) + WHERE task_pool.task_id IN (${executeTaskIds.join(',')}) AND thread.ipid = $ipid AND task_pool.execute_task_row IS NOT NULL; `; @@ -1124,7 +1124,7 @@ export const queryTaskPoolTotalNum = (itid: number) => WHERE ipid in (SELECT thread.ipid FROM thread WHERE thread.itid = $itid) - AND thread.name = 'TaskWorkThread' + AND thread.name LIKE '%TaskWork%' GROUP BY thread.tid;`, { $itid: itid } ); diff --git a/trace_streamer/build.sh b/trace_streamer/build.sh index d34c26cbf..618070920 100755 --- a/trace_streamer/build.sh +++ b/trace_streamer/build.sh @@ -58,7 +58,7 @@ if [ $target_os == "windows" ];then else cp .gn_unix .gn fi -if [ "$1" == "windows" ];then +if [ "$1" == "windows" ] && [ "$2" == "release" ];then echo "gn only support linux and wasm build currently" if [ ! -d "out/windows" ];then mkdir out/windows diff --git a/trace_streamer/build_operator.sh b/trace_streamer/build_operator.sh index a89209786..2967e6ea4 100755 --- a/trace_streamer/build_operator.sh +++ b/trace_streamer/build_operator.sh @@ -83,6 +83,6 @@ else prebuilts/"$gn_path"/"$ninja" -C "$out_dir" fi -if [ "$target_os" == "macx" ];then +if [ "$out_dir" == "macx" ];then ./mac_depend.sh fi \ No newline at end of file diff --git a/trace_streamer/gn/BUILD.gn b/trace_streamer/gn/BUILD.gn index 6bb1b5cf8..994d77011 100644 --- a/trace_streamer/gn/BUILD.gn +++ b/trace_streamer/gn/BUILD.gn @@ -61,14 +61,17 @@ config("default") { if (is_debug && is_win) { ldflags += [ "-fstack-protector" ] } - if (is_debug && is_linux && !use_wasm) { - cflags += [ - "-g", - "-fno-omit-frame-pointer", - "-fstandalone-debug", - ] - ldflags += [ "-fsanitize=address" ] + if (is_debug && !use_wasm) { + cflags += [ "-g" ] + if (is_linux) { + cflags += [ + "-fno-omit-frame-pointer", + "-fstandalone-debug", + ] + ldflags += [ "-fsanitize=address" ] + } } + if (target_os == "windows") { cflags += [ "-D target_cpu_x86_64" ] } else if (is_linux || is_mac) { diff --git a/trace_streamer/prebuilts/patch_googletest/googletestbuild.gn b/trace_streamer/prebuilts/patch_googletest/googletestbuild.gn index 783cf254e..2e1320774 100644 --- a/trace_streamer/prebuilts/patch_googletest/googletestbuild.gn +++ b/trace_streamer/prebuilts/patch_googletest/googletestbuild.gn @@ -41,6 +41,7 @@ static_library("gtest") { "-Wno-missing-noreturn", ] sources = [ + "googletest/include/gtest/gtest-assertion-result.h", "googletest/include/gtest/gtest-death-test.h", "googletest/include/gtest/gtest-message.h", "googletest/include/gtest/gtest-param-test.h", @@ -48,7 +49,6 @@ static_library("gtest") { "googletest/include/gtest/gtest-test-part.h", "googletest/include/gtest/gtest-typed-test.h", "googletest/include/gtest/gtest_pred_impl.h", - "googletest/include/gtest/gtest-assertion-result.h", "googletest/include/gtest/gtest_prod.h", "googletest/include/gtest/hwext/gtest-ext.h", "googletest/include/gtest/hwext/gtest-filter.h", @@ -69,6 +69,7 @@ static_library("gtest") { "googletest/include/gtest/internal/gtest-tuple.h", "googletest/include/gtest/internal/gtest-type-util.h", "googletest/src/gtest-all.cc", + "googletest/src/gtest-assertion-result.cc", "googletest/src/gtest-death-test.cc", "googletest/src/gtest-filepath.cc", "googletest/src/gtest-internal-inl.h", @@ -77,7 +78,6 @@ static_library("gtest") { "googletest/src/gtest-test-part.cc", "googletest/src/gtest-typed-test.cc", "googletest/src/gtest.cc", - "googletest/src/gtest-assertion-result.cc", "googletest/src/hwext/gtest-ext.cc", "googletest/src/hwext/gtest-filter.cc", "googletest/src/hwext/gtest-tag.cc", diff --git a/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_BUILD.gn b/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_BUILD.gn index ec2579aaf..8e94adbb3 100644 --- a/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_BUILD.gn +++ b/trace_streamer/prebuilts/patch_hiperf/hiviewdfx_BUILD.gn @@ -56,7 +56,7 @@ ohos_source_set("hiviewdfx_source") { "${THIRD_PARTY}/perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_mmap.cpp", "${THIRD_PARTY}/perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_symbols.cpp", ] - if (is_debug) { + if (is_debug && is_linux) { sources += [ "${THIRD_PARTY}/perf_include/hiviewdfx/faultloggerd/interfaces/innerkits/unwinder/dfx_accessors.cpp" ] } } diff --git a/trace_streamer/src/base/index_map.h b/trace_streamer/src/base/index_map.h index bdf470cee..3bedee702 100644 --- a/trace_streamer/src/base/index_map.h +++ b/trace_streamer/src/base/index_map.h @@ -82,44 +82,36 @@ public: PrepMixRange(remove); switch (op) { case SQLITE_INDEX_CONSTRAINT_EQ: - ProcessData( - dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] != value; }, - [&](TableRowId id) -> bool { return dataQueue[id] == value; }); + ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] != value; }, + [&](TableRowId id) -> bool { return dataQueue[id] == value; }); break; case SQLITE_INDEX_CONSTRAINT_NE: - ProcessData( - dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] == value; }, - [&](TableRowId id) -> bool { return dataQueue[id] != value; }); + ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] == value; }, + [&](TableRowId id) -> bool { return dataQueue[id] != value; }); break; case SQLITE_INDEX_CONSTRAINT_ISNULL: - ProcessData( - dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] != invalidValue; }, - [&](TableRowId id) -> bool { return dataQueue[id] == invalidValue; }); + ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] != invalidValue; }, + [&](TableRowId id) -> bool { return dataQueue[id] == invalidValue; }); break; case SQLITE_INDEX_CONSTRAINT_ISNOTNULL: - ProcessData( - dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] == invalidValue; }, - [&](TableRowId id) -> bool { return dataQueue[id] != invalidValue; }); + ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] == invalidValue; }, + [&](TableRowId id) -> bool { return dataQueue[id] != invalidValue; }); break; case SQLITE_INDEX_CONSTRAINT_GT: - ProcessData( - dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] <= value; }, - [&](TableRowId id) -> bool { return dataQueue[id] > value; }); + ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] <= value; }, + [&](TableRowId id) -> bool { return dataQueue[id] > value; }); break; case SQLITE_INDEX_CONSTRAINT_GE: - ProcessData( - dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] < value; }, - [&](TableRowId id) -> bool { return dataQueue[id] >= value; }); + ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] < value; }, + [&](TableRowId id) -> bool { return dataQueue[id] >= value; }); break; case SQLITE_INDEX_CONSTRAINT_LE: - ProcessData( - dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] > value; }, - [&](TableRowId id) -> bool { return dataQueue[id] <= value; }); + ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] > value; }, + [&](TableRowId id) -> bool { return dataQueue[id] <= value; }); break; case SQLITE_INDEX_CONSTRAINT_LT: - ProcessData( - dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] >= value; }, - [&](TableRowId id) -> bool { return dataQueue[id] < value; }); + ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] >= value; }, + [&](TableRowId id) -> bool { return dataQueue[id] < value; }); break; default: break; diff --git a/trace_streamer/src/filter/cpu_filter.cpp b/trace_streamer/src/filter/cpu_filter.cpp index 38bdb6e53..3176043b9 100644 --- a/trace_streamer/src/filter/cpu_filter.cpp +++ b/trace_streamer/src/filter/cpu_filter.cpp @@ -68,8 +68,10 @@ void CpuFilter::ProcPrevPidSwitchEvent(uint64_t ts, auto lastCpu = traceDataCache_->GetConstThreadStateData().CpusData()[lastRow]; auto lastState = traceDataCache_->GetConstThreadStateData().StatesData()[lastRow]; auto lastStartTs = traceDataCache_->GetConstThreadStateData().TimeStampData()[lastRow]; - if ((cpu != lastCpu) && (lastState == TASK_RUNNING) && (ts == lastStartTs)) { - isChangeCpu = true; + if ((cpu != lastCpu) && (lastState == TASK_RUNNING)) { + if (traceDataCache_->HMKernelTraceEnabled() || (ts == lastStartTs)) { + isChangeCpu = true; + } } if (!isChangeCpu) { CheckWakeupEvent(prevPid); diff --git a/trace_streamer/src/filter/native_hook_filter.cpp b/trace_streamer/src/filter/native_hook_filter.cpp index 7c556417b..a24a8c0d5 100644 --- a/trace_streamer/src/filter/native_hook_filter.cpp +++ b/trace_streamer/src/filter/native_hook_filter.cpp @@ -25,7 +25,8 @@ NativeHookFilter::NativeHookFilter(TraceDataCache* dataCache, const TraceStreame hookPluginData_(std::make_unique()), ipidToSymIdToSymIndex_(INVALID_UINT64), ipidToFilePathIdToFileIndex_(INVALID_UINT64), - ipidToFrameIdToFrameBytes_(nullptr) + ipidToFrameIdToFrameBytes_(nullptr), + stackIdToFramesMapIdAndIdDown_(nullptr) { invalidLibPathIndexs_.insert(traceDataCache_->dataDict_.GetStringIndex("/system/lib/libc++.so")); invalidLibPathIndexs_.insert(traceDataCache_->dataDict_.GetStringIndex("/system/lib64/libc++.so")); @@ -65,7 +66,11 @@ void NativeHookFilter::ParseConfigInfo(ProtoReader::BytesView& protoData) } return; } -void NativeHookFilter::AppendStackMaps(uint32_t ipid, uint32_t stackid, std::vector& frames) +void NativeHookFilter::AppendStackMaps( + uint32_t ipid, + uint32_t stackid, + std::vector& frames, + std::map>>& frameIdAndIdDownInfo) { uint64_t ipidWithStackIdIndex = 0; // the last element is ipid for this batch of frames/ips @@ -81,6 +86,13 @@ void NativeHookFilter::AppendStackMaps(uint32_t ipid, uint32_t stackid, std::vec // allStackIdToFramesMap_ save all offline symbolic call stack if (isOfflineSymbolizationMode_) { allStackIdToFramesMap_.emplace(std::make_pair(ipidWithStackIdIndex, framesSharedPtr)); + if (frameIdAndIdDownInfo.size()) { + for (auto frameIdAndIdItor = frameIdAndIdDownInfo.begin(); frameIdAndIdItor != frameIdAndIdDownInfo.end(); + frameIdAndIdItor++) { + stackIdToFramesMapIdAndIdDown_.Insert(ipidWithStackIdIndex, frameIdAndIdItor->first, + std::move(frameIdAndIdItor->second)); + } + } } } void NativeHookFilter::AppendFrameMaps(uint32_t ipid, uint32_t frameMapId, const ProtoReader::BytesView& bytesView) @@ -606,6 +618,36 @@ std::tuple NativeHookFilter::GetNeedUpdateProcessMapsAddrRan return std::make_tuple(start, end); } +// Offline Symbolization Analysis of Virtual Stacks +void NativeHookFilter::ParseOfflineSymbolVirtualStacks(uint64_t curStackId, + uint64_t curPid, + uint16_t& depth, + uint32_t frameMapIdLoc) +{ + if (isOfflineSymbolizationMode_ && !stackIdToFramesMapIdAndIdDown_.Empty()) { + // Only for offline symbolization of stackmap, containing frame_map_id and frame_map_id_down + auto frameMapId = stackIdToFramesMapIdAndIdDown_.Find(curStackId, frameMapIdLoc); + if (nullptr == frameMapId) { + TS_LOGE("Can not find frame_map_id or frame_map_id_down!!!"); + } else { + for (auto frameIdsItor = frameMapId->begin(); frameIdsItor != frameMapId->end(); frameIdsItor++) { + auto frameBytesPtr = ipidToFrameIdToFrameBytes_.Find(curPid, *frameIdsItor); + if (frameBytesPtr == nullptr) { + TS_LOGE("Can not find Frame by frame_map_id or frame_map_id_down!!!"); + continue; + } + ProtoReader::Frame_Reader reader(*frameBytesPtr); + if (!reader.has_symbol_name()) { + TS_LOGE("Data exception, frames should has symbol_name_name!!!"); + continue; + } + auto symbolIndex = traceDataCache_->dataDict_.GetStringIndex(reader.symbol_name().ToStdString()); + traceDataCache_->GetNativeHookFrameData()->AppendNewNativeHookFrame( + callChainId_, depth++, reader.ip(), symbolIndex, MAX_UINT64, MAX_UINT64, MAX_UINT64, "", 0); + } + } + } +} void NativeHookFilter::FillOfflineSymbolizationFrames( std::map>>::iterator mapItor) { @@ -616,6 +658,7 @@ void NativeHookFilter::FillOfflineSymbolizationFrames( if (isSingleProcData_) { curCacheIpid = SINGLE_PROC_IPID; } + ParseOfflineSymbolVirtualStacks(mapItor->first, curCacheIpid, depth, 0); uint64_t filePathIndex; for (auto itor = framesInfo->rbegin(); itor != framesInfo->rend(); itor++) { // Note that the filePathId here is provided for the end side. Not a true TS internal index dictionary. @@ -628,6 +671,7 @@ void NativeHookFilter::FillOfflineSymbolizationFrames( frameInfo->symbolOffset_, vaddr); UpdateFilePathIndexToCallStackRowMap(row, filePathIndex); } + ParseOfflineSymbolVirtualStacks(mapItor->first, curCacheIpid, depth, 1); } void NativeHookFilter::ReparseStacksWithDifferentMeans() diff --git a/trace_streamer/src/filter/native_hook_filter.h b/trace_streamer/src/filter/native_hook_filter.h index 1e9be7324..57dcb614f 100644 --- a/trace_streamer/src/filter/native_hook_filter.h +++ b/trace_streamer/src/filter/native_hook_filter.h @@ -25,6 +25,7 @@ namespace SysTuning { namespace TraceStreamer { constexpr uint64_t IP_BIT_OPERATION = 0xFFFFFFFFFF; +constexpr uint64_t MAX_UINT64 = std::numeric_limits::max(); using namespace OHOS::Developtools::HiPerf; class NativeHookFrameInfo { public: @@ -73,7 +74,10 @@ public: public: void MaybeParseNativeHookMainEvent(uint64_t timeStamp, std::unique_ptr nativeHookMetaData); void ParseConfigInfo(ProtoReader::BytesView& protoData); - void AppendStackMaps(uint32_t ipid, uint32_t stackid, std::vector& frames); + void AppendStackMaps(uint32_t ipid, + uint32_t stackid, + std::vector& frames, + std::map>>& frameIdAndIdDownInfo); void AppendFrameMaps(uint32_t ipid, uint32_t frameMapId, const ProtoReader::BytesView& bytesView); void AppendFilePathMaps(uint32_t ipid, uint32_t filePathId, uint64_t fileIndex); void AppendSymbolMap(uint32_t ipid, uint32_t symId, uint64_t symbolIndex); @@ -91,6 +95,11 @@ public: return isSingleProcData_; } + bool GetOfflineSymbolizationMode() + { + return isOfflineSymbolizationMode_; + } + private: void ProcSymbolTable(uint32_t ipid, uint32_t filePathId, std::shared_ptr reader); void FilterNativeHookMainEvent(size_t num); @@ -121,6 +130,7 @@ private: void UpdateSymbolIdsForCallChainIdLastCallStack(size_t index); void UpdateSymbolIdsForFilePathIndexFailedInvalid(size_t index); void UpdateSymbolIdsForSymbolizationFailed(); + void ParseOfflineSymbolVirtualStacks(uint64_t curStackId, uint64_t curPid, uint16_t& depth, uint32_t frameMapIdLoc); void ParseFramesInOfflineSymbolizationMode(); void ParseFramesInCallStackCompressedMode(); void ParseFramesWithOutCallStackCompressedMode(); @@ -158,6 +168,8 @@ private: {}; std::map>> allStackIdToFramesMap_ = {}; std::map>> stackIdToFramesMap_ = {}; + // first key is stackId, second key is framemap_id_loc, value is set framemap_id/framemap_down + DoubleMap>> stackIdToFramesMapIdAndIdDown_; std::map callChainIdToStackHashValueMap_ = {}; std::unordered_map> stackHashValueToFramesHashMap_ = {}; std::unordered_map> frameHashToFrameInfoMap_ = {}; diff --git a/trace_streamer/src/filter/task_pool_filter.cpp b/trace_streamer/src/filter/task_pool_filter.cpp index c4fa46893..58e16f4f1 100644 --- a/trace_streamer/src/filter/task_pool_filter.cpp +++ b/trace_streamer/src/filter/task_pool_filter.cpp @@ -38,7 +38,7 @@ uint32_t TaskPoolFilter::GetIpId(uint32_t index) return thread->internalPid_; } -uint32_t TaskPoolFilter::CheckTheSameTask(uint32_t executeId, uint32_t index) +uint32_t TaskPoolFilter::CheckTheSameTask(uint64_t executeId, uint32_t index) { return IpidExecuteMap_.Find(GetIpId(index), executeId); } @@ -51,9 +51,9 @@ void TaskPoolFilter::TaskPoolFieldSegmentation(const std::string& taskPoolStr, std::string value; for (base::PartingString inner(ss.GetCur(), ':'); inner.Next();) { if (key.empty()) { - key = inner.GetCur(); + key = TrimInvisibleCharacters(inner.GetCur()); } else { - value = inner.GetCur(); + value = TrimInvisibleCharacters(inner.GetCur()); } } args.emplace(std::move(key), std::move(value)); @@ -85,22 +85,32 @@ bool TaskPoolFilter::TaskPoolEvent(const std::string& taskPoolStr, uint32_t inde } return false; } - +// The old business is run in three phases by associating the application with the executeId,New business runs in three +// phases by associating an application with the taskid +auto TaskPoolFilter::GetExecuteIdOrTaskId(const std::unordered_map& args) +{ + std::optional id; + if (args.find("executeId") != args.end()) { + id = base::StrToInt(args.at("executeId")); + } else { + id = base::StrToInt(args.at("taskId")); + } + return id; +} bool TaskPoolFilter::UpdateAssignData(const std::unordered_map& args, uint32_t index) { if (index >= traceDataCache_->GetConstInternalSlicesData().CallIds().size()) { return false; } auto allocItid = traceDataCache_->GetConstInternalSlicesData().CallIds()[index]; - auto executeId = base::StrToInt(args.at(" executeId ")); - auto priority = base::StrToInt(args.at(" priority ")); - auto executeState = base::StrToInt(args.at(" executeState ")); - - uint32_t returnValue = CheckTheSameTask(executeId.value(), index); + auto priority = base::StrToInt(args.at("priority")); + auto executeState = base::StrToInt(args.at("executeState")); + auto id = GetExecuteIdOrTaskId(args); + uint32_t returnValue = CheckTheSameTask(id.value(), index); if (returnValue == INVALID_INT32) { uint32_t taskIndex = traceDataCache_->GetTaskPoolData()->AppendAllocationTaskData( - index, allocItid, executeId.value(), priority.value(), executeState.value()); - IpidExecuteMap_.Insert(GetIpId(index), executeId.value(), taskIndex); + index, allocItid, id.value(), priority.value(), executeState.value()); + IpidExecuteMap_.Insert(GetIpId(index), id.value(), taskIndex); } else { traceDataCache_->GetTaskPoolData()->UpdateAllocationTaskData(returnValue, index, allocItid, priority.value(), executeState.value()); @@ -114,13 +124,11 @@ bool TaskPoolFilter::UpdateExecuteData(const std::unordered_mapGetConstInternalSlicesData().CallIds()[index]; - auto executeId = base::StrToInt(args.at(" executeId ")); - - uint32_t returnValue = CheckTheSameTask(executeId.value(), index); + auto id = GetExecuteIdOrTaskId(args); + uint32_t returnValue = CheckTheSameTask(id.value(), index); if (returnValue == INVALID_INT32) { - uint32_t taskIndex = - traceDataCache_->GetTaskPoolData()->AppendExecuteTaskData(index, executeItid, executeId.value()); - IpidExecuteMap_.Insert(GetIpId(index), executeId.value(), taskIndex); + uint32_t taskIndex = traceDataCache_->GetTaskPoolData()->AppendExecuteTaskData(index, executeItid, id.value()); + IpidExecuteMap_.Insert(GetIpId(index), id.value(), taskIndex); timeoutMap_.emplace(executeItid, taskIndex); if (timeoutMap_.at(executeItid) < taskIndex) { timeoutMap_.at(executeItid) = taskIndex; @@ -141,15 +149,14 @@ bool TaskPoolFilter::UpdateReturnData(const std::unordered_mapGetConstInternalSlicesData().CallIds()[index]; - auto executeId = base::StrToInt(args.at(" executeId ")); - auto returnStr_ = std::string_view(args.at(" performResult ")); - uint32_t returnState = returnStr_.compare(" Successful") ? 0 : 1; - - uint32_t returnValue = CheckTheSameTask(executeId.value(), index); + auto id = GetExecuteIdOrTaskId(args); + auto returnStr_ = std::string_view(args.at("performResult")); + uint32_t returnState = returnStr_.compare("Successful") ? 0 : 1; + uint32_t returnValue = CheckTheSameTask(id.value(), index); if (returnValue == INVALID_INT32) { uint32_t taskIndex = - traceDataCache_->GetTaskPoolData()->AppendReturnTaskData(index, returnItid, executeId.value(), returnState); - IpidExecuteMap_.Insert(GetIpId(index), executeId.value(), taskIndex); + traceDataCache_->GetTaskPoolData()->AppendReturnTaskData(index, returnItid, id.value(), returnState); + IpidExecuteMap_.Insert(GetIpId(index), id.value(), taskIndex); } else { traceDataCache_->GetTaskPoolData()->UpdateReturnTaskData(returnValue, index, returnItid, returnState); } diff --git a/trace_streamer/src/filter/task_pool_filter.h b/trace_streamer/src/filter/task_pool_filter.h index 1612ef092..d4b78e74a 100644 --- a/trace_streamer/src/filter/task_pool_filter.h +++ b/trace_streamer/src/filter/task_pool_filter.h @@ -35,7 +35,7 @@ public: TaskPoolFilter& operator=(const TaskPoolFilter&) = delete; ~TaskPoolFilter() override; uint32_t GetIpId(uint32_t index); - uint32_t CheckTheSameTask(uint32_t executeId, uint32_t index); + uint32_t CheckTheSameTask(uint64_t executeId, uint32_t index); bool TaskPoolEvent(const std::string& taskPoolStr, uint32_t index); void TaskPoolFieldSegmentation(const std::string& taskPoolStr, std::unordered_map& args); bool UpdateAssignData(const std::unordered_map& args, uint32_t index); @@ -44,10 +44,11 @@ public: bool AppendTimeoutRow(uint32_t index); private: - const std::string targetStr_ = "H:Task "; - const std::string allocationStr_ = "H:Task Allocation: "; - const std::string executeStr_ = "H:Task Perform: "; - const std::string returnStr_ = "H:Task PerformTask End: "; + auto GetExecuteIdOrTaskId(const std::unordered_map& args); + const std::string targetStr_ = "H:Task"; + const std::string allocationStr_ = "H:Task Allocation:"; + const std::string executeStr_ = "H:Task Perform:"; + const std::string returnStr_ = "H:Task PerformTask End:"; const std::string timeoutStr_ = "H:Thread Timeout Exit"; DoubleMap IpidExecuteMap_; std::unordered_map timeoutMap_; diff --git a/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp b/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp index f866da61b..eb81c8c89 100644 --- a/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp +++ b/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp @@ -707,6 +707,22 @@ bool BytraceEventParser::BinderTransactionAllocBufEvent(const ArgsMap& args, con void BytraceEventParser::ParseDataItem(const BytraceLine& line) { eventList_.push_back(std::make_unique(line.ts, std::move(line))); + size_t maxBuffSize = 1000 * 1000; + size_t maxQueue = 2; + if (eventList_.size() < maxBuffSize * maxQueue) { + return; + } + auto cmp = [](const std::unique_ptr& a, const std::unique_ptr& b) { + return a->eventTimestamp < b->eventTimestamp; + }; + std::stable_sort(eventList_.begin(), eventList_.end(), cmp); + auto endOfList = eventList_.begin() + maxBuffSize; + for (auto itor = eventList_.begin(); itor != endOfList; itor++) { + EventInfo* event = itor->get(); + BeginFilterEvents(event); + itor->reset(); + } + eventList_.erase(eventList_.begin(), endOfList); return; } void BytraceEventParser::GetDataSegArgs(BytraceLine& bufLine, ArgsMap& args, uint32_t& tgid) const @@ -737,25 +753,6 @@ void BytraceEventParser::GetDataSegArgs(BytraceLine& bufLine, ArgsMap& args, uin args.emplace(std::move(key), std::move(value)); } } -void BytraceEventParser::FilterAllEventsTemp() -{ - size_t maxBuffSize = 1000 * 1000; - size_t maxQueue = 2; - if (eventList_.size() < maxBuffSize * maxQueue) { - return; - } - auto cmp = [](const std::unique_ptr& a, const std::unique_ptr& b) { - return a->eventTimestamp < b->eventTimestamp; - }; - std::stable_sort(eventList_.begin(), eventList_.end(), cmp); - auto endOfList = eventList_.begin() + maxBuffSize; - for (auto itor = eventList_.begin(); itor != endOfList; itor++) { - EventInfo* event = itor->get(); - BeginFilterEvents(event); - itor->reset(); - } - eventList_.erase(eventList_.begin(), endOfList); -} void BytraceEventParser::FilterAllEvents() { diff --git a/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.h b/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.h index 5c73adfc6..3ead563ef 100644 --- a/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.h +++ b/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.h @@ -41,7 +41,6 @@ private: public: BytraceEventParser(TraceDataCache* dataCache, const TraceStreamerFilters* filter); void ParseDataItem(const BytraceLine& line); - void FilterAllEventsTemp(); void FilterAllEvents(); void BeginFilterEvents(EventInfo* event); void Clear(); @@ -95,7 +94,7 @@ private: const uint32_t MIN_CPU_IDLE_ARGS_COUNT = 2; const uint32_t MIN_CPU_FREQUENCY_ARGS_COUNT = 2; const uint32_t MIN_PROCESS_EXIT_ARGS_COUNT = 2; - const uint32_t MIN_CLOCK_SET_RATE_ARGS_COUNT = 3; + const uint32_t MIN_CLOCK_SET_RATE_ARGS_COUNT = 2; const uint32_t MIN_CLOCK_ENABLE_ARGS_COUNT = 3; const uint32_t MIN_CLOCK_DISABLE_ARGS_COUNT = 3; const uint32_t MIN_IRQ_HANDLER_ENTRY_ARGS_COUNT = 2; diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_event_parser/htrace_event_parser.cpp b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_event_parser/htrace_event_parser.cpp index e3b0b8053..4026d33d3 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_event_parser/htrace_event_parser.cpp +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_event_parser/htrace_event_parser.cpp @@ -200,10 +200,10 @@ void HtraceEventParser::ParserCpuEvent(HtraceDataSegment& tracePacket, eventInfo->cpu_ = msg.cpu(); auto pos = (const char*)detaiBytesView.Data() - tracePacket.seg->data(); eventInfo->detail_ = std::move(tracePacket.seg->substr(pos, detaiBytesView.Size())); + eventInfo->taskNameIndex_ = traceDataCache_->GetDataIndex(ftraceEvent.comm().ToStdString()); #ifdef SUPPORTTHREAD std::lock_guard muxLockGuard(mutex_); #endif - eventInfo->taskNameIndex_ = traceDataCache_->GetDataIndex(ftraceEvent.comm().ToStdString()); htraceEventList_.emplace_back(std::move(eventInfo)); } } diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_native_hook_parser.cpp b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_native_hook_parser.cpp index 04f2ff747..aed5c3b1f 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_native_hook_parser.cpp +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_native_hook_parser.cpp @@ -33,28 +33,24 @@ HtraceNativeHookParser::~HtraceNativeHookParser() static_cast(MaxTs())); } -bool HtraceNativeHookParser::ParseStackMap(const ProtoReader::BytesView& bytesView) +bool HtraceNativeHookParser::ParseStackMapOfflineOrOnline(const ProtoReader::BytesView& bytesView) { - if (traceDataCache_->isSplitFile_) { - auto hookData = nativeHookFilter_->GetCommHookData().datas->add_events(); - StackMap* stackMap = hookData->mutable_stack_map(); - stackMap->ParseFromArray(bytesView.Data(), bytesView.Size()); - nativeHookFilter_->GetCommHookData().size += bytesView.Size(); - return false; - } ProtoReader::StackMap_Reader stackMapReader(bytesView); - bool parseError = false; auto ipid = streamFilters_->processFilter_->UpdateOrCreateProcessWithName(stackMapReader.pid(), ""); // stores frames info. if offlineSymbolization is true, storing ips data, else storing FrameMap id. std::vector frames; - if (stackMapReader.has_frame_map_id()) { + // Defining multiset to solve the problem of if frame_map_id is equal to frame_map_id_down + std::map>> frameIdAndIdDownInfo; + std::shared_ptr> frameIdAndIdDown = std::make_shared>(); + bool parseError = false; + if (!nativeHookFilter_->GetOfflineSymbolizationMode()) { auto itor = stackMapReader.frame_map_id(&parseError); TS_CHECK_TRUE(!parseError, false, "Parse packed varInt in ParseStackMap function failed!!!"); while (itor) { frames.emplace_back(*itor); itor++; } - } else if (stackMapReader.has_ip()) { + } else { auto itor = stackMapReader.ip(&parseError); TS_CHECK_TRUE(!parseError, false, "Parse packed varInt in ParseStackMap function failed!!!"); // OfflineSymbolization use ipidToStartAddrToMapsInfoMap_ Multi-process differentiation @@ -62,8 +58,41 @@ bool HtraceNativeHookParser::ParseStackMap(const ProtoReader::BytesView& bytesVi frames.emplace_back(*itor); itor++; } + if (stackMapReader.has_frame_map_id()) { + bool parseFrameMapid = false; + auto frameMapIdItor = stackMapReader.frame_map_id(&parseFrameMapid); + while (frameMapIdItor) { + frameIdAndIdDown->emplace(*frameMapIdItor); + frameMapIdItor++; + } + frameIdAndIdDownInfo.emplace(std::make_pair(0, frameIdAndIdDown)); + } + if (stackMapReader.has_frame_map_id_down()) { + frameIdAndIdDown->clear(); + bool parseFrameMapIdDown = false; + auto frameMapIdDownItor = stackMapReader.frame_map_id_down(&parseFrameMapIdDown); + while (frameMapIdDownItor) { + frameIdAndIdDown->emplace(*frameMapIdDownItor); + frameMapIdDownItor++; + } + frameIdAndIdDownInfo.emplace(std::make_pair(1, frameIdAndIdDown)); + } + } + nativeHookFilter_->AppendStackMaps(ipid, stackMapReader.id(), frames, frameIdAndIdDownInfo); + return true; +} +bool HtraceNativeHookParser::ParseStackMap(const ProtoReader::BytesView& bytesView) +{ + if (traceDataCache_->isSplitFile_) { + auto hookData = nativeHookFilter_->GetCommHookData().datas->add_events(); + StackMap* stackMap = hookData->mutable_stack_map(); + stackMap->ParseFromArray(bytesView.Data(), bytesView.Size()); + nativeHookFilter_->GetCommHookData().size += bytesView.Size(); + return false; + } + if (!ParseStackMapOfflineOrOnline(bytesView)) { + return false; } - nativeHookFilter_->AppendStackMaps(ipid, stackMapReader.id(), frames); return true; } diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_native_hook_parser.h b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_native_hook_parser.h index 921c26e16..d885881b5 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_native_hook_parser.h +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_native_hook_parser.h @@ -48,6 +48,7 @@ private: void ParseSymbolEvent(const ProtoReader::BytesView& bytesView); void ParseThreadEvent(const ProtoReader::BytesView& bytesView); void ParseFrameMap(std::unique_ptr& nativeHookMetaData); + bool ParseStackMapOfflineOrOnline(const ProtoReader::BytesView& bytesView); bool ParseStackMap(const ProtoReader::BytesView& bytesView); void SplitHookData(std::unique_ptr& nativeHookMetaData, bool& haveSplitSeg); diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.cpp b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.cpp index b499a499f..8ba3745a7 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.cpp +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.cpp @@ -494,22 +494,24 @@ void HtraceParser::ParseFtrace(HtraceDataSegment& dataSeg) dataSeg.clockId = clock_; if (tracePluginResult.has_ftrace_cpu_detail()) { htraceCpuDetailParser_->Parse(dataSeg, tracePluginResult, haveSplitSeg); - dataSeg.status = TS_PARSE_STATUS_PARSED; } if (tracePluginResult.has_symbols_detail()) { htraceSymbolsDetailParser_->Parse(dataSeg.protoData); // has Event haveSplitSeg = true; - dataSeg.status = TS_PARSE_STATUS_PARSED; } if (tracePluginResult.has_clocks_detail()) { htraceClockDetailParser_->Parse(dataSeg.protoData); // has Event haveSplitSeg = true; - dataSeg.status = TS_PARSE_STATUS_PARSED; } if (traceDataCache_->isSplitFile_ && haveSplitSeg) { mTraceDataHtrace_.emplace(splitFileOffset_, nextLength_ + packetSegLength_); } - dataSeg.status = TS_PARSE_STATUS_INVALID; + if (tracePluginResult.has_ftrace_cpu_detail() || tracePluginResult.has_clocks_detail() || + tracePluginResult.has_symbols_detail()) { + dataSeg.status = TS_PARSE_STATUS_PARSED; + } else { + dataSeg.status = TS_PARSE_STATUS_INVALID; + } } void HtraceParser::ParseFPS(HtraceDataSegment& dataSeg) diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp index 87f34893c..cb9afa03e 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp @@ -60,9 +60,10 @@ bool ReadInfo(uint8_t* startPtr[], uint8_t* endPtr, void* outData, size_t outSiz namespace SysTuning { namespace TraceStreamer { -FtraceProcessor::FtraceProcessor() +FtraceProcessor::FtraceProcessor(TraceDataCache* traceDataCache) : fixedCharArrayRegex_(std::regex(R"(char \w+\[\d+\])")), - flexDataLocArrayRegex_(std::regex(R"(__data_loc [a-zA-Z_0-9 ]+\[\] \w+)")) + flexDataLocArrayRegex_(std::regex(R"(__data_loc [a-zA-Z_0-9 ]+\[\] \w+)")), + traceDataCache_(traceDataCache) { } @@ -529,7 +530,6 @@ bool FtraceProcessor::HandleTimeExtend(const FtraceEventHeader& eventHeader) { uint32_t deltaExt = 0; TS_CHECK_TRUE(ReadInfo(&curPos_, endPosOfData_, &deltaExt, sizeof(deltaExt)), false, "read time delta failed!"); - curTimestamp_ += TimestampIncrements(deltaExt); TS_LOGD("HandleTimeExtend: update ts with %u to %" PRIu64, deltaExt, curTimestamp_); return true; @@ -577,6 +577,10 @@ bool FtraceProcessor::HandleDataRecord(const FtraceEventHeader& eventHeader, } TS_LOGD("HandleDataRecord: eventId = %u, name = %s", eventId, format.eventName.c_str()); + if (traceDataCache_->isSplitFile_) { + curPos_ = eventEnd; + return true; + } if (FtraceEventProcessor::GetInstance().IsSupported(format.eventId)) { std::unique_ptr ftraceEvent = std::make_unique(); ftraceEvent->set_timestamp(curTimestamp_); @@ -596,25 +600,22 @@ bool FtraceProcessor::HandleDataRecord(const FtraceEventHeader& eventHeader, bool FtraceProcessor::HandlePage(FtraceCpuDetailMsg& cpuMsg, CpuDetailParser& cpuDetailParser, uint8_t page[], + bool& haveSplitSeg, size_t size) { curPos_ = page; curPage_ = page; endPosOfPage_ = page + size; - HandlePageHeader(); TS_LOGD("HandlePage: %" PRIu64 " bytes event data in page!", curPageHeader_.size); cpuMsg.set_overwrite(curPageHeader_.overwrite); - curTimestamp_ = curPageHeader_.timestamp; endPosOfData_ = curPageHeader_.endpos; while (curPos_ < curPageHeader_.endpos) { FtraceEventHeader eventHeader = {}; TS_CHECK_TRUE(ReadInfo(&curPos_, endPosOfData_, &eventHeader, sizeof(FtraceEventHeader)), false, "read EventHeader fail!"); - curTimestamp_ += eventHeader.timeDelta; - bool retval = false; switch (eventHeader.typeLen) { case BUFFER_TYPE_PADDING: @@ -634,6 +635,9 @@ bool FtraceProcessor::HandlePage(FtraceCpuDetailMsg& cpuMsg, TS_CHECK_TRUE(retval, false, "parse record data failed!"); break; } + if (traceDataCache_->isSplitFile_ && IsSplitCpuTimeStampData(curTimestamp_, haveSplitSeg)) { + return true; + } TS_LOGD("parsed %ld bytes of page data.", static_cast(curPos_ - curPage_)); } return true; @@ -644,18 +648,15 @@ static inline int RmqEntryTotalSize(unsigned int size) return sizeof(struct RmqEntry) + ((size + RMQ_ENTRY_ALIGN_MASK) & (~RMQ_ENTRY_ALIGN_MASK)); } -bool FtraceProcessor::HmParsePageData(FtraceCpuDetailMsg& cpuMsg, CpuDetailParser& cpuDetailParser, uint8_t*& data) +void FtraceProcessor::HmProcessPageTraceDataEvents(RmqConsumerData* rmqData, + uint64_t timeStampBase, + FtraceCpuDetailMsg& cpuMsg, + CpuDetailParser& cpuDetailParser, + bool& haveSplitSeg) { - RmqConsumerData* rmqData = reinterpret_cast(data); - uint64_t timeStampBase = rmqData->timeStamp; RmqEntry* event; HmTraceHeader* header; - EventFormat format = {}; - - cpuMsg.set_cpu(rmqData->coreId); - cpuMsg.set_overwrite(0); - auto curPtr = rmqData->data; auto endPtr = rmqData->data + rmqData->length; while (curPtr < endPtr) { @@ -664,14 +665,19 @@ bool FtraceProcessor::HmParsePageData(FtraceCpuDetailMsg& cpuMsg, CpuDetailParse if (evtSize == 0U) { break; } - header = reinterpret_cast(event->data); auto eventId = header->commonType; + curPtr += RmqEntryTotalSize(evtSize); if (!GetEventFormatById(eventId, format)) { - curPtr += RmqEntryTotalSize(evtSize); TS_LOGD("mark.debug. evtId = %u evtSize = %u", eventId, evtSize); continue; } + if (traceDataCache_->isSplitFile_) { + if (IsSplitCpuTimeStampData(event->timeStampOffset + timeStampBase, haveSplitSeg)) { + return; + } + continue; + } if (FtraceEventProcessor::GetInstance().IsSupported(format.eventId)) { std::unique_ptr ftraceEvent = std::make_unique(); ftraceEvent->set_timestamp(event->timeStampOffset + timeStampBase); @@ -687,10 +693,18 @@ bool FtraceProcessor::HmParsePageData(FtraceCpuDetailMsg& cpuMsg, CpuDetailParse "format.eventName = %s format.eventType = %s", eventId, evtSize, format.eventId, format.eventSize, format.eventName.c_str(), format.eventType.c_str()); } - curPtr += RmqEntryTotalSize(evtSize); } - - data += FTRACE_PAGE_SIZE; +} +bool FtraceProcessor::HmParsePageData(FtraceCpuDetailMsg& cpuMsg, + CpuDetailParser& cpuDetailParser, + uint8_t*& data, + bool& haveSplitSeg) +{ + RmqConsumerData* rmqData = reinterpret_cast(data); + uint64_t timeStampBase = rmqData->timeStamp; + cpuMsg.set_cpu(rmqData->coreId); + cpuMsg.set_overwrite(0); + HmProcessPageTraceDataEvents(rmqData, timeStampBase, cpuMsg, cpuDetailParser, haveSplitSeg); return true; } diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h index 6a5177822..30d6d1659 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h @@ -32,7 +32,7 @@ constexpr uint32_t FTRACE_PAGE_SIZE = 4096; constexpr uint32_t RMQ_ENTRY_ALIGN_MASK = (1 << 2) - 1; class FtraceProcessor { public: - FtraceProcessor(); + FtraceProcessor(TraceDataCache* traceDataCache); ~FtraceProcessor(); bool SetupEvent(const std::string& desc); @@ -40,9 +40,26 @@ public: bool HandlePage(FtraceCpuDetailMsg& cpuMsg, CpuDetailParser& cpuDetailParser, uint8_t page[], + bool& haveSplitSeg, size_t size = FTRACE_PAGE_SIZE); - bool HmParsePageData(FtraceCpuDetailMsg& cpuMsg, CpuDetailParser& cpuDetailParser, uint8_t*& data); - + bool IsSplitCpuTimeStampData(uint64_t CurTimeStamp, bool& haveSplitSeg) + { + if (traceDataCache_->SplitFileMinTime() <= CurTimeStamp && + traceDataCache_->SplitFileMaxTime() >= CurTimeStamp) { + haveSplitSeg = true; + return true; + } + return false; + } + void HmProcessPageTraceDataEvents(RmqConsumerData* rmqData, + uint64_t timeStampBase, + FtraceCpuDetailMsg& cpuMsg, + CpuDetailParser& cpuDetailParser, + bool& haveSplitSeg); + bool HmParsePageData(FtraceCpuDetailMsg& cpuMsg, + CpuDetailParser& cpuDetailParser, + uint8_t*& data, + bool& haveSplitSeg); bool HandleTgids(const std::string& tgids); bool HandleCmdlines(const std::string& cmdlines); @@ -90,6 +107,7 @@ private: std::unordered_map tgidDict_ = {}; // first is pid, second is taskName std::unordered_map taskNameDict_ = {}; + TraceDataCache* traceDataCache_ = nullptr; const std::string nameLinePrefix_ = "name:"; const std::string idLinePrefix_ = "ID:"; diff --git a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp index dca4451f2..7b143c7cb 100644 --- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp @@ -26,11 +26,12 @@ RawTraceParser::RawTraceParser(TraceDataCache* dataCache, const TraceStreamerFil : ParserBase(filters), cpuDetail_(std::make_unique()), cpuDetailParser_(std::make_unique(dataCache, filters)), - ftraceProcessor_(std::make_unique()), + ftraceProcessor_(std::make_unique(dataCache)), ksymsProcessor_(std::make_unique(dataCache, filters)), traceDataCache_(dataCache) { } + RawTraceParser::~RawTraceParser() {} void RawTraceParser::ParseTraceDataItem(const std::string& buffer) {} void RawTraceParser::WaitForParserEnd() @@ -41,6 +42,7 @@ void RawTraceParser::WaitForParserEnd() restCommDataCnt_ = 0; hasGotHeader_ = false; curCpuCoreNum_ = 0; + ClearRawTraceData(); TS_LOGI("Parser raw trace end!"); } void RawTraceParser::UpdateTraceMinRange() @@ -69,6 +71,12 @@ bool RawTraceParser::InitRawTraceFileHeader(std::deque::iterator& packa TS_LOGI("magicNumber=%d fileType=%d", header.magicNumber, header.fileType); fileType_ = header.fileType; + if (traceDataCache_->isSplitFile_) { + // To resolve the second incoming file, it is necessary to reset the previously set variables to zero + ClearRawTraceData(); + rawTraceSplitCommData_.emplace_back(SpliteDataInfo(curFileOffset_, sizeof(RawTraceFileHeader))); + curFileOffset_ += sizeof(RawTraceFileHeader); + } packagesCurIter += sizeof(RawTraceFileHeader); packagesCurIter = packagesBuffer_.erase(packagesBuffer_.begin(), packagesCurIter); hasGotHeader_ = true; @@ -76,6 +84,9 @@ bool RawTraceParser::InitRawTraceFileHeader(std::deque::iterator& packa } bool RawTraceParser::InitEventFormats(const std::string& buffer) { +#ifdef IS_WASM + restCommDataCnt_ = INVALID_UINT8; // ensure that the restCommData is parsed only once +#endif std::string line; std::istringstream iss(buffer); std::stringstream eventFormat; @@ -101,16 +112,38 @@ bool RawTraceParser::UpdateCpuCoreMax(uint32_t cpuId) return true; } -bool RawTraceParser::ParseCpuRawData(uint32_t cpuId, const std::string& buffer) +bool RawTraceParser::ParseCpuRawData(uint32_t cpuId, const std::string& buffer, uint32_t curType) { UpdateCpuCoreMax(cpuId); TS_CHECK_TRUE(buffer.size() > 0, true, "cur cpu(%u) raw data is null!", cpuId); auto startPtr = reinterpret_cast(buffer.c_str()); auto endPtr = startPtr + buffer.size(); cpuDetail_->set_cpu(cpuId); + // splice the data curType adn size of each cup that matches the timestamp + uint32_t curFileOffset = curFileOffset_ + sizeof(curType) + sizeof(uint32_t); + uint32_t splitOffset = 0; + uint32_t splitSize = 0; + bool isSplitPosition = false; for (uint8_t* page = const_cast(startPtr); page < endPtr; page += FTRACE_PAGE_SIZE) { - TS_CHECK_TRUE(ftraceProcessor_->HandlePage(*cpuDetail_.get(), *cpuDetailParser_.get(), page), false, - "handle page failed!"); + bool haveSplitSeg = false; + TS_CHECK_TRUE(ftraceProcessor_->HandlePage(*cpuDetail_.get(), *cpuDetailParser_.get(), page, haveSplitSeg), + false, "handle page failed!"); + if (haveSplitSeg) { + splitSize += FTRACE_PAGE_SIZE; + if (!isSplitPosition) { + // splitOffset = first Save the migration amount of CPURAW that currently matches the timestamp + isSplitPosition = true; + splitOffset = curFileOffset; + } + } + curFileOffset += FTRACE_PAGE_SIZE; + } + if (traceDataCache_->isSplitFile_) { + // Skip parsing data for timestamp or non timestamp compliant data + if (splitSize > 0) { + rawTraceSplitCpuData_.emplace_back(SpliteDataInfo(splitOffset, splitSize, curType)); + } + return true; } if (cpuDetailParser_->cpuCoreMax_ != CPU_CORE_MAX) { cpuDetailParser_->FilterAllEvents(*cpuDetail_.get()); @@ -118,16 +151,37 @@ bool RawTraceParser::ParseCpuRawData(uint32_t cpuId, const std::string& buffer) return true; } -bool RawTraceParser::HmParseCpuRawData(const std::string& buffer) +bool RawTraceParser::HmParseCpuRawData(const std::string& buffer, uint32_t curType) { TS_CHECK_TRUE(buffer.size() > 0, true, "hm raw data is null!"); auto startPtr = reinterpret_cast(buffer.c_str()); auto endPtr = startPtr + buffer.size(); - - for (uint8_t* data = const_cast(startPtr); data < endPtr;) { - TS_CHECK_TRUE(ftraceProcessor_->HmParsePageData(*cpuDetail_.get(), *cpuDetailParser_.get(), data), false, - "hm parse page failed!"); - cpuDetailParser_->FilterAllEvents(*cpuDetail_.get()); + // splice the data curType adn size of each cup that matches the timestamp + uint32_t curFileOffset = curFileOffset_ + sizeof(curType) + sizeof(uint32_t); + uint32_t splitOffset = 0; + uint32_t splitSize = 0; + bool isSplitPosition = false; + for (uint8_t* data = const_cast(startPtr); data < endPtr; data += FTRACE_PAGE_SIZE) { + bool haveSplitSeg = false; + TS_CHECK_TRUE(ftraceProcessor_->HmParsePageData(*cpuDetail_.get(), *cpuDetailParser_.get(), data, haveSplitSeg), + false, "hm parse page failed!"); + if (haveSplitSeg) { + splitSize += FTRACE_PAGE_SIZE; + if (!isSplitPosition) { + // splitOffset = first Save the migration amount of CPURAW that currently matches the timestamp + isSplitPosition = true; + splitOffset = curFileOffset; + } + } + if (!traceDataCache_->isSplitFile_) { + // No specific analysis is required for time cutting + cpuDetailParser_->FilterAllEvents(*cpuDetail_.get()); + } + curFileOffset += FTRACE_PAGE_SIZE; + } + if (traceDataCache_->isSplitFile_ && splitSize > 0) { + rawTraceSplitCpuData_.emplace_back(SpliteDataInfo(splitOffset, splitSize, curType)); + return true; } TS_LOGD("mark.debug. HmParseCpuRawData end success"); return true; @@ -154,6 +208,7 @@ bool RawTraceParser::ParseLastCommData(uint8_t type, const std::string& buffer) return true; #endif } + void RawTraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr, size_t size, bool isFinish) { packagesBuffer_.insert(packagesBuffer_.end(), &bufferStr[0], &bufferStr[size]); @@ -168,6 +223,36 @@ void RawTraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr, } return; } + +bool RawTraceParser::ProcessRawTraceContent(std::string& bufferLine, uint8_t curType) +{ + if (curType >= static_cast(RawTraceContentType::CONTENT_TYPE_CPU_RAW) && + curType < static_cast(RawTraceContentType::CONTENT_TYPE_HEADER_PAGE)) { + curType = static_cast(curType); + if (fileType_ == static_cast(RawTraceFileType::FILE_RAW_TRACE)) { + auto cpuId = curType - static_cast(RawTraceContentType::CONTENT_TYPE_CPU_RAW); + TS_CHECK_TRUE(ParseCpuRawData(cpuId, bufferLine, curType), false, "cpu raw parse failed"); + } else if (fileType_ == static_cast(RawTraceFileType::HM_FILE_RAW_TRACE)) { + TS_CHECK_TRUE(HmParseCpuRawData(bufferLine, curType), false, "hm raw trace parse failed"); + } + if (traceDataCache_->isSplitFile_) { + // exactly uint32_t curSegSize = sizeof(type) + sizeof(len) + bufferLine.size(); + curFileOffset_ += sizeof(uint32_t) + sizeof(uint32_t) + bufferLine.size(); + } + } else if (curType == static_cast(RawTraceContentType::CONTENT_TYPE_EVENTS_FORMAT)) { + TS_CHECK_TRUE(InitEventFormats(bufferLine), false, "init event format failed"); + } else if (curType == static_cast(RawTraceContentType::CONTENT_TYPE_HEADER_PAGE)) { + TS_CHECK_TRUE(ftraceProcessor_->HandleHeaderPageFormat(bufferLine), false, "init header page failed"); + } else if (curType == static_cast(RawTraceContentType::CONTENT_TYPE_PRINTK_FORMATS)) { + TS_CHECK_TRUE(PrintkFormatsProcessor::GetInstance().HandlePrintkSyms(bufferLine), false, + "init printk_formats failed"); + } else if (curType == static_cast(RawTraceContentType::CONTENT_TYPE_KALLSYMS)) { + TS_CHECK_TRUE(ksymsProcessor_->HandleKallSyms(bufferLine), false, "init printk_formats failed"); + } else { + TS_LOGW("Raw Trace Type(%d) Unknown or has been parsed.", curType); + } + return true; +} bool RawTraceParser::ParseDataRecursively(std::deque::iterator& packagesCurIter) { uint32_t type = 0; @@ -189,25 +274,20 @@ bool RawTraceParser::ParseDataRecursively(std::deque::iterator& package if (ParseLastCommData(curType, bufferLine)) { continue; } - if (curType >= static_cast(RawTraceContentType::CONTENT_TYPE_CPU_RAW) && - curType < static_cast(RawTraceContentType::CONTENT_TYPE_HEADER_PAGE)) { - if (fileType_ == static_cast(RawTraceFileType::FILE_RAW_TRACE)) { - auto cpuId = curType - static_cast(RawTraceContentType::CONTENT_TYPE_CPU_RAW); - TS_CHECK_TRUE(ParseCpuRawData(cpuId, bufferLine), false, "cpu raw parse failed"); - } else if (fileType_ == static_cast(RawTraceFileType::HM_FILE_RAW_TRACE)) { - TS_CHECK_TRUE(HmParseCpuRawData(bufferLine), false, "hm raw trace parse failed"); + // for jump first comm data + if (traceDataCache_->isSplitFile_ && + (curType < static_cast(RawTraceContentType::CONTENT_TYPE_CPU_RAW) || + curType >= static_cast(RawTraceContentType::CONTENT_TYPE_HEADER_PAGE))) { + uint32_t curSegSize = sizeof(type) + sizeof(len) + bufferLine.size(); + rawTraceSplitCommData_.emplace_back(SpliteDataInfo(curFileOffset_, curSegSize)); + curFileOffset_ += curSegSize; + if (curType == static_cast(RawTraceContentType::CONTENT_TYPE_EVENTS_FORMAT)) { + restCommDataCnt_ = INVALID_UINT8; } - } else if (curType == static_cast(RawTraceContentType::CONTENT_TYPE_EVENTS_FORMAT)) { - TS_CHECK_TRUE(InitEventFormats(bufferLine), false, "init event format failed"); - } else if (curType == static_cast(RawTraceContentType::CONTENT_TYPE_HEADER_PAGE)) { - TS_CHECK_TRUE(ftraceProcessor_->HandleHeaderPageFormat(bufferLine), false, "init header page failed"); - } else if (curType == static_cast(RawTraceContentType::CONTENT_TYPE_PRINTK_FORMATS)) { - TS_CHECK_TRUE(PrintkFormatsProcessor::GetInstance().HandlePrintkSyms(bufferLine), false, - "init printk_formats failed"); - } else if (curType == static_cast(RawTraceContentType::CONTENT_TYPE_KALLSYMS)) { - TS_CHECK_TRUE(ksymsProcessor_->HandleKallSyms(bufferLine), false, "init printk_formats failed"); - } else { - TS_LOGW("Raw Trace Type(%d) Unknown or has been parsed.", curType); + continue; + } + if (!ProcessRawTraceContent(bufferLine, curType)) { + return false; } } return true; diff --git a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.h b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.h index 243dff872..992a15dbe 100644 --- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.h +++ b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.h @@ -30,12 +30,27 @@ public: ~RawTraceParser(); void ParseTraceDataSegment(std::unique_ptr bufferStr, size_t size, bool isFinish = false) override; void WaitForParserEnd(); + void ClearRawTraceData() + { + rawTraceSplitCpuData_.clear(); + rawTraceSplitCommData_.clear(); + curFileOffset_ = 0; + } + const auto& GetRawtraceCpuData() + { + return rawTraceSplitCpuData_; + } + const auto& GetRawtraceCommData() + { + return rawTraceSplitCommData_; + } private: bool ParseDataRecursively(std::deque::iterator& packagesCurIter); + bool ProcessRawTraceContent(std::string& bufferLine, uint8_t curType); void ParseTraceDataItem(const std::string& buffer) override; - bool ParseCpuRawData(uint32_t cpuId, const std::string& buffer); - bool HmParseCpuRawData(const std::string& buffer); + bool ParseCpuRawData(uint32_t cpuId, const std::string& buffer, uint32_t curType); + bool HmParseCpuRawData(const std::string& buffer, uint32_t curType); bool ParseLastCommData(uint8_t type, const std::string& buffer); bool InitRawTraceFileHeader(std::deque::iterator& packagesCurIter); bool InitEventFormats(const std::string& buffer); @@ -47,12 +62,26 @@ private: std::unique_ptr cpuDetailParser_ = nullptr; std::unique_ptr ftraceProcessor_ = nullptr; std::unique_ptr ksymsProcessor_ = nullptr; - TraceDataCache* traceDataCache_; + TraceDataCache* traceDataCache_ = nullptr; bool hasGotHeader_ = false; uint8_t fileType_ = 0; uint8_t restCommDataCnt_ = 0; uint32_t curCpuCoreNum_ = 0; const std::string eventEndCmd_ = "print fmt:"; + + uint32_t curFileOffset_ = 0; + // Store 4k types and data sizes each time + struct SpliteDataInfo { + uint32_t splitDataOffset_ = 0; + uint32_t splitDataSize_ = 0; + uint32_t splitType_ = 0; + SpliteDataInfo(uint32_t splitDataOffset, uint32_t splitDataSize, uint32_t splitType = 0) + : splitDataOffset_(splitDataOffset), splitDataSize_(splitDataSize), splitType_(splitType) + { + } + }; + std::deque rawTraceSplitCpuData_ = {}; + std::deque rawTraceSplitCommData_ = {}; }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/protos/types/plugins/native_hook/native_hook_result.proto b/trace_streamer/src/protos/types/plugins/native_hook/native_hook_result.proto index 2acc7cfb7..5e1c32fb5 100755 --- a/trace_streamer/src/protos/types/plugins/native_hook/native_hook_result.proto +++ b/trace_streamer/src/protos/types/plugins/native_hook/native_hook_result.proto @@ -72,6 +72,7 @@ message StackMap { repeated uint64 frame_map_id = 2; // online symbolization use frame_map_id repeated uint64 ip = 3; // offline symbolization use ip int32 pid = 4; + repeated uint64 frame_map_id_down = 5; } message FrameMap { diff --git a/trace_streamer/src/rpc/rpc_server.cpp b/trace_streamer/src/rpc/rpc_server.cpp index 75a61396a..e0223d1ac 100644 --- a/trace_streamer/src/rpc/rpc_server.cpp +++ b/trace_streamer/src/rpc/rpc_server.cpp @@ -27,6 +27,7 @@ #include "htrace_parser.h" #include "json.hpp" #include "log.h" +#include "rawtrace_parser.h" #include "string_help.h" #include "trace_streamer_selector.h" #include "ts_common.h" @@ -40,6 +41,7 @@ const size_t PACKET_HEADER_LENGTH = 1024; const std::string VALUE = "{\"value\":["; const std::string OFFSET = "{\"offset\":"; const std::string SIZE = ",\"size\":"; +const std::string TYPE = ",\"type\":"; const std::string EMPTY_VALUE = "{\"value\":[]}"; using json = nlohmann::json; @@ -50,6 +52,7 @@ struct ParserConfig { int32_t aniConfigValue; int32_t binderConfigValue; int32_t ffrtConvertConfigValue; + int32_t HMKernelConfigValue; }; void from_json(const json& j, ParserConfig& v) { @@ -58,6 +61,7 @@ void from_json(const json& j, ParserConfig& v) j.at("AnimationAnalysis").get_to(v.aniConfigValue); j.at("BinderRunnable").get_to(v.binderConfigValue); j.at("FfrtConvert").get_to(v.ffrtConvertConfigValue); + j.at("HMKernel").get_to(v.HMKernelConfigValue); } } // namespace jsonns #if IS_WASM @@ -290,6 +294,34 @@ bool RpcServer::SendBytraceSplitFileData(SplitFileCallBack splitFileCallBack, in return true; } +bool RpcServer::SendRawtraceSplitFileData(SplitFileCallBack splitFileCallBack, int32_t isFinish) +{ + const auto& mTraceRawCpuData = ts_->GetRawtraceData()->GetRawtraceCpuData(); + const auto& mTraceRawCommData = ts_->GetRawtraceData()->GetRawtraceCommData(); + std::string result = VALUE; + + for (size_t commDataIndex = 0; commDataIndex < mTraceRawCommData.size(); commDataIndex++) { + result += OFFSET + std::to_string(mTraceRawCommData.at(commDataIndex).splitDataOffset_); + result += SIZE + std::to_string(mTraceRawCommData.at(commDataIndex).splitDataSize_); + result += TYPE + std::to_string(mTraceRawCommData.at(commDataIndex).splitType_); + result += "},"; + } + + for (size_t cpuDataIndex = 0; cpuDataIndex < mTraceRawCpuData.size(); cpuDataIndex++) { + result += OFFSET + std::to_string(mTraceRawCpuData.at(cpuDataIndex).splitDataOffset_); + result += SIZE + std::to_string(mTraceRawCpuData.at(cpuDataIndex).splitDataSize_); + result += TYPE + std::to_string(mTraceRawCpuData.at(cpuDataIndex).splitType_); + result += "},"; + } + if (result != VALUE && !ts_->GetRawtraceData()->GetRawtraceCommData().empty()) { + result.pop_back(); + result += "]}\r\n"; + splitFileCallBack(result, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, isFinish); + } + TS_LOGI("mTraceRawCpuData.size()= %lu, mTraceRawCommData.size()=%lu\n result=%s\n", mTraceRawCpuData.size(), + mTraceRawCommData.size(), result.data()); + return true; +} bool RpcServer::ParseSplitFileData(const uint8_t* data, size_t len, int32_t isFinish, @@ -311,6 +343,13 @@ bool RpcServer::ParseSplitFileData(const uint8_t* data, ts_->GetTraceDataCache()->isSplitFile_ = false; return true; } + if (ts_->GetFileType() == TRACE_FILETYPE_RAW_TRACE) { + SendRawtraceSplitFileData(splitFileCallBack, 0); + splitFileCallBack(EMPTY_VALUE, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, 1); + ts_->GetRawtraceData()->ClearRawTraceData(); + ts_->GetTraceDataCache()->isSplitFile_ = false; + return true; + } if (ts_->GetFileType() == TRACE_FILETYPE_H_TRACE) { ProcHtraceSplitResult(splitFileCallBack); } @@ -699,6 +738,7 @@ bool RpcServer::ParserConfig(std::string parserConfigJson) ts_->UpdateAnimationTraceStatus(parserConfig.aniConfigValue); ts_->UpdateTaskPoolTraceStatus(parserConfig.taskConfigValue); ts_->UpdateBinderRunnableTraceStatus(parserConfig.binderConfigValue); + ts_->UpdateHMKernelTraceStatus(parserConfig.HMKernelConfigValue); ffrtConvertEnabled_ = parserConfig.ffrtConvertConfigValue; startParseTime_ = (std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch())) diff --git a/trace_streamer/src/rpc/rpc_server.h b/trace_streamer/src/rpc/rpc_server.h index cb503a458..cac28d0d6 100644 --- a/trace_streamer/src/rpc/rpc_server.h +++ b/trace_streamer/src/rpc/rpc_server.h @@ -69,6 +69,8 @@ public: return ffrtConvertEnabled_; }; bool DetermineSystrace(const uint8_t* data, size_t len); + + bool SendRawtraceSplitFileData(SplitFileCallBack splitFileCallBack, int32_t isFinish); #ifdef IS_WASM bool SaveAndParseFfrtData(const uint8_t* data, size_t len, ResultCallBack resultCallBack, bool isFinish); bool ReadAndParseData(const std::string& filePath); diff --git a/trace_streamer/src/table/ftrace/task_pool_table.cpp b/trace_streamer/src/table/ftrace/task_pool_table.cpp index 0734a22c6..1f6a10d35 100644 --- a/trace_streamer/src/table/ftrace/task_pool_table.cpp +++ b/trace_streamer/src/table/ftrace/task_pool_table.cpp @@ -25,7 +25,7 @@ enum class Index : int32_t { ALLOCATION_ITID, EXECUTE_ITID, RETURN_ITID, - EXECUTE_ID, + TASK_ID, PRIORITY, EXECUTE_STATE, RETURN_STATE, @@ -40,7 +40,7 @@ TaskPoolTable::TaskPoolTable(const TraceDataCache* dataCache) : TableBase(dataCa tableColumn_.push_back(TableBase::ColumnInfo("allocation_itid", "INTEGER")); tableColumn_.push_back(TableBase::ColumnInfo("execute_itid", "INTEGER")); tableColumn_.push_back(TableBase::ColumnInfo("return_itid", "INTEGER")); - tableColumn_.push_back(TableBase::ColumnInfo("execute_id", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("task_id", "INTEGER")); tableColumn_.push_back(TableBase::ColumnInfo("priority", "INTEGER")); tableColumn_.push_back(TableBase::ColumnInfo("execute_state", "INTEGER")); tableColumn_.push_back(TableBase::ColumnInfo("return_state", "INTEGER")); @@ -114,10 +114,10 @@ void TaskPoolTable::Cursor::HandleTypeColumns(int32_t taskPoolTabColumn) const dataCache_->GetConstTaskPoolData().ReturnItids()[CurrentRow()])); } break; - case Index::EXECUTE_ID: - if (taskPoolObj_.ExecuteIds()[CurrentRow()] != INVALID_INT32) { - sqlite3_result_int64(context_, static_cast( - dataCache_->GetConstTaskPoolData().ExecuteIds()[CurrentRow()])); + case Index::TASK_ID: + if (taskPoolObj_.TaskIds()[CurrentRow()] != INVALID_INT64) { + sqlite3_result_int64( + context_, static_cast(dataCache_->GetConstTaskPoolData().TaskIds()[CurrentRow()])); } break; case Index::PRIORITY: diff --git a/trace_streamer/src/table/native_hook/native_hook_frame_table.cpp b/trace_streamer/src/table/native_hook/native_hook_frame_table.cpp index 2aaea9288..c41504030 100644 --- a/trace_streamer/src/table/native_hook/native_hook_frame_table.cpp +++ b/trace_streamer/src/table/native_hook/native_hook_frame_table.cpp @@ -17,7 +17,18 @@ namespace SysTuning { namespace TraceStreamer { -enum class Index : int32_t { ID = 0, CALLCHAIN_ID, DEPTH, IP, SYMBOL_ID, FILE_ID, OFFSET, SYMBOL_OFFSET, VADDR }; +enum class Index : int32_t { + ID = 0, + CALLCHAIN_ID, + DEPTH, + IP, + SYMBOL_ID, + FILE_ID, + OFFSET, + SYMBOL_OFFSET, + VADDR, + REAL_STACK +}; NativeHookFrameTable::NativeHookFrameTable(const TraceDataCache* dataCache) : TableBase(dataCache) { tableColumn_.push_back(TableBase::ColumnInfo("id", "INTEGER")); @@ -29,6 +40,7 @@ NativeHookFrameTable::NativeHookFrameTable(const TraceDataCache* dataCache) : Ta tableColumn_.push_back(TableBase::ColumnInfo("offset", "INTEGER")); tableColumn_.push_back(TableBase::ColumnInfo("symbol_offset", "INTEGER")); tableColumn_.push_back(TableBase::ColumnInfo("vaddr", "TEXT")); + tableColumn_.push_back(TableBase::ColumnInfo("real_stack", "INTEGER")); tablePriKey_.push_back("id"); } @@ -154,6 +166,10 @@ int32_t NativeHookFrameTable::Cursor::Column(int32_t nativeHookFrameCol) const nativeHookFrameInfoObj_.Vaddrs()[CurrentRow()].c_str()); break; } + case Index::REAL_STACK: { + SetTypeColumnInt32(nativeHookFrameInfoObj_.realStack()[CurrentRow()], INVALID_UINT32); + break; + } default: TS_LOGF("Unregistered nativeHookFrameCol : %d", nativeHookFrameCol); break; diff --git a/trace_streamer/src/trace_data/trace_data_cache.cpp b/trace_streamer/src/trace_data/trace_data_cache.cpp index c50721910..df387b436 100644 --- a/trace_streamer/src/trace_data/trace_data_cache.cpp +++ b/trace_streamer/src/trace_data/trace_data_cache.cpp @@ -279,6 +279,15 @@ void TraceDataCache::UpdateBinderRunnableTraceStatus(bool status) { binderRunnableTraceEnabled_ = status; } +bool TraceDataCache::HMKernelTraceEnabled() const +{ + return HMKernelTraceEnabled_; +} + +void TraceDataCache::UpdateHMKernelTraceStatus(bool status) +{ + HMKernelTraceEnabled_ = status; +} uint64_t TraceDataCache::SplitFileMaxTime() { return splitFileMaxTs_; diff --git a/trace_streamer/src/trace_data/trace_data_cache.h b/trace_streamer/src/trace_data/trace_data_cache.h index b820a6eac..d7b785361 100644 --- a/trace_streamer/src/trace_data/trace_data_cache.h +++ b/trace_streamer/src/trace_data/trace_data_cache.h @@ -39,6 +39,8 @@ public: void UpdateAppStartTraceStatus(bool status); bool BinderRunnableTraceEnabled() const; void UpdateBinderRunnableTraceStatus(bool status); + bool HMKernelTraceEnabled() const; + void UpdateHMKernelTraceStatus(bool status); uint64_t SplitFileMaxTime(); uint64_t SplitFileMinTime(); void SetSplitFileMaxTime(uint64_t maxTs); @@ -85,6 +87,7 @@ private: bool taskPoolTraceEnabled_ = false; bool appStartTraceEnabled_ = false; bool binderRunnableTraceEnabled_ = false; + bool HMKernelTraceEnabled_ = false; uint64_t splitFileMinTs_ = INVALID_UINT64; uint64_t splitFileMaxTs_ = INVALID_UINT64; std::deque> hookCommProtos_; diff --git a/trace_streamer/src/trace_data/trace_stdtype/common_stdtype.cpp b/trace_streamer/src/trace_data/trace_stdtype/common_stdtype.cpp index 35503a113..39a5d0a39 100644 --- a/trace_streamer/src/trace_data/trace_stdtype/common_stdtype.cpp +++ b/trace_streamer/src/trace_data/trace_stdtype/common_stdtype.cpp @@ -81,15 +81,16 @@ const std::string& MetaData::Name(uint64_t row) const } DataIndex DataDict::GetStringIndex(std::string_view str) { +#ifdef SUPPORTTHREAD + std::lock_guard dictLockGuard(mutex_); +#endif auto itor = dataDictInnerMap_.find(str); if (itor != dataDictInnerMap_.end()) { return itor->second; } - mutex_.lock(); dataDict_.emplace_back(std::string(str)); DataIndex stringIdentity = dataDict_.size() - 1; dataDictInnerMap_.emplace(std::string_view(dataDict_.back()), stringIdentity); - mutex_.unlock(); return stringIdentity; } DataIndex DataDict::GetStringIndexNoWrite(std::string_view str) const diff --git a/trace_streamer/src/trace_data/trace_stdtype/ftrace/template/task_pool_stdtype.cpp b/trace_streamer/src/trace_data/trace_stdtype/ftrace/template/task_pool_stdtype.cpp index 8a09a12de..fe465403e 100644 --- a/trace_streamer/src/trace_data/trace_stdtype/ftrace/template/task_pool_stdtype.cpp +++ b/trace_streamer/src/trace_data/trace_stdtype/ftrace/template/task_pool_stdtype.cpp @@ -18,7 +18,7 @@ namespace SysTuning { namespace TraceStdtype { size_t TaskPoolInfo::AppendAllocationTaskData(uint32_t allocationTaskRow, uint32_t allocationItid, - uint32_t executeId, + uint64_t taskId, uint32_t priority, uint32_t executeState) { @@ -28,7 +28,7 @@ size_t TaskPoolInfo::AppendAllocationTaskData(uint32_t allocationTaskRow, allocationItids_.emplace_back(allocationItid); executeItids_.emplace_back(INVALID_INT32); returnItids_.emplace_back(INVALID_INT32); - executeIds_.emplace_back(executeId); + taskIds_.emplace_back(taskId); prioritys_.emplace_back(priority); executeStates_.emplace_back(executeState); returnStates_.emplace_back(INVALID_INT32); @@ -36,7 +36,7 @@ size_t TaskPoolInfo::AppendAllocationTaskData(uint32_t allocationTaskRow, ids_.emplace_back(Size()); return Size() - 1; } -size_t TaskPoolInfo::AppendExecuteTaskData(uint32_t executeTaskRow, uint32_t executeItid, uint32_t executeId) +size_t TaskPoolInfo::AppendExecuteTaskData(uint32_t executeTaskRow, uint32_t executeItid, uint64_t taskId) { allocationTaskRows_.emplace_back(INVALID_INT32); executeTaskRows_.emplace_back(executeTaskRow); @@ -44,7 +44,7 @@ size_t TaskPoolInfo::AppendExecuteTaskData(uint32_t executeTaskRow, uint32_t exe allocationItids_.emplace_back(INVALID_INT32); executeItids_.emplace_back(executeItid); returnItids_.emplace_back(INVALID_INT32); - executeIds_.emplace_back(executeId); + taskIds_.emplace_back(taskId); prioritys_.emplace_back(INVALID_INT32); executeStates_.emplace_back(INVALID_INT32); returnStates_.emplace_back(INVALID_INT32); @@ -54,7 +54,7 @@ size_t TaskPoolInfo::AppendExecuteTaskData(uint32_t executeTaskRow, uint32_t exe } size_t TaskPoolInfo::AppendReturnTaskData(uint32_t returnTaskRow, uint32_t returnItid, - uint32_t executeId, + uint64_t taskId, uint32_t returnState) { allocationTaskRows_.emplace_back(INVALID_INT32); @@ -63,7 +63,7 @@ size_t TaskPoolInfo::AppendReturnTaskData(uint32_t returnTaskRow, allocationItids_.emplace_back(INVALID_INT32); executeItids_.emplace_back(INVALID_INT32); returnItids_.emplace_back(returnItid); - executeIds_.emplace_back(executeId); + taskIds_.emplace_back(taskId); prioritys_.emplace_back(INVALID_INT32); executeStates_.emplace_back(INVALID_INT32); returnStates_.emplace_back(returnState); @@ -95,9 +95,9 @@ const std::deque& TaskPoolInfo::ReturnItids() const { return returnItids_; } -const std::deque& TaskPoolInfo::ExecuteIds() const +const std::deque& TaskPoolInfo::TaskIds() const { - return executeIds_; + return taskIds_; } const std::deque& TaskPoolInfo::Prioritys() const { @@ -128,7 +128,7 @@ void TaskPoolInfo::UpdateAllocationTaskData(uint32_t index, executeStates_[index] = executeState; } } -void TaskPoolInfo::UpdateExecuteTaskData(uint32_t index, uint32_t executeTaskRow, uint32_t executeItid) +void TaskPoolInfo::UpdateExecuteTaskData(uint32_t index, uint32_t executeTaskRow, uint64_t executeItid) { if (index <= Size()) { executeTaskRows_[index] = executeTaskRow; diff --git a/trace_streamer/src/trace_data/trace_stdtype/ftrace/template/task_pool_stdtype.h b/trace_streamer/src/trace_data/trace_stdtype/ftrace/template/task_pool_stdtype.h index 09e10de15..9304c1695 100644 --- a/trace_streamer/src/trace_data/trace_stdtype/ftrace/template/task_pool_stdtype.h +++ b/trace_streamer/src/trace_data/trace_stdtype/ftrace/template/task_pool_stdtype.h @@ -23,17 +23,17 @@ class TaskPoolInfo : public CacheBase { public: size_t AppendAllocationTaskData(uint32_t allocationTaskRow, uint32_t allocationItid, - uint32_t executeId, + uint64_t taskIds, uint32_t priority, uint32_t executeState); - size_t AppendExecuteTaskData(uint32_t executeTaskRow, uint32_t executeItid, uint32_t executeId); - size_t AppendReturnTaskData(uint32_t returnTaskRow, uint32_t returnItid, uint32_t executeId, uint32_t returnState); + size_t AppendExecuteTaskData(uint32_t executeTaskRow, uint32_t executeItid, uint64_t taskIds); + size_t AppendReturnTaskData(uint32_t returnTaskRow, uint32_t returnItid, uint64_t taskIds, uint32_t returnState); void UpdateAllocationTaskData(uint32_t index, uint32_t allocationTaskRow, uint32_t allocationItid, uint32_t priority, uint32_t executeState); - void UpdateExecuteTaskData(uint32_t index, uint32_t executeTaskRow, uint32_t executeItid); + void UpdateExecuteTaskData(uint32_t index, uint32_t executeTaskRow, uint64_t executeItid); void UpdateReturnTaskData(uint32_t index, uint32_t returnTaskRow, uint32_t returnItid, uint32_t returnState); void AppendTimeoutRow(uint32_t index, uint32_t timeoutRow); @@ -43,7 +43,7 @@ public: const std::deque& AllocationItids() const; const std::deque& ExecuteItids() const; const std::deque& ReturnItids() const; - const std::deque& ExecuteIds() const; + const std::deque& TaskIds() const; const std::deque& Prioritys() const; const std::deque& ExecuteStates() const; const std::deque& ReturnStates() const; @@ -57,7 +57,7 @@ public: allocationItids_.clear(); executeItids_.clear(); returnItids_.clear(); - executeIds_.clear(); + taskIds_.clear(); prioritys_.clear(); executeStates_.clear(); returnStates_.clear(); @@ -71,7 +71,7 @@ private: std::deque allocationItids_ = {}; std::deque executeItids_ = {}; std::deque returnItids_ = {}; - std::deque executeIds_ = {}; + std::deque taskIds_ = {}; std::deque prioritys_ = {}; std::deque executeStates_ = {}; std::deque returnStates_ = {}; diff --git a/trace_streamer/src/trace_data/trace_stdtype/htrace/native_memory_stdtype.cpp b/trace_streamer/src/trace_data/trace_stdtype/htrace/native_memory_stdtype.cpp index 3b1f5c335..32238bfc2 100644 --- a/trace_streamer/src/trace_data/trace_stdtype/htrace/native_memory_stdtype.cpp +++ b/trace_streamer/src/trace_data/trace_stdtype/htrace/native_memory_stdtype.cpp @@ -168,7 +168,8 @@ size_t NativeHookFrame::AppendNewNativeHookFrame(uint32_t callChainId, DataIndex filePath, uint64_t offset, uint64_t symbolOffset, - const std::string& vaddr) + const std::string& vaddr, + uint32_t realStack) { callChainIds_.emplace_back(callChainId); ips_.emplace_back(ip); @@ -178,6 +179,7 @@ size_t NativeHookFrame::AppendNewNativeHookFrame(uint32_t callChainId, offsets_.emplace_back(offset); symbolOffsets_.emplace_back(symbolOffset); vaddrs_.emplace_back(vaddr); + realStack_.emplace_back(realStack); return Size() - 1; } size_t NativeHookFrame::AppendNewNativeHookFrame(uint32_t callChainId, @@ -186,7 +188,8 @@ size_t NativeHookFrame::AppendNewNativeHookFrame(uint32_t callChainId, DataIndex symbolName, DataIndex filePath, uint64_t offset, - uint64_t symbolOffset) + uint64_t symbolOffset, + uint32_t realStack) { callChainIds_.emplace_back(callChainId); ips_.emplace_back(ip); @@ -195,6 +198,7 @@ size_t NativeHookFrame::AppendNewNativeHookFrame(uint32_t callChainId, filePaths_.emplace_back(filePath); offsets_.emplace_back(offset); symbolOffsets_.emplace_back(symbolOffset); + realStack_.emplace_back(realStack); return Size() - 1; } void NativeHookFrame::UpdateSymbolIdToNameMap(uint64_t originSymbolId, uint64_t symbolId) @@ -283,6 +287,10 @@ const std::deque& NativeHookFrame::Vaddrs() const { return vaddrs_; } +const std::deque& NativeHookFrame::realStack() const +{ + return realStack_; +} size_t NativeHookStatistic::AppendNewNativeHookStatistic(uint32_t ipid, uint64_t timeStamp, diff --git a/trace_streamer/src/trace_data/trace_stdtype/htrace/native_memory_stdtype.h b/trace_streamer/src/trace_data/trace_stdtype/htrace/native_memory_stdtype.h index 70ca28dc4..d802ed89d 100644 --- a/trace_streamer/src/trace_data/trace_stdtype/htrace/native_memory_stdtype.h +++ b/trace_streamer/src/trace_data/trace_stdtype/htrace/native_memory_stdtype.h @@ -127,7 +127,8 @@ public: DataIndex symbolName, DataIndex filePath, uint64_t offset, - uint64_t symbolOffset); + uint64_t symbolOffset, + uint32_t realStack = 1); size_t AppendNewNativeHookFrame(uint32_t callChainId, uint16_t depth, uint64_t ip, @@ -135,7 +136,8 @@ public: DataIndex filePath, uint64_t offset, uint64_t symbolOffset, - const std::string& vaddr); + const std::string& vaddr, + uint32_t realStack = 1); void UpdateFrameInfo(size_t row, DataIndex symbolIndex, DataIndex filePathIndex, @@ -154,6 +156,7 @@ public: const std::deque& Offsets() const; const std::deque& SymbolOffsets() const; const std::deque& Vaddrs() const; + const std::deque& realStack() const; size_t Size() const { return callChainIds_.size(); @@ -168,6 +171,7 @@ public: offsets_.clear(); symbolOffsets_.clear(); vaddrs_.clear(); + realStack_.clear(); } private: @@ -179,6 +183,7 @@ private: std::deque offsets_ = {}; std::deque symbolOffsets_ = {}; std::deque vaddrs_ = {}; + std::deque realStack_ = {}; std::map symbolIdToSymbolName_ = {}; }; diff --git a/trace_streamer/src/trace_streamer/trace_streamer_selector.cpp b/trace_streamer/src/trace_streamer/trace_streamer_selector.cpp index d1df359a5..ea83a646d 100644 --- a/trace_streamer/src/trace_streamer/trace_streamer_selector.cpp +++ b/trace_streamer/src/trace_streamer/trace_streamer_selector.cpp @@ -423,6 +423,10 @@ void TraceStreamerSelector::UpdateAppStartTraceStatus(bool status) { traceDataCache_->UpdateAppStartTraceStatus(status); } +void TraceStreamerSelector::UpdateHMKernelTraceStatus(bool status) +{ + traceDataCache_->UpdateHMKernelTraceStatus(status); +} bool TraceStreamerSelector::LoadQueryFile(const std::string& sqlOperator, std::vector& sqlStrings) { std::ifstream file(sqlOperator); diff --git a/trace_streamer/src/trace_streamer/trace_streamer_selector.h b/trace_streamer/src/trace_streamer/trace_streamer_selector.h index 9037adfe0..48d2a5847 100644 --- a/trace_streamer/src/trace_streamer/trace_streamer_selector.h +++ b/trace_streamer/src/trace_streamer/trace_streamer_selector.h @@ -62,12 +62,17 @@ public: void UpdateTaskPoolTraceStatus(bool status); void UpdateAppStartTraceStatus(bool status); void UpdateBinderRunnableTraceStatus(bool status); + void UpdateHMKernelTraceStatus(bool status); void InitMetricsMap(std::map& metricsMap); const std::string MetricsSqlQuery(const std::string& metrics); auto GetBytraceData() { return bytraceParser_.get(); } + auto GetRawtraceData() + { + return rawTraceParser_.get(); + } auto GetHtraceData() { return htraceParser_.get(); diff --git a/trace_streamer/src/version.cpp b/trace_streamer/src/version.cpp index 5515ade28..b093b5ca3 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 g_traceStreamerVersion = "3.5.22"; // version -const std::string g_traceStreamerPublishVersion = "2024/01/31"; // publish datetime +const std::string g_traceStreamerVersion = "4.0.2"; // version +const std::string g_traceStreamerPublishVersion = "2024/02/29"; // publish datetime } // namespace TraceStreamer } // namespace SysTuning -- Gitee From 41e9760c383016b99eae6aacfc9a3d1334d7fc92 Mon Sep 17 00:00:00 2001 From: zhangzepeng Date: Mon, 4 Mar 2024 17:23:27 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E2=80=99codeformat-check=E2=80=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangzepeng --- ide/src/trace/bean/StateModle.ts | 15 +++++++++++++++ .../parser/rawtrace_parser/rawtrace_parser.cpp | 1 - 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ide/src/trace/bean/StateModle.ts b/ide/src/trace/bean/StateModle.ts index efd5e584b..60ca7c956 100644 --- a/ide/src/trace/bean/StateModle.ts +++ b/ide/src/trace/bean/StateModle.ts @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2024 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. + */ + export class StateGroup { SleepingCount: number = 0; RunningCount: number = 0; diff --git a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp index 7b143c7cb..9830481ff 100644 --- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp @@ -236,7 +236,6 @@ bool RawTraceParser::ProcessRawTraceContent(std::string& bufferLine, uint8_t cur TS_CHECK_TRUE(HmParseCpuRawData(bufferLine, curType), false, "hm raw trace parse failed"); } if (traceDataCache_->isSplitFile_) { - // exactly uint32_t curSegSize = sizeof(type) + sizeof(len) + bufferLine.size(); curFileOffset_ += sizeof(uint32_t) + sizeof(uint32_t) + bufferLine.size(); } } else if (curType == static_cast(RawTraceContentType::CONTENT_TYPE_EVENTS_FORMAT)) { -- Gitee