diff --git a/ide/build.js b/ide/build.js index 4ead05d71f42e8573b2ebd108268626ca284d5df..17ea40aa71d11a237975315293478e11c628e01d 100644 --- a/ide/build.js +++ b/ide/build.js @@ -27,6 +27,15 @@ const sdkWams = [ 'trace_streamer_sdk_builtin.wasm', 'trace_streamer_dubai_builtin.js', 'trace_streamer_dubai_builtin.wasm', + 'trace_converter_builtin.js', + 'trace_converter_builtin.wasm', +]; + +const necessaryWams = [ + 'trace_streamer_builtin.js', + 'trace_streamer_builtin.wasm', + 'trace_converter_builtin.js', + 'trace_converter_builtin.wasm', ]; const staticPath = ['/src/img', '/server/cert', '/src/doc', '/src/figures']; @@ -155,19 +164,16 @@ function main() { let dest = path.normalize(path.join(__dirname, outDir, '/bin')); copyDirectory(traceStreamer, dest); // to mv traceStream Wasm and js - cpFile( - traceStreamer + '/trace_streamer_builtin.js', - rootPath + outDir + '/trace/database/trace_streamer_builtin.js' - ); - cpFile( - traceStreamer + '/trace_streamer_builtin.wasm', - rootPath + outDir + '/trace/database/trace_streamer_builtin.wasm' - ); if (sdkWams.length > 0) { sdkWams.forEach((fileName) => { cpFile(traceStreamer + '/' + fileName, rootPath + outDir + '/trace/database/' + fileName); }); } + if (necessaryWams.length > 0) { + necessaryWams.forEach((fileName) => { + cpFile(traceStreamer + '/' + fileName, rootPath + outDir + '/trace/database/' + fileName); + }); + } } else { log.error('traceStreamer dir is not Exits'); return; diff --git a/ide/package.json b/ide/package.json index cf9da3161d6f0bfefd95fcb91af08fc83277f17c..adc2039b77997eb8c743156d6f824156b00b4fc7 100644 --- a/ide/package.json +++ b/ide/package.json @@ -20,7 +20,8 @@ "!/dist/trace/database/worker.sql-wasm-debug.js", "!/dist/trace/database/trace_streamer_builtin.js", "!/dist/trace/database/trace_streamer_sdk_builtin.js", - "!/dist/trace/database/trace_streamer_dubai_builtin.js" + "!/dist/trace/database/trace_streamer_dubai_builtin.js", + "!/dist/trace/database/trace_converter_builtin.js" ], "globals": { "useWb": true diff --git a/ide/src/base-ui/drawer/LitDrawer.ts b/ide/src/base-ui/drawer/LitDrawer.ts index ec20ccb1527fd00cbc6d7c3b3169e29412ac4a31..08415d62b9b9bd7ef60f5fa3b1970875bb4500af 100644 --- a/ide/src/base-ui/drawer/LitDrawer.ts +++ b/ide/src/base-ui/drawer/LitDrawer.ts @@ -320,9 +320,7 @@ export class LitDrawer extends BaseElement { disconnectedCallback() {} //当 custom element被移动到新的文档时,被调用。 - adoptedCallback() { - - } + adoptedCallback() {} //当 custom element增加、删除、修改自身属性时,被调用。 attributeChangedCallback(name: string, oldValue: string, newValue: string) { diff --git a/ide/src/base-ui/icon.svg b/ide/src/base-ui/icon.svg index ff9b5bff07cac9fac9a4c5a6785e99a98a2f3159..3e4d09f3ff3cfc4c3d9efb85db2af2797f00efa2 100644 --- a/ide/src/base-ui/icon.svg +++ b/ide/src/base-ui/icon.svg @@ -1,328 +1,459 @@ - \ No newline at end of file diff --git a/ide/src/base-ui/menu/LitMainMenuItem.ts b/ide/src/base-ui/menu/LitMainMenuItem.ts index cb849d81e18b3598c37de58d0c1a79a0577d25f2..9a1e7793e9291e87d76b7a93727e000a85f9f6d9 100644 --- a/ide/src/base-ui/menu/LitMainMenuItem.ts +++ b/ide/src/base-ui/menu/LitMainMenuItem.ts @@ -79,24 +79,38 @@ export class LitMainMenuItem extends BaseElement { connectedCallback() { if (this.hasAttribute('file')) { if (this.fileEL) { - this.fileEL.addEventListener('change', () => { + this.fileEL!.addEventListener('change', (event) => { let files = this.fileEL!.files; if (files && files.length > 0) { - this.dispatchEvent( - new CustomEvent('file-change', { - // @ts-ignore - target: this, - detail: files[0], - }) - ); + if (this.titleEl!.textContent!.includes('long trace')) { + this.dispatchEvent( + new CustomEvent('file-change', { + // @ts-ignore + target: this, + // @ts-ignore + detail: event.target!.files, + }) + ); + } else { + this.dispatchEvent( + new CustomEvent('file-change', { + // @ts-ignore + target: this, + detail: files[0], + }) + ); + } if (this.fileEL) this.fileEL.value = ''; + if (this.fileEL) { + this.fileEL.value = ''; + } } }); } + this.addEventListener('click', (e) => { + e.stopPropagation(); + }); } - this.addEventListener('click', (e) => { - e.stopPropagation(); - }); } initHtml(): string { @@ -177,7 +191,20 @@ export class LitMainMenuItem extends BaseElement { attributeChangedCallback(name: string, oldValue: string, newValue: string) { switch (name) { case 'title': - if (this.titleEl) this.titleEl.textContent = newValue; + if (this.titleEl) { + this.titleEl.textContent = newValue; + if (newValue.includes('long trace')) { + this.fileEL!.setAttribute('multiple', ''); + this.fileEL!.setAttribute('webkitdirectory', ''); + this.fileEL!.setAttribute('directory', ''); + } else { + if (this.fileEL!.hasAttribute('multiple')) { + this.fileEL!.removeAttribute('multiple'); + this.fileEL!.removeAttribute('webkitdirectory'); + this.fileEL!.removeAttribute('directory'); + } + } + } break; case 'icon': if (this.iconEl) this.iconEl.setAttribute('name', newValue); diff --git a/ide/src/base-ui/modal/LitModal.ts b/ide/src/base-ui/modal/LitModal.ts index 8eb1b057a904be51fe682601659ba7b7e227b218..7471a369ec5404a29bf4406e2c86a8eda942b9b5 100644 --- a/ide/src/base-ui/modal/LitModal.ts +++ b/ide/src/base-ui/modal/LitModal.ts @@ -533,9 +533,7 @@ export class LitModal extends BaseElement { disconnectedCallback() {} //当 custom element被移动到新的文档时,被调用。 - adoptedCallback() { - - } + adoptedCallback() {} //当 custom element增加、删除、修改自身属性时,被调用。 attributeChangedCallback(name: string, oldValue: string, newValue: string) { diff --git a/ide/src/base-ui/popover/LitPopover.ts b/ide/src/base-ui/popover/LitPopover.ts index 3afff2453c13b9fd4609d449da90c9b5a7a6d44d..edc824a853fc3af1e8b220810b5dea0dc5d523cc 100644 --- a/ide/src/base-ui/popover/LitPopover.ts +++ b/ide/src/base-ui/popover/LitPopover.ts @@ -438,7 +438,10 @@ export class LitPopover extends BaseElement { const path = ev.composedPath && ev.composedPath(); if ( // @ts-ignore - this.popContent && !path.includes(this.popContent) && !path.includes(this.children[0]) && !path.includes(this.popContent) + this.popContent && + !path.includes(this.popContent) && + !path.includes(this.children[0]) && + !path.includes(this.popContent) ) { this.popContent!.open = false; } diff --git a/ide/src/base-ui/popover/LitPopoverV.ts b/ide/src/base-ui/popover/LitPopoverV.ts index 0e3a6a1325ca60662e58f5a74bb32db8f82f55b5..c3a02f89f6efd96ee880794bfc17731e65ff0a60 100644 --- a/ide/src/base-ui/popover/LitPopoverV.ts +++ b/ide/src/base-ui/popover/LitPopoverV.ts @@ -34,11 +34,11 @@ export class LitPopover extends BaseElement { } set placement(value) { - this.setAttribute('placement',value || 'bottomLeft'); + this.setAttribute('placement', value || 'bottomLeft'); } get placement() { - return this.getAttribute('placement') + return this.getAttribute('placement'); } get trigger() { diff --git a/ide/src/base-ui/table/LitPageTable.ts b/ide/src/base-ui/table/LitPageTable.ts index f661f1da3aa02888c0cba17ea45b8a3f500f62a7..753655a47ec3becab4d565dc22f87d343868914c 100644 --- a/ide/src/base-ui/table/LitPageTable.ts +++ b/ide/src/base-ui/table/LitPageTable.ts @@ -15,20 +15,19 @@ import { LitTableColumn } from './lit-table-column.js'; import { LitProgressBar } from './../progress-bar/LitProgressBar.js'; -import { BaseElement, element} from '../BaseElement.js'; +import { BaseElement, element } from '../BaseElement.js'; import '../utils/Template.js'; import { TableRowObject } from './TableRowObject.js'; import { JSONToCSV } from '../utils/CSVFormater.js'; @element('lit-page-table') export class LitPageTable extends BaseElement { - meauseRowElement: HTMLDivElement | undefined; currentRecycleList: HTMLDivElement[] = []; currentTreeDivList: HTMLDivElement[] = []; public rememberScrollTop = false; public getItemTextColor?: (data: any) => string; - public itemTextHandleMap: Map string> = new Map string>(); + public itemTextHandleMap: Map string> = new Map string>(); private ds: Array = []; public recycleDs: Array = []; private gridTemplateColumns: Array = []; @@ -53,7 +52,16 @@ export class LitPageTable extends BaseElement { private _loading: boolean = false; static get observedAttributes() { - return ['scroll-y', 'selectable', 'no-head', 'grid-line', 'defaultOrderColumn', 'hideDownload', 'loading', 'pagination']; + return [ + 'scroll-y', + 'selectable', + 'no-head', + 'grid-line', + 'defaultOrderColumn', + 'hideDownload', + 'loading', + 'pagination', + ]; } set loading(value: boolean) { @@ -143,14 +151,14 @@ export class LitPageTable extends BaseElement { this.currentPage = Math.max(this.currentPage - 1, 0); this.showCurrentPageData(); } - } + }; this.nextDiv!.onclick = () => { if (this.currentPage < this.ds.length - 1) { this.currentPage = Math.min(this.currentPage + 1, this.ds.length - 1); this.showCurrentPageData(); } - } - this.jumpDiv!.onclick= () => { + }; + this.jumpDiv!.onclick = () => { let value = this.targetPageInput!.value; let reg = /^[0-9]*$/; if (value.length > 0 && reg.test(value)) { @@ -169,7 +177,7 @@ export class LitPageTable extends BaseElement { } else { this.targetPageInput!.value = ''; } - } + }; } toTop() { @@ -734,19 +742,20 @@ export class LitPageTable extends BaseElement { private columnMinWidth: number = 50; private beforeResizeWidth1: number = 0; private beforeResizeWidth2: number = 0; - resizeEventHandler(header: HTMLDivElement, element: HTMLDivElement, index: number){ + resizeEventHandler(header: HTMLDivElement, element: HTMLDivElement, index: number) { header.addEventListener('mousemove', (event) => { if (this.isResize) { let width = event.clientX - this.resizeDownX; header.style.cursor = 'col-resize'; - let preWidth = this.beforeResizeWidth1, nowWidth = this.beforeResizeWidth2; + let preWidth = this.beforeResizeWidth1, + nowWidth = this.beforeResizeWidth2; if (width < 0) { preWidth = Math.max(this.beforeResizeWidth1 + width, this.columnMinWidth); - nowWidth = (this.beforeResizeWidth1 - preWidth) + this.beforeResizeWidth2; + nowWidth = this.beforeResizeWidth1 - preWidth + this.beforeResizeWidth2; } if (width > 0) { nowWidth = Math.max(this.beforeResizeWidth2 - width, this.columnMinWidth); - preWidth = (this.beforeResizeWidth2 - nowWidth) + this.beforeResizeWidth1; + preWidth = this.beforeResizeWidth2 - nowWidth + this.beforeResizeWidth1; } this.gridTemplateColumns[this.resizeColumnIndex - 1] = `${preWidth}px`; this.gridTemplateColumns[this.resizeColumnIndex] = `${nowWidth}px`; @@ -778,17 +787,17 @@ export class LitPageTable extends BaseElement { this.resizeColumnIndex = -1; header.style.cursor = 'pointer'; }); - element.addEventListener('mousedown', (event)=>{ + element.addEventListener('mousedown', (event) => { this.isResize = true; this.resizeColumnIndex = index; this.resizeDownX = event.clientX; - let pre = (header.childNodes.item(this.resizeColumnIndex - 1) as HTMLDivElement); - let now = (header.childNodes.item(this.resizeColumnIndex) as HTMLDivElement); + let pre = header.childNodes.item(this.resizeColumnIndex - 1) as HTMLDivElement; + let now = header.childNodes.item(this.resizeColumnIndex) as HTMLDivElement; this.beforeResizeWidth1 = pre.clientWidth; this.beforeResizeWidth2 = now.clientWidth; event.stopPropagation(); }); - element.addEventListener('click',(event) => { + element.addEventListener('click', (event) => { event.stopPropagation(); }); } @@ -839,7 +848,7 @@ export class LitPageTable extends BaseElement { meauseTreeElementHeight(rowData: any, depth: number) { return 27; } - + meauseAllRowHeight(list: any[]): TableRowObject[] { this.tbodyElement!.innerHTML = ''; this.meauseRowElement = undefined; @@ -867,7 +876,7 @@ export class LitPageTable extends BaseElement { } totalHeight += height; visibleObjects.push(tableRowObject); - } + }; let realIndex = 0; list.forEach((item, index) => { if (Array.isArray(item)) { @@ -1034,7 +1043,7 @@ export class LitPageTable extends BaseElement { } td.style.paddingLeft = rowData.depth * 15 + 'px'; if (!rowData.data.children || rowData.data.children.length === 0) { - td.style.paddingLeft = (15 * rowData.depth + 16) + 'px'; + td.style.paddingLeft = 15 * rowData.depth + 16 + 'px'; } (td as any).data = rowData.data; td.classList.add('tree-first-body'); @@ -1585,4 +1594,4 @@ export class LitPageTable extends BaseElement { if (!customElements.get('lit-page-table')) { customElements.define('lit-page-table', LitPageTable); -} \ No newline at end of file +} diff --git a/ide/src/base-ui/table/lit-table.ts b/ide/src/base-ui/table/lit-table.ts index 1ec70adeb42b236a51412ba619bf66f3c00f1f0d..439aee91c3bdffec47c893d72881a68ebdf80d28 100644 --- a/ide/src/base-ui/table/lit-table.ts +++ b/ide/src/base-ui/table/lit-table.ts @@ -998,7 +998,7 @@ export class LitTable extends HTMLElement { return visibleObjects; } - newTableRowObject(item: any, totalHeight: number, depth: number, parentNode?: TableRowObject) { + newTableRowObject(item: any, totalHeight: number, depth: number, parentNode?: TableRowObject): TableRowObject { let tableRowObject = new TableRowObject(); tableRowObject.depth = depth; tableRowObject.data = item; @@ -1480,9 +1480,9 @@ export class LitTable extends HTMLElement { if (text.indexOf('<') === -1) { td.title = text; } - // 如果表格中有模板的情况,将模板中的数据放进td中,没有模板,直接将文本放进td - // 但是对于Current Selection tab页来说,表格前两列是时间,第三列是input标签,第四列是button标签 - // 而第一行的数据只有第四列一个button,和模板中的数据并不一样,所以要特别处理一下 + // 如果表格中有模板的情况,将模板中的数据放进td中,没有模板,直接将文本放进td + // 但是对于Current Selection tab页来说,表格前两列是时间,第三列是input标签,第四列是button标签 + // 而第一行的数据只有第四列一个button,和模板中的数据并不一样,所以要特别处理一下 if (column.template) { if (dataIndex === 'color' && rowData.data.colorEl === undefined) { td.innerHTML = ''; @@ -1894,24 +1894,24 @@ export class LitTable extends HTMLElement { ); } - setCurrentSelection(selectionData: any) { + setCurrentSelection(selectionData: any): void { if (this.isRecycleList) { - if (selectionData.isSelected != undefined) { + if (selectionData.isSelected !== undefined) { this.currentTreeDivList.forEach((itemEl) => { - if ((itemEl as any).data == selectionData) { + if ((itemEl as any).data === selectionData) { this.setSelectedRow(selectionData.isSelected, [itemEl]); } }); this.currentRecycleList.forEach((recycleItem) => { - if ((recycleItem as any).data == selectionData) { + if ((recycleItem as any).data === selectionData) { this.setSelectedRow(selectionData.isSelected, [recycleItem]); } }); } } else { - if (selectionData.isSelected != undefined) { + if (selectionData.isSelected !== undefined) { this.normalDs.forEach((item) => { - if ((item as any).data == selectionData) { + if ((item as any).data === selectionData) { this.setSelectedRow(selectionData.isSelected, [item]); } }); @@ -1919,27 +1919,27 @@ export class LitTable extends HTMLElement { } } - setCurrentHover(data: any) { + setCurrentHover(data: any): void { if (this.isRecycleList) { this.setMouseIn(false, this.currentTreeDivList); this.setMouseIn(false, this.currentRecycleList); - if (data.isHover != undefined) { + if (data.isHover !== undefined) { this.currentTreeDivList.forEach((hoverItem) => { - if ((hoverItem as any).data == data) { + if ((hoverItem as any).data === data) { this.setMouseIn(data.isHover, [hoverItem]); } }); this.currentRecycleList.forEach((hoverItem) => { - if ((hoverItem as any).data == data) { + if ((hoverItem as any).data === data) { this.setMouseIn(data.isHover, [hoverItem]); } }); } } else { this.setMouseIn(false, this.normalDs); - if (data.isHover != undefined) { - this.normalDs.forEach((item) => { - if ((item as any).data == data) { + if (data.isHover !== undefined) { + this.normalDs.forEach((item): void => { + if ((item as any).data === data) { this.setMouseIn(data.isHover, [item]); } }); @@ -1947,13 +1947,13 @@ export class LitTable extends HTMLElement { } } - dispatchRowClickEventIcon(rowData: any, elements: any[]) { + dispatchRowClickEventIcon(rowData: any, elements: any[]): void { this.dispatchEvent( new CustomEvent('icon-click', { detail: { ...rowData.data, data: rowData.data, - callBack: (isSelected: boolean) => { + callBack: (isSelected: boolean): void => { //是否爲单选 if (isSelected) { this.clearAllSelection(rowData.data); @@ -1966,13 +1966,13 @@ export class LitTable extends HTMLElement { ); } - dispatchRowClickEvent(rowObject: any, elements: any[]) { + dispatchRowClickEvent(rowObject: any, elements: any[]): void { this.dispatchEvent( new CustomEvent('row-click', { detail: { ...rowObject.data, data: rowObject.data, - callBack: (isSelected: boolean) => { + callBack: (isSelected: boolean): void => { //是否爲单选 if (isSelected) { this.clearAllSelection(rowObject.data); @@ -1985,12 +1985,12 @@ export class LitTable extends HTMLElement { ); } - dispatchRowHoverEvent(rowObject: any, elements: any[]) { + dispatchRowHoverEvent(rowObject: any, elements: any[]): void { this.dispatchEvent( new CustomEvent('row-hover', { detail: { data: rowObject.data, - callBack: () => { + callBack: (): void => { this.clearAllHover(rowObject.data); this.setMouseIn(rowObject.data.isHover, elements); }, @@ -2000,7 +2000,7 @@ export class LitTable extends HTMLElement { ); } - formatName(key: string, name: any) { + formatName(key: string, name: any): any { let content = name; if (this.itemTextHandleMap.has(key)) { content = this.itemTextHandleMap.get(key)?.(name) || ''; @@ -2011,7 +2011,7 @@ export class LitTable extends HTMLElement { return ''; } - setHighLight(isSearch: boolean, element: any) { + setHighLight(isSearch: boolean, element: any): void { if (isSearch) { element.setAttribute('high-light', ''); } else { @@ -2019,7 +2019,7 @@ export class LitTable extends HTMLElement { } } - createTextColor(rowData: any, divElement: any) { + createTextColor(rowData: any, divElement: any): void { let nodeText = document.createElement('text'); nodeText.classList.add('functionName'); nodeText.textContent = rowData.data.name; diff --git a/ide/src/base-ui/tabs/lit-tabs.ts b/ide/src/base-ui/tabs/lit-tabs.ts index 2bb7e198b5055fba3a89ecaaf85d7123737a1240..e4ff18d9413407f78078db2742266a198634a52d 100644 --- a/ide/src/base-ui/tabs/lit-tabs.ts +++ b/ide/src/base-ui/tabs/lit-tabs.ts @@ -665,17 +665,17 @@ export class LitTabs extends HTMLElement { let span = a.querySelector('span') as HTMLSpanElement; let title = span.innerText; let rowType = document - .querySelector('sp-application')! - .shadowRoot?.querySelector('sp-system-trace')! - .getAttribute('clickRow'); + .querySelector('sp-application')! + .shadowRoot?.querySelector('sp-system-trace')! + .getAttribute('clickRow'); if (title === 'Counters' || title === 'Thread States') { title += `(${rowType})`; } if (title === 'Analysis') { let rowId = document - .querySelector('sp-application')! - .shadowRoot?.querySelector('sp-system-trace')! - .getAttribute('rowId'); + .querySelector('sp-application')! + .shadowRoot?.querySelector('sp-system-trace')! + .getAttribute('rowId'); if (rowId!.indexOf('DiskIOLatency') > -1) { title += '(disk-io)'; } else if (rowId!.indexOf('VirtualMemory') > -1) { diff --git a/ide/src/base-ui/tree/LitTree.ts b/ide/src/base-ui/tree/LitTree.ts index bbd105bd616ed15bc2b89096d095dbd2004fc24e..9890d8bbcb67ce39a44ab43c8eb8e723355792b1 100644 --- a/ide/src/base-ui/tree/LitTree.ts +++ b/ide/src/base-ui/tree/LitTree.ts @@ -13,9 +13,9 @@ * limitations under the License. */ -import './LitTreeNode.js' +import './LitTreeNode.js'; import { BaseElement, element } from '../BaseElement.js'; -import { LitTreeNode } from './LitTreeNode.js'; +import { type LitTreeNode } from './LitTreeNode.js'; export interface TreeItemData { key: string; @@ -28,7 +28,6 @@ export interface TreeItemData { @element('lit-tree') export class LitTree extends BaseElement { - private _treeData: Array = []; private currentSelectedNode: any; private currentSelectedData: any; @@ -38,7 +37,7 @@ export class LitTree extends BaseElement { private srcDragElement: any; private dragDirection: string | null | undefined; - static get observedAttributes() { + static get observedAttributes(): string[] { return ['show-line', 'show-icon', 'checkable', 'foldable', 'dragable', 'multiple']; //foldable 表示点击目录是否可以折叠 } @@ -50,10 +49,10 @@ export class LitTree extends BaseElement { /*双向绑定*/ const handler = { - get: (target: any, propkey: any) => { + get: (target: any, propkey: any): any => { return target[propkey]; }, - set: (target: any, propkey: any, value: any, receiver: any) => { + set: (target: any, propkey: any, value: any, receiver: any): boolean => { if (target[propkey] !== value) { if (!value.children) { value.children = new Proxy([], handler); @@ -70,7 +69,7 @@ export class LitTree extends BaseElement { this.currentSelectedNode.setAttribute('show-arrow', 'true'); let ul = document.createElement('ul'); // @ts-ignore - ul.open = 'true' + ul.open = 'true'; ul.style.transition = '.3s all'; this.currentSelectedNode.parentElement.append(ul); this.currentSelectedNode.arrow = true; @@ -79,17 +78,17 @@ export class LitTree extends BaseElement { } } return true; - } + }, }; - let setProxy = (v: Array) => { - v.forEach(a => { + let setProxy = (v: Array): void => { + v.forEach((a) => { if (!a.children) { a.children = new Proxy([], handler); } else { a.children = new Proxy(a.children, handler); setProxy(a.children || []); } - }) + }); }; setProxy(this._treeData); this.proxyData = new Proxy(this._treeData, handler); @@ -97,17 +96,17 @@ export class LitTree extends BaseElement { set multiple(value: boolean) { if (value) { - this.setAttribute('multiple',''); + this.setAttribute('multiple', ''); } else { this.removeAttribute('multiple'); } } - get multiple() { + get multiple(): boolean { return this.hasAttribute('multiple'); } - get treeData() { + get treeData(): TreeItemData[] { return this.proxyData; } @@ -128,51 +127,57 @@ export class LitTree extends BaseElement { } //当 custom element首次被插入文档DOM时,被调用。 - connectedCallback() { - this.onclick = ev => { + connectedCallback(): void { + this.onclick = (ev): void => { this.contextMenu!.style.display = 'none'; this.currentSelectedData = null; this.currentSelectedNode = null; this.selectedNode(null); - } + }; } - getCheckdKeys() { + getCheckdKeys(): any[] { return Array.from(this.shadowRoot!.querySelectorAll('lit-tree-node[checked]')).map((a: any) => a.data.key); } - getCheckdNodes() { + getCheckdNodes(): any[] { return Array.from(this.shadowRoot!.querySelectorAll('lit-tree-node[checked]')).map((a: any) => a.data); } //展开所有节点 - expandKeys(keys: Array) { - keys.forEach(k => this.shadowRoot!.querySelectorAll(`lit-tree-node[key='${k}']`).forEach((b: any) => b.expand())); + expandKeys(keys: Array): void { + keys.forEach((k) => this.shadowRoot!.querySelectorAll(`lit-tree-node[key='${k}']`).forEach((b: any) => b.expand())); } //收起所有节点 - collapseKeys(keys: Array) { - keys.forEach(k => this.shadowRoot!.querySelectorAll(`lit-tree-node[key='${k}']`).forEach((b: any) => b.collapse())); + collapseKeys(keys: Array): void { + keys.forEach((k) => + this.shadowRoot!.querySelectorAll(`lit-tree-node[key='${k}']`).forEach((b: any) => b.collapse()) + ); } - checkedKeys(keys: Array) { - keys.forEach(k => this.shadowRoot!.querySelectorAll(`lit-tree-node[key='${k}']`).forEach((b: any) => { - b.setAttribute('checked', 'true'); - b.checkHandler(); - })); + checkedKeys(keys: Array): void { + keys.forEach((k) => + this.shadowRoot!.querySelectorAll(`lit-tree-node[key='${k}']`).forEach((b: any) => { + b.setAttribute('checked', 'true'); + b.checkHandler(); + }) + ); } - uncheckedKeys(keys: Array) { - keys.forEach(k => this.shadowRoot!.querySelectorAll(`lit-tree-node[key='${k}']`).forEach((b: any) => { - b.removeAttribute('checked'); - b.removeAttribute('missing'); - b.checkHandler(); - })); + uncheckedKeys(keys: Array): void { + keys.forEach((k) => + this.shadowRoot!.querySelectorAll(`lit-tree-node[key='${k}']`).forEach((b: any) => { + b.removeAttribute('checked'); + b.removeAttribute('missing'); + b.checkHandler(); + }) + ); } - drawTree(parent: any, array: Array, topDepth: boolean = false) { + drawTree(parent: any, array: Array, topDepth: boolean = false): void { let that = this; - array.forEach(a => { + array.forEach((a) => { let li = document.createElement('li'); let node: LitTreeNode = document.createElement('lit-tree-node') as LitTreeNode; node.title = a.title; @@ -184,31 +189,31 @@ export class LitTree extends BaseElement { e.preventDefault(); }; //在拖动目标上触发事件 (源元素) - node.ondrag = ev => this.onDrag(ev);//元素正在拖动时触发 - node.ondragstart = ev => this.onDragStart(ev);//用户开始拖动元素时触发 - node.ondragend = ev => this.onDragEnd(ev);// 用户完成元素拖动后触发 + node.ondrag = (ev) => this.onDrag(ev); //元素正在拖动时触发 + node.ondragstart = (ev) => this.onDragStart(ev); //用户开始拖动元素时触发 + node.ondragend = (ev) => this.onDragEnd(ev); // 用户完成元素拖动后触发 //释放目标时触发的事件: - node.ondragenter = ev => this.onDragEnter(ev);//当被鼠标拖动的对象进入其容器范围内时触发此事件 - node.ondragover = ev => this.onDragOver(ev);//当某被拖动的对象在另一对象容器范围内拖动时触发此事件 - node.ondragleave = ev => this.onDragLeave(ev);//当被鼠标拖动的对象离开其容器范围内时触发此事件 - node.ondrop = ev => this.onDrop(ev);//在一个拖动过程中,释放鼠标键时触发此事件 + node.ondragenter = (ev) => this.onDragEnter(ev); //当被鼠标拖动的对象进入其容器范围内时触发此事件 + node.ondragover = (ev) => this.onDragOver(ev); //当某被拖动的对象在另一对象容器范围内拖动时触发此事件 + node.ondragleave = (ev) => this.onDragLeave(ev); //当被鼠标拖动的对象离开其容器范围内时触发此事件 + node.ondrop = (ev) => this.onDrop(ev); //在一个拖动过程中,释放鼠标键时触发此事件 } node.selected = a.selected || false; //是否选中行 - node.checked = a.checked || false;// 是否勾选 + node.checked = a.checked || false; // 是否勾选 node.data = a; - node.addEventListener('change', (e: any) => { + node.addEventListener('change', (e: any): void => { if (e.detail && !this.multiple) { - this.nodeList.forEach(item => { + this.nodeList.forEach((item) => { item.checked = item.data!.key === node.data!.key; item.data!.checked = item.checked; }); } - var litTreeNodes = this.nodeList.filter(it => it.checked); + var litTreeNodes = this.nodeList.filter((it) => it.checked); if (litTreeNodes.length === 0) { node.checked = true; node.data!.checked = true; } - that.dispatchEvent(new CustomEvent('onChange', {detail: {data: (node as any).data, checked: e.detail}})); + that.dispatchEvent(new CustomEvent('onChange', { detail: { data: (node as any).data, checked: e.detail } })); }); node.multiple = this.hasAttribute('multiple'); node.checkable = this.getAttribute('checkable') || 'false'; @@ -226,7 +231,7 @@ export class LitTree extends BaseElement { if (a.icon) { (node as any).iconName = a.icon; } else { - (node as any).iconName = 'folder' + (node as any).iconName = 'folder'; } } else { node.iconName = ''; @@ -246,25 +251,25 @@ export class LitTree extends BaseElement { } node.arrow = false; } - li.onclick = (e) => { - e.stopPropagation() + li.onclick = (e): void => { + e.stopPropagation(); if (this.hasAttribute('foldable')) { // @ts-ignore if (li.data.children && li.data.children.length > 0) { node.autoExpand(); } else { // @ts-ignore - this.dispatchEvent(new CustomEvent('onSelect', {detail: li.data})) + this.dispatchEvent(new CustomEvent('onSelect', { detail: li.data })); this.selectedNode(node); } } else { // @ts-ignore - this.dispatchEvent(new CustomEvent('onSelect', {detail: li.data})) + this.dispatchEvent(new CustomEvent('onSelect', { detail: li.data })); this.selectedNode(node); } }; // node 添加右键菜单功能 - node.oncontextmenu = ev => { + node.oncontextmenu = (ev): void => { ev.preventDefault(); this.selectedNode(node); this.currentSelectedNode = node; @@ -274,7 +279,7 @@ export class LitTree extends BaseElement { this.contextMenu!.style.top = ev.pageY + 'px'; }; }); - this.oncontextmenu = ev => { + this.oncontextmenu = (ev): void => { ev.preventDefault(); this.contextMenu!.style.display = 'block'; this.contextMenu!.style.left = ev.pageX + 'px'; @@ -283,74 +288,79 @@ export class LitTree extends BaseElement { } //取消所有节点的选中状态 然后选中当前node节点 - selectedNode(node: LitTreeNode | null | undefined) { + selectedNode(node: LitTreeNode | null | undefined): void { this.shadowRoot!.querySelectorAll('lit-tree-node').forEach((a) => { a.selected = false; - }) + }); if (node) { node.selected = true; } } - closeContextMenu() { + closeContextMenu(): void { this.contextMenu!.style.display = 'none'; } - onDrag(e: MouseEvent) { + onDrag(e: MouseEvent): void {} - } - - onDragStart(ev: MouseEvent) { + onDragStart(ev: MouseEvent): undefined { this.srcDragElement = ev.target; (ev.target! as LitTreeNode).open = 'true'; (ev.target! as LitTreeNode).autoExpand(); return undefined; } - onDragEnd(ev: MouseEvent) { + onDragEnd(ev: MouseEvent): undefined { this.srcDragElement = null; return undefined; } - onDragEnter(ev: MouseEvent) { + onDragEnter(ev: MouseEvent): undefined { (ev.target as LitTreeNode).style.backgroundColor = '#42b98333'; return undefined; } - onDragOver(ev: MouseEvent) { + onDragOver(ev: MouseEvent): undefined { let node = ev.target as LitTreeNode; - if (this.srcDragElement.data.key === node.data!.key) return; + if (this.srcDragElement.data.key === node.data!.key) { + return; + } let rect = (ev.currentTarget! as any).getBoundingClientRect(); - if (ev.clientX >= rect.left + rect.width / 3 && ev.clientX < rect.left + rect.width) { //bottom-right + if (ev.clientX >= rect.left + rect.width / 3 && ev.clientX < rect.left + rect.width) { + //bottom-right this.dragDirection = 'bottom-right'; node.drawLine('bottom-right'); - } else if (ev.clientY >= rect.top && ev.clientY < rect.top + rect.height / 2) {//上面 + } else if (ev.clientY >= rect.top && ev.clientY < rect.top + rect.height / 2) { + //上面 this.dragDirection = 'top'; node.drawLine('top'); - } else if (ev.clientY <= rect.bottom && ev.clientY > rect.top + rect.height / 2) {//下面 + } else if (ev.clientY <= rect.bottom && ev.clientY > rect.top + rect.height / 2) { + //下面 this.dragDirection = 'bottom'; node.drawLine('bottom'); } return undefined; } - onDragLeave(ev: MouseEvent) { + onDragLeave(ev: MouseEvent): undefined { (ev.target as LitTreeNode).style.backgroundColor = '#ffffff00'; (ev.target as LitTreeNode).drawLine(''); return undefined; } - onDrop(ev: MouseEvent) { + onDrop(ev: MouseEvent): undefined { (ev.target as LitTreeNode).style.backgroundColor = '#ffffff00'; (ev.target as LitTreeNode).drawLine(''); //移动的不是node节点 而是上层的li节点 - let srcData = this.srcDragElement.data;//获取原节点的data数据 - let dstData = (ev.target as LitTreeNode).data;//获取目标节点的data数据 - if (srcData.key === dstData!.key) return;//同一个节点不用处理 + let srcData = this.srcDragElement.data; //获取原节点的data数据 + let dstData = (ev.target as LitTreeNode).data; //获取目标节点的data数据 + if (srcData.key === dstData!.key) { + return; + } //同一个节点不用处理 let srcElement = this.srcDragElement.parentElement; let srcParentElement = srcElement.parentElement; let dstElement = (ev.target as LitTreeNode).parentElement; - srcElement.parentElement.removeChild(srcElement);//node li ul 从 ul 中移除 li + srcElement.parentElement.removeChild(srcElement); //node li ul 从 ul 中移除 li if (this.dragDirection === 'top') { dstElement!.parentElement!.insertBefore(srcElement, dstElement); } else if (this.dragDirection === 'bottom') { @@ -362,32 +372,38 @@ export class LitTree extends BaseElement { ul.style.cssText = 'transition: all 0.3s ease 0s;'; dstElement!.appendChild(ul); } - dstElement!.querySelector('lit-tree-node')!.arrow = true;//拖动进入子节点,需要开启箭头 + dstElement!.querySelector('lit-tree-node')!.arrow = true; //拖动进入子节点,需要开启箭头 ul.appendChild(srcElement); } - let ul1 = dstElement!.querySelector('ul');//如果拖动后目标节点的子节点没有记录,需要关闭arrow箭头 + let ul1 = dstElement!.querySelector('ul'); //如果拖动后目标节点的子节点没有记录,需要关闭arrow箭头 if (ul1) { - if (ul1.childElementCount == 0) (ul1.previousElementSibling! as LitTreeNode).arrow = false; + if (ul1.childElementCount === 0) { + (ul1.previousElementSibling! as LitTreeNode).arrow = false; + } } - if (srcParentElement.childElementCount === 0) srcParentElement.previousElementSibling.arrow = false;//如果拖动的原节点的父节点没有子节点需要 关闭arrow箭头 + if (srcParentElement.childElementCount === 0) { + srcParentElement.previousElementSibling.arrow = false; + } //如果拖动的原节点的父节点没有子节点需要 关闭arrow箭头 //拖动调整结构后修改 data树形数据结构 this.removeDataNode(this._treeData, srcData); this.addDataNode(this._treeData, srcData, dstData!.key, this.dragDirection!); - this.dispatchEvent(new CustomEvent('drop', { - detail: { - treeData: this._treeData, - srcData: srcData, - dstData: dstData, - type: this.dragDirection - } - })) + this.dispatchEvent( + new CustomEvent('drop', { + detail: { + treeData: this._treeData, + srcData: srcData, + dstData: dstData, + type: this.dragDirection, + }, + }) + ); ev.stopPropagation(); return undefined; } //移除treeData中指定的节点 通过key匹配 - removeDataNode(arr: Array, d: TreeItemData) { - let delIndex = arr.findIndex(v => v.key === d.key); + removeDataNode(arr: Array, d: TreeItemData): void { + let delIndex = arr.findIndex((v) => v.key === d.key); if (delIndex > -1) { arr.splice(delIndex, 1); return; @@ -400,11 +416,13 @@ export class LitTree extends BaseElement { } //中array中匹配到key为k的节点, t='bottom-right' 把d加入到该节点的children中去 t='top' 添加到找到的节点前面 t='bottom' 添加到找到的节点后面 - addDataNode(arr: Array, d: TreeItemData, k: string, t: string) { + addDataNode(arr: Array, d: TreeItemData, k: string, t: string): void { for (let i = 0; i < arr.length; i++) { if (arr[i].key === k) { if (t === 'bottom-right') { - if (!arr[i].children) arr[i].children = []; + if (!arr[i].children) { + arr[i].children = []; + } arr[i].children!.push(d); } else if (t === 'top') { arr.splice(i, 0, d); @@ -413,12 +431,14 @@ export class LitTree extends BaseElement { } return; } else { - if (arr[i].children) this.addDataNode(arr[i].children || [], d, k, t); + if (arr[i].children) { + this.addDataNode(arr[i].children || [], d, k, t); + } } } } - insert(obj: TreeItemData) { + insert(obj: TreeItemData): void { if (this.currentSelectedData) { this.currentSelectedData.children.push(obj); } else { @@ -426,48 +446,50 @@ export class LitTree extends BaseElement { } } - _insertNode(parent: any, a: any) { - if (!parent) parent = this.shadowRoot!.querySelector('#root'); + _insertNode(parent: any, a: any): void { + if (!parent) { + parent = this.shadowRoot!.querySelector('#root'); + } let li = document.createElement('li'); let insertNode = document.createElement('lit-tree-node') as LitTreeNode; insertNode.title = a.title; insertNode.setAttribute('key', a.key); if (this.hasAttribute('dragable')) { insertNode.draggable = true; - document.ondragover = function (e) { + document.ondragover = function (e): void { e.preventDefault(); - } + }; //在拖动目标上触发事件 (源元素) - insertNode.ondrag = ev => this.onDrag(ev);//元素正在拖动时触发 - insertNode.ondragstart = ev => this.onDragStart(ev);//用户开始拖动元素时触发 - insertNode.ondragend = ev => this.onDragEnd(ev);// 用户完成元素拖动后触发 + insertNode.ondrag = (ev): void => this.onDrag(ev); //元素正在拖动时触发 + insertNode.ondragstart = (ev): undefined => this.onDragStart(ev); //用户开始拖动元素时触发 + insertNode.ondragend = (ev): undefined => this.onDragEnd(ev); // 用户完成元素拖动后触发 //释放目标时触发的事件: - insertNode.ondragenter = ev => this.onDragEnter(ev);//当被鼠标拖动的对象进入其容器范围内时触发此事件 - insertNode.ondragover = ev => this.onDragOver(ev);//当某被拖动的对象在另一对象容器范围内拖动时触发此事件 - insertNode.ondragleave = ev => this.onDragLeave(ev);//当被鼠标拖动的对象离开其容器范围内时触发此事件 - insertNode.ondrop = ev => this.onDrop(ev);//在一个拖动过程中,释放鼠标键时触发此事件 + insertNode.ondragenter = (ev): undefined => this.onDragEnter(ev); //当被鼠标拖动的对象进入其容器范围内时触发此事件 + insertNode.ondragover = (ev): undefined => this.onDragOver(ev); //当某被拖动的对象在另一对象容器范围内拖动时触发此事件 + insertNode.ondragleave = (ev): undefined => this.onDragLeave(ev); //当被鼠标拖动的对象离开其容器范围内时触发此事件 + insertNode.ondrop = (ev): undefined => this.onDrop(ev); //在一个拖动过程中,释放鼠标键时触发此事件 } insertNode.selected = a.selected || false; //是否选中行 - insertNode.checked = a.checked || false;// 是否勾选 + insertNode.checked = a.checked || false; // 是否勾选 insertNode.data = a; insertNode.addEventListener('change', (e: any) => { if (e.detail && !this.multiple) { - this.nodeList.forEach(node => { + this.nodeList.forEach((node) => { node.checked = node.data!.key === insertNode.data!.key; }); } - this.dispatchEvent(new CustomEvent('onChange', {detail: {data: insertNode.data, checked: e.detail}})); - }) + this.dispatchEvent(new CustomEvent('onChange', { detail: { data: insertNode.data, checked: e.detail } })); + }); this.nodeList.push(insertNode); insertNode.checkable = this.getAttribute('checkable') || 'false'; insertNode.multiple = this.hasAttribute('multiple'); // @ts-ignore li.data = a; li.append(insertNode); - parent.append(li) + parent.append(li); let ul = document.createElement('ul'); // @ts-ignore - ul.open = 'true' + ul.open = 'true'; ul.style.transition = '.3s all'; if (a.children && a.children.length > 0) { if (this.hasAttribute('show-icon')) { @@ -494,25 +516,25 @@ export class LitTree extends BaseElement { } insertNode.arrow = false; } - li.onclick = (e) => { - e.stopPropagation() + li.onclick = (e): void => { + e.stopPropagation(); if (this.hasAttribute('foldable')) { // @ts-ignore if (li.data.children && li.data.children.length > 0) { insertNode.autoExpand(); } else { // @ts-ignore - this.dispatchEvent(new CustomEvent('onSelect', {detail: li.data})); + this.dispatchEvent(new CustomEvent('onSelect', { detail: li.data })); this.selectedNode(insertNode); } } else { // @ts-ignore - this.dispatchEvent(new CustomEvent('onSelect', {detail: li.data})); + this.dispatchEvent(new CustomEvent('onSelect', { detail: li.data })); this.selectedNode(insertNode); } - } + }; // node 添加右键菜单功能 - insertNode.oncontextmenu = (ev) => { + insertNode.oncontextmenu = (ev): void => { ev.preventDefault(); this.selectedNode(insertNode); this.currentSelectedNode = insertNode; @@ -578,4 +600,4 @@ export class LitTree extends BaseElement { if (!customElements.get('lit-tree')) { customElements.define('lit-tree', LitTree); -} \ No newline at end of file +} diff --git a/ide/src/base-ui/tree/LitTreeNode.ts b/ide/src/base-ui/tree/LitTreeNode.ts index 45ee60ff4feae511346f57995c821bb781c3e8ef..a89002870b5f602cb4212a09efa90e97f0d0145f 100644 --- a/ide/src/base-ui/tree/LitTreeNode.ts +++ b/ide/src/base-ui/tree/LitTreeNode.ts @@ -13,27 +13,39 @@ * limitations under the License. */ -import '../icon/LitIcon.js' -import '../checkbox/LitCheckBox.js' +import '../icon/LitIcon.js'; +import '../checkbox/LitCheckBox.js'; import { BaseElement, element } from '../BaseElement.js'; -import { LitCheckBox } from '../checkbox/LitCheckBox.js'; -import { LitIcon } from '../icon/LitIcon.js'; -import { TreeItemData } from './LitTree.js'; +import { type LitCheckBox } from '../checkbox/LitCheckBox.js'; +import { type LitIcon } from '../icon/LitIcon.js'; +import { type TreeItemData } from './LitTree.js'; @element('lit-tree-node') export class LitTreeNode extends BaseElement { - private arrowElement: HTMLSpanElement | null | undefined; private itemElement: HTMLDivElement | null | undefined; private checkboxElement: LitCheckBox | null | undefined; private iconElement: LitIcon | null | undefined; private _data: TreeItemData | null | undefined; - static get observedAttributes() { - return ['icon-name', 'icon-size', 'color', 'path', 'title', 'arrow', 'checkable', 'selected', 'checked', 'missing', 'multiple', 'top-depth']; - } - - get checkable() { + static get observedAttributes(): string[] { + return [ + 'icon-name', + 'icon-size', + 'color', + 'path', + 'title', + 'arrow', + 'checkable', + 'selected', + 'checked', + 'missing', + 'multiple', + 'top-depth', + ]; + } + + get checkable(): string { return this.getAttribute('checkable') || 'false'; } @@ -41,7 +53,7 @@ export class LitTreeNode extends BaseElement { this._data = value; } - get data() { + get data(): TreeItemData | null | undefined { return this._data; } @@ -61,12 +73,11 @@ export class LitTreeNode extends BaseElement { } } - get multiple() { + get multiple(): boolean { return this.hasAttribute('multiple'); } - - get iconName() { + get iconName(): string { return this.getAttribute('icon-name') || ''; } @@ -74,7 +85,7 @@ export class LitTreeNode extends BaseElement { this.setAttribute('icon-name', value); } - get topDepth() { + get topDepth(): boolean { return this.hasAttribute('top-depth'); } @@ -86,7 +97,7 @@ export class LitTreeNode extends BaseElement { } } - get arrow() { + get arrow(): boolean { return this.hasAttribute('arrow'); } @@ -98,7 +109,7 @@ export class LitTreeNode extends BaseElement { } } - get open() { + get open(): string { return this.getAttribute('open') || 'true'; } @@ -106,7 +117,7 @@ export class LitTreeNode extends BaseElement { this.setAttribute('open', value); } - get selected() { + get selected(): boolean { return this.hasAttribute('selected'); } @@ -118,7 +129,7 @@ export class LitTreeNode extends BaseElement { } } - get checked() { + get checked(): boolean { return this.hasAttribute('checked'); } @@ -135,30 +146,30 @@ export class LitTreeNode extends BaseElement { this.iconElement = this.shadowRoot!.querySelector('#icon'); this.itemElement = this.shadowRoot!.querySelector('#item'); this.checkboxElement = this.shadowRoot!.querySelector('#checkbox'); - this.arrowElement!.onclick = (e) => { + this.arrowElement!.onclick = (e): void => { e.stopPropagation(); this.autoExpand(); - } - this.checkboxElement!.onchange = (e: any) => { + }; + this.checkboxElement!.onchange = (e: any): boolean => { e.stopPropagation(); this.onChange(e.detail.checked); return false; - } + }; //这里需要给checkbox 添加onclick时间 并停止冒泡,不然onchange事件会触发父节点中的 onclick事件 - this.checkboxElement!.onclick = (e) => { + this.checkboxElement!.onclick = (e): void => { e.stopPropagation(); }; - this.itemElement!.onclick = (e) => { + this.itemElement!.onclick = (e): void => { e.stopPropagation(); this.onChange(!this.data?.checked); }; } - onChange(checked: boolean) { + onChange(checked: boolean): void { this.checked = checked; this.data!.checked = checked; this.checkHandler(); - this.dispatchEvent(new CustomEvent('change', {detail: checked})); + this.dispatchEvent(new CustomEvent('change', { detail: checked })); } initHtml(): string { @@ -320,16 +331,18 @@ export class LitTreeNode extends BaseElement { ${this.title} - ` + `; } //当 custom element首次被插入文档DOM时,被调用。 - connectedCallback() { - if (this.hasAttribute('checked')) this.checkboxElement!.checked = true; + connectedCallback(): void { + if (this.hasAttribute('checked')) { + this.checkboxElement!.checked = true; + } this.checkHandler(); } - checkHandler() { + checkHandler(): void { if (this.checked) { this.removeAttribute('missing'); } @@ -341,45 +354,56 @@ export class LitTreeNode extends BaseElement { a.removeAttribute('missing'); }); } else { - this.nextElementSibling.querySelectorAll('lit-tree-node').forEach((a: any) => a.checked = false); + this.nextElementSibling.querySelectorAll('lit-tree-node').forEach((a: any) => (a.checked = false)); } } - let setCheckStatus = (element: any) => { - if (element.parentElement.parentElement.previousElementSibling && element.parentElement.parentElement.previousElementSibling.tagName === 'LIT-TREE-NODE') { - let allChecked = Array.from(element.parentElement.parentElement.querySelectorAll('lit-tree-node')).every((item: any) => item.checked); - let someChecked = Array.from(element.parentElement.parentElement.querySelectorAll('lit-tree-node')).some((item: any, index, array) => item.checked); + let setCheckStatus = (element: any): void => { + if ( + element.parentElement.parentElement.previousElementSibling && + element.parentElement.parentElement.previousElementSibling.tagName === 'LIT-TREE-NODE' + ) { + let allChecked = Array.from(element.parentElement.parentElement.querySelectorAll('lit-tree-node')).every( + (item: any) => item.checked + ); + let someChecked = Array.from(element.parentElement.parentElement.querySelectorAll('lit-tree-node')).some( + (item: any, index, array) => item.checked + ); if (allChecked === true) { element.parentElement.parentElement.previousElementSibling.checked = true; element.parentElement.parentElement.previousElementSibling.removeAttribute('missing'); } else if (someChecked) { - element.parentElement.parentElement.previousElementSibling.setAttribute('missing', '') - element.parentElement.parentElement.previousElementSibling.removeAttribute('checked') + element.parentElement.parentElement.previousElementSibling.setAttribute('missing', ''); + element.parentElement.parentElement.previousElementSibling.removeAttribute('checked'); } else { - element.parentElement.parentElement.previousElementSibling.removeAttribute('missing') - element.parentElement.parentElement.previousElementSibling.removeAttribute('checked') + element.parentElement.parentElement.previousElementSibling.removeAttribute('missing'); + element.parentElement.parentElement.previousElementSibling.removeAttribute('checked'); } - setCheckStatus(element.parentElement.parentElement.previousElementSibling) + setCheckStatus(element.parentElement.parentElement.previousElementSibling); } - } + }; setCheckStatus(this); } } - expand() { - if (this.open === 'true') return; + expand(): void { + if (this.open === 'true') { + return; + } let uul = this.parentElement!.querySelector('ul'); this.expandSection(uul); this.arrowElement!.style.transform = 'translateX(-50%) rotateZ(0deg)'; } - collapse() { - if (this.open === 'false') return; + collapse(): void { + if (this.open === 'false') { + return; + } let uul = this.parentElement!.querySelector('ul'); this.collapseSection(uul); this.arrowElement!.style.transform = 'translateX(-50%) rotateZ(-90deg)'; } - autoExpand() { + autoExpand(): void { let uul = this.parentElement!.querySelector('ul'); if (this.open === 'true') { this.collapseSection(uul); @@ -391,8 +415,10 @@ export class LitTreeNode extends BaseElement { } //收起 - collapseSection(element: any) { - if (!element) return; + collapseSection(element: any): void { + if (!element) { + return; + } let sectionHeight = element.scrollHeight; let elementTransition = element.style.transition; element.style.transition = ''; @@ -407,11 +433,13 @@ export class LitTreeNode extends BaseElement { } //展开 - expandSection(element: any) { - if (!element) return; + expandSection(element: any): void { + if (!element) { + return; + } let sectionHeight = element.scrollHeight; element.style.height = sectionHeight + 'px'; - element.ontransitionend = (e: any) => { + element.ontransitionend = (e: any): void => { element.ontransitionend = null; element.style.height = null; this.open = 'true'; @@ -419,17 +447,13 @@ export class LitTreeNode extends BaseElement { } //当 custom element从文档DOM中删除时,被调用。 - disconnectedCallback() { - - } + disconnectedCallback(): void {} //当 custom element被移动到新的文档时,被调用。 - adoptedCallback() { - - } + adoptedCallback(): void {} //当 custom element增加、删除、修改自身属性时,被调用。 - attributeChangedCallback(name: string, oldValue: any, newValue: any) { + attributeChangedCallback(name: string, oldValue: any, newValue: any): void { if (name === 'title') { this.shadowRoot!.querySelector('#title')!.textContent = newValue; } else if (name === 'icon-name') { @@ -457,25 +481,27 @@ export class LitTreeNode extends BaseElement { } //在node top top-right bottom bottom-right 画线条 - drawLine(direction: string/*string[top|bottom|top-right|bottom-right]*/) { + drawLine(direction: string /*string[top|bottom|top-right|bottom-right]*/): void { let item = this.shadowRoot!.querySelector('#item'); - if (!item) return; + if (!item) { + return; + } item.removeAttribute('line-top'); item.removeAttribute('line-top-right'); item.removeAttribute('line-bottom'); item.removeAttribute('line-bottom-right'); switch (direction) { case 'top': - item.setAttribute('line-top', '') + item.setAttribute('line-top', ''); break; case 'bottom': - item.setAttribute('line-bottom', '') + item.setAttribute('line-bottom', ''); break; case 'top-right': - item.setAttribute('line-top-right', '') + item.setAttribute('line-top-right', ''); break; case 'bottom-right': - item.setAttribute('line-bottom-right', '') + item.setAttribute('line-bottom-right', ''); break; } } @@ -483,4 +509,4 @@ export class LitTreeNode extends BaseElement { if (!customElements.get('lit-tree-node')) { customElements.define('lit-tree-node', LitTreeNode); -} \ No newline at end of file +} diff --git a/ide/src/base-ui/utils/CSVFormater.ts b/ide/src/base-ui/utils/CSVFormater.ts index 9feb1fcce796c0f30a1e3fa144eb451e09674296..3bbc8235fff6d0be865173f48e951a840c301c1a 100644 --- a/ide/src/base-ui/utils/CSVFormater.ts +++ b/ide/src/base-ui/utils/CSVFormater.ts @@ -14,20 +14,24 @@ */ export class JSONToCSV { - static setCsvData(obj: any) { + static setCsvData(obj: any): void { let that = this; let browserType = this.browserType(); - if (browserType['ie'] < 9) return; - let data = obj['data']; - let isShowLabel = typeof obj['showLabel'] === 'undefined' ? true : obj['showLabel']; - let fileName = (obj['fileName'] || 'UserExport') + '.csv'; - let columns = obj['columns'] || { + if (browserType.ie < 9) { + return; + } + let data = obj.data; + let isShowLabel = typeof obj.showLabel === 'undefined' ? true : obj.showLabel; + let fileName = (obj.fileName || 'UserExport') + '.csv'; + let columns = obj.columns || { title: [], key: [], formatter: undefined, }; let showLabel = typeof isShowLabel === 'undefined' ? true : isShowLabel; - let row = '', csv = '', key; + let row = '', + csv = '', + key; // 如果要现实表头文字 if (showLabel) { // 如果有传入自定义的表头文字 @@ -75,13 +79,15 @@ export class JSONToCSV { row.slice(0, row.length - 1); // 删除最后一个, csv += row + '\r\n'; // 添加换行符号 }); - if (!csv) return; + if (!csv) { + return; + } this.saveCsvFile(fileName, csv); } - static saveCsvFile(fileName: any, csvData: any) { + static saveCsvFile(fileName: any, csvData: any): void { let browserType: any = this.browserType(); - if (!browserType['edge'] || !browserType['ie']) { + if (!browserType.edge || !browserType.ie) { let alink: any = document.createElement('a'); alink.id = 'csvDownloadLink'; alink.href = this.getDownloadUrl(csvData); @@ -90,10 +96,13 @@ export class JSONToCSV { linkDom.setAttribute('download', fileName); linkDom.click(); document.body.removeChild(linkDom); - } else if (browserType['ie'] >= 10 || browserType['edge'] == 'edge') { - (navigator as any).msSaveBlob(new Blob(['\uFEFF' + csvData], { - type: 'text/csv', - }), fileName); + } else if (browserType.ie >= 10 || browserType.edge === 'edge') { + (navigator as any).msSaveBlob( + new Blob(['\uFEFF' + csvData], { + type: 'text/csv', + }), + fileName + ); } else { let oWin: any = window.top?.open('about:blank', '_blank'); oWin.document.write('sep=,\r\n' + csvData); @@ -105,29 +114,31 @@ export class JSONToCSV { static getDownloadUrl(csvData: any) { if (window.Blob && window.URL && (window.URL as any).createObjectURL) { - return URL.createObjectURL(new Blob(['\uFEFF' + csvData], { - type: 'text/csv', - })); + return URL.createObjectURL( + new Blob(['\uFEFF' + csvData], { + type: 'text/csv', + }) + ); } } - static browserType() { + static browserType(): any { let type: any = {}; let agent = navigator.userAgent.toLowerCase(); let has; (has = agent.indexOf('edge') !== -1 ? (type.edge = 'edge') : agent.match(/rv:([\d.]+)\) like gecko/)) ? (type.ie = has[1]) : (has = agent.match(/msie ([\d.]+)/)) - ? (type.ie = has[1]) - : (has = agent.match(/firefox\/([\d.]+)/)) - ? (type.firefox = has[1]) - : (has = agent.match(/chrome\/([\d.]+)/)) - ? (type.chrome = has[1]) - : (has = agent.match(/opera.([\d.]+)/)) - ? (type.opera = has[1]) - : (has = agent.match(/version\/([\d.]+).*safari/)) - ? (type.safari = has[1]) - : 0; + ? (type.ie = has[1]) + : (has = agent.match(/firefox\/([\d.]+)/)) + ? (type.firefox = has[1]) + : (has = agent.match(/chrome\/([\d.]+)/)) + ? (type.chrome = has[1]) + : (has = agent.match(/opera.([\d.]+)/)) + ? (type.opera = has[1]) + : (has = agent.match(/version\/([\d.]+).*safari/)) + ? (type.safari = has[1]) + : 0; return type; } @@ -144,7 +155,7 @@ export class JSONToCSV { data.forEach((item: any) => { let depthCSV = 0; const loop = (data: any, depth: any) => { - result.push({depthCSV: depth, ...data}); + result.push({ depthCSV: depth, ...data }); let child = data.children; if (child) { for (let i = 0; i < child.length; i++) { @@ -157,7 +168,10 @@ export class JSONToCSV { return result; } - static columnsData(columns: Array) { + static columnsData(columns: Array): { + titleList: any[]; + ketList: any[]; + } { let titleList: Array = []; let ketList: Array = []; columns.forEach((column) => { @@ -181,8 +195,8 @@ export class JSONToCSV { return new Promise((resolve) => { let data: any = this.columnsData(dataSource.columns); let columns = { - title: data.titleList, - key: data.ketList, + title: data.titleList, + key: data.ketList, }; if (dataSource.tables.length > 0) { if (Array.isArray(dataSource.tables[0])) { @@ -191,9 +205,9 @@ export class JSONToCSV { JSONToCSV.setCsvData({ data: resultArr, fileName: `${dataSource.fileName}_${childIndex}`, - columns: columns + columns: columns, }); - }) + }); } else { let resultArr = JSONToCSV.treeToArr(dataSource.tables); JSONToCSV.setCsvData({ diff --git a/ide/src/command/CmdConstant.ts b/ide/src/command/CmdConstant.ts index ca7aa347cf95cfeffb88757b45a899ee1a70b160..9cd1d05e0c3c0d2f9314dd4516c70eba516638cb 100644 --- a/ide/src/command/CmdConstant.ts +++ b/ide/src/command/CmdConstant.ts @@ -19,20 +19,18 @@ export class CmdConstant { static CMD_MOUNT = 'hdc_std shell mount -o remount,rw /'; static CMD_GET_PROCESS = 'hdc_std shell ps -A -opid,cmd'; static CMD_GET_APP_NMAE = 'hdc_std shell ps -A -ocmd'; - static CMD_GET_CPU_COUNT = 'hdc_std shell grep -c \'processor\' /proc/cpuinfo'; + static CMD_GET_CPU_COUNT = "hdc_std shell grep -c 'processor' /proc/cpuinfo"; static CMD_GET_HIPERF_EVENTS = 'hdc_std shell hiperf list'; static CMD_GET_VERSION = 'hdc_std shell param get const.product.software.version'; - static CMD_GET_DEBUG_PROCESS = - `hdc shell netstat -anp |grep Panda |grep -v grep | sed \'s/.* \\([0-9]*\\)\\/.*/\\1/\' |xargs -r ps -A -opid,cmd`; + static CMD_GET_DEBUG_PROCESS = `hdc shell netstat -anp |grep Panda |grep -v grep | sed \'s/.* \\([0-9]*\\)\\/.*/\\1/\' |xargs -r ps -A -opid,cmd`; static CMD_HDC_DEVICES = 'hdc_std list targets'; static CMD_MOUNT_DEVICES = 'hdc_std -t {0} shell mount -o remount,rw /'; static CMD_GET_PROCESS_DEVICES = 'hdc_std -t {0} shell ps -A -opid,cmd'; static CMD_GET_APP_NMAE_DEVICES = 'hdc_std -t {0} shell ps -A -ocmd'; - static CMD_GET_CPU_COUNT_DEVICES = 'hdc_std -t {0} shell grep -c \'processor\' /proc/cpuinfo'; + static CMD_GET_CPU_COUNT_DEVICES = "hdc_std -t {0} shell grep -c 'processor' /proc/cpuinfo"; static CMD_GET_HIPERF_EVENTS_DEVICES = 'hdc_std -t {0} shell hiperf list'; static CMD_FIEL_RECV_DEVICES = 'hdc_std -t {0} file recv {1} ./'; - static CMS_HDC_STOP = - 'hdc_std -t {0} shell killall -2 hiprofiler_cmd'; + static CMS_HDC_STOP = 'hdc_std -t {0} shell killall -2 hiprofiler_cmd'; static CMS_STOP = 'hdc_std shell killall -2 hiprofiler_cmd'; static CMS_HDC_CANCEL = 'hdc_std -t {0} shell killall hiprofilerd hiprofiler_plugins native_daemon hiperf hiebpf hiprofiler_cmd'; @@ -40,4 +38,7 @@ export class CmdConstant { static CMD_GET_VERSION_DEVICES = 'hdc_std -t {0} shell param get const.product.software.version'; static CMD_GET_DEBUG_PROCESS_DEVICES = `hdc_std -t {0} shell netstat -anp |grep Panda |grep -v grep | sed \'s/.* \\([0-9]*\\)\\/.*/\\1/\' |xargs -r ps -A -opid,cmd`; + static CMD_CLEAR_LONG_FOLD = 'hdc_std shell rm -rf '; + static CMD_MKDIR_LONG_FOLD = 'hdc_std shell mkdir '; + static CMD_GET_LONG_FILES = 'hdc_std shell ls '; } diff --git a/ide/src/doc/compile_trace_streamer.html b/ide/src/doc/compile_trace_streamer.html index 64eb5f5aa814dc8f6cc4851d9f3fe0a942343c26..c418fb39aa1ce7c6c8d9f27bfbfd106dd9712bfe 100644 --- a/ide/src/doc/compile_trace_streamer.html +++ b/ide/src/doc/compile_trace_streamer.html @@ -6,840 +6,907 @@ - -
-

1.如何独立编译Trace_streamer

- -

尽管本工具(trace_streamer)是在ohos工具箱中的一员,但你依然可以独立编译此工具。

-

本工具可以编译linux, mac, windows, WebAssembly版本。

-

本工具默认编译方式是使用gn

-
    -
  • 编译方式
  • -
-
third_party部分安装方式
-third_party相关控件下载链接:https://gitee.com/organizations/openharmony/projects
-在src路径下创建同级目录third_party。
-一、sqlite:
-1.打开上方链接,搜索sqlite。
-2.点击搜索结果进入下载界面,下载sqlite组件。
-3.把下载的文件解压后,文件夹命名为sqlite,并用代码路径中\prebuilts\buildsqlite\sqlite3build.gn文件替换sqlite目录中的BUILD.gn文件。
-4.把sqlite文件夹放入third_party目录中。
-二、protobuf:
-1.按上述下载方法,下载protobuf组件。
-2.把下载的文件解压后,文件夹命名为protobuf,并用代码路径中\prebuilts\buildprotobuf\protobufbuild.gn文件替换protobuf目录中的BUILD.gn文件。
-3.把protobuf文件夹放入third_party目录中。
-三、googletest:
-1.按上述下载方法,下载googletest相关组件。
-2.把下载的文件解压后,文件夹命名为googletest,并用代码路径中\prebuilts\buildgoogletest\googletestbuild.gn文件替换googletest目录中的BUILD.gn文件。
-3.把googletest文件夹放入third_party目录中。
-4.找到文件\googletest\include\gtest\internal\ gtest-port.h 把286行 #include <sstream> // NOLINT修改为
-#undef private
-#define private private
-#include <sstream>  // NOLINT
-#undef private
-#define private public
- -

编译不同版本:linux, WebAssembly, mac

-
./build.sh linux/wasm/macx
-
- -

如果需要编译WebAssembly版本,您需要在prebuilts/目录下安装emsdk

-
git clone https://github.com/juj/emsdk.git --depth=1
-cd emsdk
-git pull
-./emsdk update # this may not work, ignore it
-./emsdk install latest
-./emsdk activate latest
-安装之后,您需要将upstream目录复制到prebuilts/emsdk/emsdk,node复制到prebuilts/emsdk/node
-
-

安装之后,目录结构当如:

-
prebuilts/emsdk
-├── prebuilts/emsdk/emsdk
-│   ├── prebuilts/emsdk/emsdk/bin
-│   ├── prebuilts/emsdk/emsdk/emscripten
-│   │   ├── prebuilts/emsdk/emsdk/emscripten/cache
-│   │   ├── prebuilts/emsdk/emsdk/emscripten/cmake
-│   │   ├── prebuilts/emsdk/emsdk/emscripten/docs
-│   │   ├── prebuilts/emsdk/emsdk/emscripten/media
-│   │   ├── prebuilts/emsdk/emsdk/emscripten/node_modules
-│   │   ├── prebuilts/emsdk/emsdk/emscripten/__pycache__
-│   │   ├── prebuilts/emsdk/emsdk/emscripten/src
-│   │   ├── prebuilts/emsdk/emsdk/emscripten/system
-│   │   ├── prebuilts/emsdk/emsdk/emscripten/tests
-│   │   ├── prebuilts/emsdk/emsdk/emscripten/third_party
-│   │   └── prebuilts/emsdk/emsdk/emscripten/tools
-│   ├── prebuilts/emsdk/emsdk/include
-│   │   └── prebuilts/emsdk/emsdk/include/c++
-│   └── prebuilts/emsdk/emsdk/lib
-│       └── prebuilts/emsdk/emsdk/lib/clang
-└── prebuilts/emsdk/node
-    └── prebuilts/emsdk/node/14.18.2_64bit
-        ├── prebuilts/emsdk/node/14.18.2_64bit/bin
-        ├── prebuilts/emsdk/node/14.18.2_64bit/include
-        ├── prebuilts/emsdk/node/14.18.2_64bit/lib
-        └── prebuilts/emsdk/node/14.18.2_64bit/share
-
-

之后调用

-
./build.sh wasm进行编译,您需要将sh脚本进行部分修改,因为这个脚本内置了一些库的下载和解析方式
-
+ +
+

如何编译TraceStreamer

+ +

TraceStreamer可以编译为命令行下的可执行程序,或者WebAssembly程序。

+

快速编译

+ +

可以按下面的方法快速编译TraceStreamer。

+

准备工作

+ +

+ 在码云上添加ssh公钥。
+ 本工具工程组织方式是gn。编译需要对应的编译器,编译前请自行配置本地编译器。
+ 所需编译器和版本如下表所示: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
系统工具版本号
linuxclang/clang++(Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
macxclang/clang++14.0.3
windowsgcc.exe/g++.exe(i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0
wasm(linux下编译)emcc/em++3.1.12
+

对于wasm环境(目前只支持linux下编译),build.sh会自行配置环境。

+

快速编译命令行下的可执行程序

+ +

在linux/windows/macx平台进入代码根目录下执行:

+
./build.sh
+    
+

+ 本脚本会下载和准备本地依赖的环境,并编译目标。
+ 在不同的平台上编译后的目标在不同的文件夹,如下所示: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
系统release版本debug版本生成二进制名称
linuxout/linuxout/linux_debugtrace_streamer
macxout/macxout/macx_debugtrace_streamer
windowsout/windowsout/windows_debugtrace_streamer
wasm(linux下编译)-out/wasmtrace_streamer_builtin.wasm和trace_streamer_builtin.js
+

快速编译WebAssembly版本

+ +

如要编译WebAssembly版本,只需在代码根目录下执行:

+
./build.sh wasm
+    
+

emsdk请使用3.1.12版本。

+

WebAssembly版本目前只支持在linux平台下编译。

- + } + }; + diff --git a/ide/src/doc/des_tables.html b/ide/src/doc/des_tables.html index db8fe5e1c1ac6a2b3aad842c0fac2ac8f7471d56..99f02531a260c5ecba1ba13583b97c3b32a8f16c 100644 --- a/ide/src/doc/des_tables.html +++ b/ide/src/doc/des_tables.html @@ -791,3913 +791,5034 @@
-

TraceStreamer数据表概述

- -

- TraceStreamer可以将trace数据源转化为易于理解和使用的数据库。用户可以通过SmartPerf界面直观的研究系统跟踪数据,也可在理解TraceStreamer生成的数据库的基础上,在TraceStreamer的交互模式或者Smartperf的数据库查询模式下,使用SQL查询语句自由组装查看用户关心的数据。下文将对TraceStreamer生成的数据库进行详细描述,给用户使用SQL查询系统跟踪数据提供帮助。 -

-

TraceStreamer输出的数据表分类

- -
    -
  • - 常规泳道图数据表
    - GitHub Logo -
  • -
  • - native memory数据源相关表
    - GitHub Logo -
  • -
  • - perf相关数据表
    - GitHub Logo -
  • -
  • - hisysevent相关数据表
    - GitHub Logo -
  • -
-

TraceStreamer输出数据库包含以下表格

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
表名称作用
app_name记录HiSysEvent事件的事件名与IDE部分事件的字段名为APPNAME中存放的相关信息的映射关系
args记录方法参数集合
bio_latency_sample记录IO操作相关方法调用,及调用栈数据
callstack - 记录调用堆栈和异步调用信息,其中depth,stack_id和parent_stack_id仅在非异步调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号 -
clk_event_filter记录时钟相关的信息
clock_event_filter此结构用来维护时钟事件,cpu与唯一的ID做关联
cpu_measure_filtercpu事件过滤器表
cpu_usage记录CPU使用率事件
data_dict记录常用的字符串,将字符串和索引关联,降低程序运行的内存占用,用作辅助数据
data_type记录数据类型和typeId的关联关系
diskio记录磁盘读写数据事件
ebpf_callstack记录了采样相关信息
file_system_samp记录了调用栈的相关信息
hidump记录FPS(Frame Per Second)数据
hisys_event_measure记录了HiSysEvent事件相关数据,目前HiSysEvent事件包括了异常事件,IDE事件,器件状态事件
instant记录Sched_waking, sched_wakeup事件, 用作ThreadState表的上下文使用
irq记录中断相关事件
js_heap_edges记录了js内存数据类对象对应的成员的信息
js_heap_files记录了js内存数据的名称和时间
js_heap_info记录了js内存数据类型,如nodes和edges的字段类型和数据总数
js_heap_location记录了js内存location节点相关数据
js_heap_nodes记录了js内存类对象和其成员的对应关系
js_heap_sample记录了timeline模式下的时间轴信息
js_heap_string记录了js内存数据中的字符串
js_heap_trace_function_info记录了timeline模式下的调用栈的每个函数信息
js_heap_trace_node记录了timeline模式下的调用栈信息
live_process记录了一些实时的进程中执行的一些数据
log记录hilog打印日志数据
measure_filter - 记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录 -
meta记录执行解析操作相关的基本信息
native_hook记录堆内存申请与释放相关的数据
native_hook_frame记录堆内存申请与释放相关的调用栈
native_hook_statistic记录堆内存申请与释放相关的统计信息
network抓取网络信息传输时产生的一些相关信息
paged_memory_sample记录内存操作相关方法调用,及调用栈数据
perf_callchain记录Hiperf采样数据的调用栈信息
perf_files记录Hiperf工具采集到的函数符号表和文件名
perf_report记录Hiperf工具采集数据时的配置信息。包括
perf_sample记录Hiperf工具的采样信息
perf_thread记录Hiperf工具采集到的进程和线程数据
process记录所有的进程信息
process_filter过滤进程
process_measure保存进程的所有计量值
process_measure_filter将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id
raw此数据结构主要作为ThreadState的上下文使用,这张表是sched_waking,sched_wakup, cpu_idle事件的原始记录
sched_slice此数据结构主要作为ThreadState的上下文使用,这张表是sched_switch事件的原始记录
smaps记录进程的内存消耗的相关信息采样
stat - 此结果用来统计数据解析中各类数据的数据条数,数据和合法性,数据的匹配程度(begin-end),数据的损失等,查看此结构对应的表,可对数据源有基本的了解 -
symbols记录系统调用名称和其函数指针的对应关系,trace中用addr来映射function_name来节省存储空间
syscall记录用户空间函数与内核空间函数相互调用记录
sys_event_filter记录所有的filter
sys_mem_measure记录了所有的系统内存相关的测量信息
thread记录所有的线程信息
thread_filter过滤线程
thread_state记录线程状态信息
trace_range记录ftrace数据与其他类型数据的时间交集,供前端展示数据时使用
clock_snapshot时钟号和时间,时钟名的映射表
datasource_clockid数据源和时钟号的映射表
-

表与事件来源

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
表名称事件源插件名备注
app_name-hisysevent-pluginJSON数据源
args-ftrace-plugin配合callstack使用
callstack-ftrace-plugin异步或非异步的调用
cpu_measure_filter-ftrace-plugincpu跟踪器,cpu频率等
cpu_usage-cpu-plugincpu使用率
data_dict通用的-所有字符串的记录
data_type通用的-辅助表
file_system_callstack--ebpf文件系统
file_system_sample--ebpf文件系统
frame_maps-ftrace-plugin帧渲染数据,app到RS的映射
frame_slice-ftrace-plugin帧渲染数据
gpu_slice-ftrace-plugingpu渲染时长
hidump-hidump-pluginFPS数据
hisys_event_measure-hisysevent-pluginJSON数据源
instant-ftrace-pluginwaking和wakeup事件
irq-ftrace-plugin记录中断事件
js_heap_edges-arkts-pluginjs内存数据
js_heap_files-arkts-pluginjs内存数据
js_heap_info-arkts-pluginjs内存数据
js_heap_location-arkts-pluginjs内存数据
js_heap_nodes-arkts-pluginjs内存数据
js_heap_sample-arkts-pluginjs内存数据
js_heap_string-arkts-pluginjs内存数据
js_heap_trace_function_info-arkts-pluginjs内存数据
js_heap_trace_node-arkts-pluginjs内存数据
live_process-process-pluginMonitor数据
network-network-pluginMonitor数据
diskio-diskio-pluginMonitor数据
log-hilog-plugin系统日志
measure通用的-系统中的计量值(数值型)
measure_filter通用的-计量值的查询辅助表
meta通用的-记录解析现场数据(解析时间,数据类型,解析工具等)
native_hook-nativehook/hookdaemonmalloc && mmap内存数据
native_hook_frame-nativehook/hookdaemonnative_hook调用栈数据
native_hook_statistic-nativehook/hookdaemonmalloc && mmap统计数据
perf_callchain-perf-pluginperf数据(非插件模式)
perf_files--perf数据(非插件模式)
perf_report--perf数据(非插件模式)
perf_sample--perf数据(非插件模式)
perf_thread--perf数据(非插件模式)
process-ftrace-plugin进程信息
process_filter-ftrace-plugin进程计量表的辅助表
process_measure-ftrace-plugin进程内存
process_measure_filter-ftrace-pluginprocess_measure的辅助表
raw-ftrace-plugin线程唤醒信息
sched_slice-ftrace-plugin配合现场状态表使用,dsched_switch的原始数据
smaps-memory-plugin进程的内存消耗
stat通用的-记录不同种类数据的数据量
symbols-ftrace-plugin符号表(地址到字符串的映射)
syscall-ftrace-plugin系统调用 sys_enter/exit
sys_event_filter-ftrace-plugin
sys_mem_measure-memory-plugin系统内存
thread通用的-线程信息(常用)
thread_state通用的ftrace-plugin线程调度图(常用)
trace_range通用的-trace数据的时长
thread_filter通用的ftrace-plugin线程计量跟踪表(比较少用)
clock_snapshot通用的通用的时钟号和时间,时钟名的映射表
datasource_clockid通用的通用的数据源和时钟号的映射表
-

- 表格关系图 -

- -
-

进程表与线程表关系

- -

- 当一个进程或者线程结束后,系统可能再次将该进程号或者线程号分配给其他进程或者线程,造成一个进程号或线程号代表多个进程或线程的情况。
- Process和Thread表中的id字段可以唯一标识进程和线程。process表中的id在其他表中用作ipid字段。thread表中的id在其他表中用作itid字段。
- thread表通过ipid字段关联process表的id字段,可以查询线程归属进程。
- GitHub Logo -

-

查询举例

- -
    -
  • - 已知pid = 123,查看当前进程下的所有线程信息,可以使用如下SQL语句:
    - select thread.* from thread, process where process.pid = 123 and thread.ipid = process.id -
  • -
-

线程表与线程运行状态表关系图

-

- thread_state表记录所有线程的运行状态信息,包含ts(状态起始时间),dur(状态持续时间),cpu, itid, - state(线程状态)。 thread表的id字段与thread_state表的itid字段相关联。
- GitHub Logo -

-

查询举例

-
    -
  • - 已知tid = 123, 查看当前线程的所有运行状态信息,可以使用如下SQL语句:
    - select thread_state.* from thread, thread_state where thread.tid = 123 and thread.id = - thread_state.itid -
  • -
-

堆内存数据变化表关系图

- -

- native_hook表记录堆内存申请(AllocEvent)和释放(FreeEvent)数据。native_hook表通过ipid和itid字段分别与process和thread表的id字段关联,通过callChainId与native_hook_frame表的callChainId字段相关联。
- native_hook表字段解释如下: -

-
    -
  • - callChainId:唯一标识一次堆内存申请或释放, - 通过与native_hook_frame表关联可以拿到当前申请或释放的函数调用堆栈。 -
  • -
  • addr:堆内存申请/释放的地址。
  • -
  • native_hook_size:堆内存申请/释放的大小。
  • -
-

- native_hook_frame表记录内存申请/释放的调用堆栈。通过callChainId区分一组调用堆栈,depth为堆栈深度,depth为0时,表示当前行为栈顶数据。
- GitHub Logo -

-

- native_hook_statistic表记录内存申请/释放的统计信息。通过callChainId区分一组调用堆栈。每个统计事件将记录当前事件的callChainId,并统计当前调用栈内存分配/释放的总次数和总大小。
- GitHub Logo -

-

查询举例

- -
    -
  • - 已知tid = 123,查看当前线程的所有堆内存变化信息,可以使用如下SQL语句:
    - select native_hook.* from thread, native_hook where thread.tid = 123 and thread.id = native_hook.itid -
  • -
  • - 已知callchainid = 1, 查看当前内存变化调用堆栈
    - select * from native_hook_frame where callchain_id = 1 -
  • -
  • - 已知callchainid = 1, 查看当前内存变化调用堆栈对应的统计信息
    - select * from native_hook_statistic where callchain_id = 1 -
  • -
-

日志表与进程线程表关系图

-

- log表记录日志信息。可以根据seq字段的连续性,来判断是否存在日志丢失的情况。
- GitHub Logo -

-

查询举例

-
    -
  • - 已知tid = 123,查看当前线程的所有error级别的日志,可以使用如下SQL语句:
    - select * from log where tid = 123 and level = "error" -
  • -
-

perf表之间关系图

- -
    -
  • perf_report:此表记录Hiperf工具采集数据时的配置信息。
  • -
  • perf_thread:此表记录hiperf采集到的进程和线程数据。
  • -
  • - perf_sample:此表中记录Hiperf工具的采样信息。sample_id唯一表识一次采样记录,与perf_callchain表中的sample_id字段相关联。thread_id为线程号。与perf_thread表中的thread_id字段相关联。event_type_id为当前采样的事件类型id,与perf_report表中的id字段相关联。 -
  • -
  • perf_callchain:此表格记录的是调用栈信息。
  • -
  • - Perf_files:此表格主要存放着获取到的函数符号表和文件信息。file_id唯一表识一个文件,与perf_callchain表中的file_id字段相关联。 -
  • -
-

GitHub Logo

-

查询举例

- -
    -
  • -

    - 已知同步后的时间戳为28463134340470,查询采样数据
    - select * from perf_sample where timestamp_trace = 28463134340470 -

    -
  • -
  • -

    - 已知同步后的时间戳为28463134340470,查询采样数据对应的的调用栈信息
    - select A.* from perf_callchain as A, perf_sample as B where B.timestamp_trace = 28463134340470 and - A.sample_id = B.sample_id -

    -
  • -
  • -

    - 已知同步后的时间戳为28463134277762,查询采样数据的函数名及文件路径
    - select A.*, B.name, C.path from perf_sample as A, perf_callchain as B, perf_files as C where - A.timestamp_trace = 28463134277762 and B.sample_id = A.sample_id and B.callchain_id = 0 and B.file_id = - C.file_id and C.serial_id = 0 -

    -
  • -
  • -

    - 已知线程号为6700,查询所有的采样记录
    - select * from perf_sample where thread_id = 6700 -

    -
  • -
  • -

    - 已知进程号为7863,查询所有的采样记录
    - select A.* from perf_sample as A, perf_thread as B where B.process_id = 7863 and A.thread_id = - B.thread_id -

    -
  • -
  • -

    - 查询所有采样对应的事件类型
    - select A.*, B.report_value from perf_sample as A, perf_report as B where A.event_type_id = B.id -

    -
  • -
-

帧渲染表之间的关系图

- -

- frame_slice: 记录RS(RenderService)和应用的帧渲染。
- gpu_slice: 记录RS的帧对应的gpu渲染时长。
- frame_maps:记录应用到RS的帧的映射关系。
- GitHub Logo -

-

查询示例

- -
    -
  • -

    - 已知进程,查询进程对应的实际渲染帧
    - select * from frame_slice where ipid = 1 -

    -
  • -
  • -

    - 已知进程的实际渲染帧的dst为12,求其对应的RS进程的渲染帧
    - select * from frame_slice where id = 12 -

    -
  • -
  • -

    - 已知RS的渲染帧在frame_slice中所在行是14,求其对应的GPU渲染时长
    - select * from gpu_slice where frame_row = 14 -

    -
  • -
-

JS内存数据表关系图

-

js_heap_files:记录js内存数据的文件名和文件索引

-

1683163158954

-

- js_heap_nodes:记录js内存类对象数据
- js_heap_edges:记录js内存类对象的成员数据
- js_heap_trace_node:记录timeline的调用栈信息
- js_heap_sample:记录timeline的时间轴信息
- 1683163373206 -

-

TraceStreamer输出数据库表格详细介绍

-

app_name表

-

表结构

- - - - - - - - - - - - - - - - - - - - - - - - - -
Columns NameSQL TYPE
idINT
flagINT
app_nameINT
app_keyINT
-

表描述

-

记录HiSysevent上报事件中的IDE相关事件中APPNAME的表关联信息。

-

字段详细描述

-
    -
  • id:用于与表hisys_event_measure表中的key_id字段做对应
  • -
  • app_name:对应的事件的信息ID
  • -
  • app_key:对应的事件的APPNAME字段的信息ID
  • -
-

args表

-

表结构

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Columns NameSQL TYPE
idINT
keyINT
datatypeINT
valueINT
argsetINT
-

表描述

-

记录方法的参数集合。

-

字段详细描述

-
    -
  • key:键
  • -
  • datatype:数据类型
  • -
  • value:取值
  • -
  • argset:参数集合
  • -
-

bio_latency_sample表

-

表结构

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Columns NameSQL TYPE
idINT
callchain_idINT
datatypeINT
typeINT
ipidINT
itidINT
start_tsINT
end_tsINT
latency_durINT
tierINT
sizeINT
block_numberTEXT
pathTEXT
dur_per_4kINT
-

表描述

-

记录IO操作相关方法调用,及调用栈数据。

-

字段详细描述

-
    -
  • callchain_id:调用栈的唯一标识。与ebpf_callstack表中Callchain_id字段关联
  • -
  • - type:事件类型其取值为枚举类型(DATA_READ,DATA_WRITE,METADATA_READ,- METADATA_WRITE,PAGE_IN,PAGE_OUT) -
  • -
  • ipid:TS内部进程号
  • -
  • itid:TS内部线程号
  • -
  • start_ts:开始时间
  • -
  • end_ts:结束时间
  • -
  • latency_dur:总延迟
  • -
  • tier:优先级
  • -
  • size:文件大小
  • -
  • block_number:数据量大小(一般为4K)
  • -
  • path:路径id
  • -
  • dur_per_4k:每4k数据的平均延迟
  • -
-

callstack表

-

表结构

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Columns NameSQL TYPE
idINT
tsINT
durINT
callidINT
catTEXT
identifyINT
nameTEXT
depthINT
cookieINT
parent_idINT
argsetidINT
chainIdTEXT
spanIdTEXT
parentSpanIdTEXT
flagTEXT
argsTEXT
-

表描述

+

TraceStreamer数据表概述

+ +

+ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库。用户可以通过SmartPerf界面直观的研究系统跟踪数据,也可在理解TraceStreamer生成的数据库的基础上,在TraceStreamer的交互模式或者Smartperf的数据库查询模式下,使用SQL查询语句自由组装查看用户关心的数据。下文将对TraceStreamer生成的数据库进行详细描述,给用户使用SQL查询系统跟踪数据提供帮助。 +

+

TraceStreamer输出的数据表分类

+ +
    +
  • + 常规泳道图数据表
    + GitHub Logo +
  • +
  • + native memory数据源相关表
    + GitHub Logo +
  • +
  • + perf相关数据表
    + GitHub Logo +
  • +
  • + hisysevent相关数据表
    + GitHub Logo +
  • +
+

TraceStreamer输出数据库包含以下表格

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表名称作用
animation记录动效的响应时延和完成时延
app_name记录HiSysEvent事件的事件名与IDE部分事件的字段名为APPNAME中存放的相关信息的映射关系
app_startup记录了应用启动相关数据
args记录方法参数集合
bio_latency_sample记录IO操作相关方法调用,及调用栈数据
callstack + 记录调用堆栈和异步调用信息,其中depth,stack_id和parent_stack_id仅在非异步调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号 +
clk_event_filter记录时钟相关的信息
clock_event_filter此结构用来维护时钟事件,cpu与唯一的ID做关联
clock_snapshot时钟号和时间,时钟名的映射表
cpu_measure_filtercpu事件过滤器表
cpu_usage记录CPU使用率事件
datasource_clockid数据源和时钟号的映射表
data_dict记录常用的字符串,将字符串和索引关联,降低程序运行的内存占用,用作辅助数据
data_type记录数据类型和typeId的关联关系
device_info记录设备分辨率和帧率
device_state记录设备屏幕亮度,蓝牙,位置,wifi,音乐,媒体等信息
diskio记录磁盘读写数据事件
dynamic_frame记录动效帧的分辨率和结束时间等
ebpf_callstack记录了采样相关信息
file_system_sample记录了调用栈的相关信息
frame_maps记录应用到RS的帧的映射关系
frame_slice记录RS(RenderService)和应用的帧渲染
gpu_slice记录RS的帧对应的gpu渲染时长
hidump记录FPS(Frame Per Second)数据
hisys_event_measure记录了HiSysEvent事件相关数据,目前HiSysEvent事件包括了异常事件,IDE事件,器件状态事件
instant记录Sched_waking, sched_wakeup事件, 用作ThreadState表的上下文使用
irq记录中断相关事件
js_config记录了arkTs数据采集的相关配置
js_cpu_profiler_node记录了cpu profiler中node节点的数据
js_cpu_profiler_sample记录了cpu profiler中sample节点的数据
js_heap_edges记录了js内存数据类对象对应的成员的信息
js_heap_files记录了js内存数据的名称和时间
js_heap_info记录了js内存数据类型,如nodes和edges的字段类型和数据总数
js_heap_location记录了js内存location节点相关数据
js_heap_nodes记录了js内存类对象和其成员的对应关系
js_heap_sample记录了timeline模式下的时间轴信息
js_heap_string记录了js内存数据中的字符串
js_heap_trace_function_info记录了timeline模式下的调用栈的每个函数信息
js_heap_trace_node记录了timeline模式下的调用栈信息
live_process记录了一些实时的进程中执行的一些数据
log记录hilog打印日志数据
measure记录所有的计量值
measure_filter + 记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录 +
memory_ashmem记录了进程所占用的ashmem相关信息
memory_dma记录了进程占用的DMA内存相关信息
memory_process_gpu记录进程占用GPU内存相关信息
memory_window_gpu记录窗口占用GPU内存相关信息
meta记录执行解析操作相关的基本信息
native_hook记录堆内存申请与释放相关的数据
native_hook_frame记录堆内存申请与释放相关的调用栈
native_hook_statistic记录堆内存申请与释放相关的统计信息
network抓取网络信息传输时产生的一些相关信息
paged_memory_sample记录内存操作相关方法调用,及调用栈数据
perf_callchain记录Hiperf采样数据的调用栈信息
perf_files记录Hiperf工具采集到的函数符号表和文件名
perf_report记录Hiperf工具采集数据时的配置信息。包括
perf_sample记录Hiperf工具的采样信息
perf_thread记录Hiperf工具采集到的进程和线程数据
process记录所有的进程信息
process_filter过滤进程
process_measure保存进程的所有计量值
process_measure_filter将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id
raw此数据结构主要作为ThreadState的上下文使用,这张表是sched_waking,sched_wakup, cpu_idle事件的原始记录
sched_slice此数据结构主要作为ThreadState的上下文使用,这张表是sched_switch事件的原始记录
smaps记录进程的内存消耗的相关信息采样
stat + 此结果用来统计数据解析中各类数据的数据条数,数据和合法性,数据的匹配程度(begin-end),数据的损失等,查看此结构对应的表,可对数据源有基本的了解 +
static_initalize记录了so初始化相关数据
symbols记录系统调用名称和其函数指针的对应关系,trace中用addr来映射function_name来节省存储空间
syscall记录用户空间函数与内核空间函数相互调用记录
sys_event_filter记录所有的filter
sys_mem_measure记录了所有的系统内存相关的测量信息
task_pool记录任务池相关数据,与callstack表相关联
thread记录所有的线程信息
thread_filter过滤线程
thread_state记录线程状态信息
trace_config记录trace数据源,proto的事件-plugin与其process_name
trace_range记录ftrace数据与其他类型数据的时间交集,供前端展示数据时使用
+

表与事件来源

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表名称事件源插件名备注
animation-ftrace-plugin记录动效的响应时延和完成时延
app_name-hisysevent-pluginJSON数据源
args-ftrace-plugin配合callstack使用
bio_latency_sample--IO操作相关方法调用,及调用栈数据
callstack-ftrace-plugin异步或非异步的调用
cpu_measure_filter-ftrace-plugincpu跟踪器,cpu频率等
cpu_usage-cpu-plugincpu使用率
data_dict通用的-所有字符串的记录
data_type通用的-辅助表
device_info-ftrace-plugin记录设备分辨率和帧率
device_state通用的hisysevent-plugin记录设备屏幕亮度,蓝牙,位置等信息
dynamic_frame-ftrace-plugin动效帧的分辨率和结束时间等
ebpf_callstack--磁盘读写相关的数据
file_system_callstack--ebpf文件系统
file_system_sample--ebpf文件系统
frame_maps-ftrace-plugin帧渲染数据,app到RS的映射
frame_slice-ftrace-plugin帧渲染数据
gpu_slice-ftrace-plugingpu渲染时长
hidump-hidump-pluginFPS数据
hisys_event_measure-hisysevent-pluginJSON数据源
instant-ftrace-pluginwaking和wakeup事件
irq-ftrace-plugin记录中断事件
js_config-arkts-pluginarkTs数据采集的配置
js_cpu_profiler_node-arkts-plugin记录了cpu profiler中node节点的数据
js_cpu_profiler_sample-arkts-plugin记录了cpu profiler中sample节点的数据
js_heap_edges-arkts-pluginjs内存数据
js_heap_files-arkts-pluginjs内存数据
js_heap_info-arkts-pluginjs内存数据
js_heap_location-arkts-pluginjs内存数据
js_heap_nodes-arkts-pluginjs内存数据
js_heap_sample-arkts-pluginjs内存数据
js_heap_string-arkts-pluginjs内存数据
js_heap_trace_function_info-arkts-pluginjs内存数据
js_heap_trace_node-arkts-pluginjs内存数据
app_startup-ftrace-plugin应用启动数据
static_initalize-ftrace-pluginso初始化数据
live_process-process-pluginMonitor数据
network-network-pluginMonitor数据
diskio-diskio-pluginMonitor数据
log-hilog-plugin系统日志
measure通用的-系统中的计量值(数值型)
measure_filter通用的-计量值的查询辅助表
memory_ashmem-memory-plugin进程所占用ashmem相关信息
memory_dma-memory-plugin进程占用的DMA内存相关信息
memory_process_gpu-memory-plugin进程占用GPU内存相关信息
memory_window_gpu-memory-plugin窗口占用GPU内存相关信息
meta通用的-记录解析现场数据(解析时间,数据类型,解析工具等)
native_hook-nativehook/hookdaemonmalloc && mmap内存数据
native_hook_frame-nativehook/hookdaemonnative_hook调用栈数据
native_hook_statistic-nativehook/hookdaemonmalloc && mmap统计数据
paged_memory_sample--网络数据传输相关的信息
perf_callchain-perf-pluginperf数据(非插件模式)
perf_files--perf数据(非插件模式)
perf_report--perf数据(非插件模式)
perf_sample--perf数据(非插件模式)
perf_thread--perf数据(非插件模式)
process-ftrace-plugin进程信息
process_filter-ftrace-plugin进程计量表的辅助表
process_measure-ftrace-plugin进程内存
process_measure_filter-ftrace-pluginprocess_measure的辅助表
raw-ftrace-plugin线程唤醒信息
sched_slice-ftrace-plugin配合现场状态表使用,dsched_switch的原始数据
smaps-memory-plugin进程的内存消耗
stat通用的-记录不同种类数据的数据量
symbols-ftrace-plugin符号表(地址到字符串的映射)
syscall-ftrace-plugin系统调用 sys_enter/exit
sys_event_filter-ftrace-plugin
sys_mem_measure-memory-plugin系统内存
thread通用的-线程信息(常用)
thread_state通用的ftrace-plugin线程调度图(常用)
trace_config通用的hisysevent-plugin记录trace数据源
trace_range通用的-trace数据的时长
thread_filter通用的ftrace-plugin线程计量跟踪表(比较少用)
clock_snapshot通用的通用的时钟号和时间,时钟名的映射表
datasource_clockid通用的通用的数据源和时钟号的映射表
task_pool--任务池数据
+

+ 表格关系图 +

+ +
+

进程表与线程表关系

+ +

+ 当一个进程或者线程结束后,系统可能再次将该进程号或者线程号分配给其他进程或者线程,造成一个进程号或线程号代表多个进程或线程的情况。
+ Process和Thread表中的id字段可以唯一标识进程和线程。process表中的id在其他表中用作ipid字段。thread表中的id在其他表中用作itid字段。
+ thread表通过ipid字段关联process表的id字段,可以查询线程归属进程。
+ GitHub Logo +

+

查询举例

+ +
    +
  • + 已知pid = 123,查看当前进程下的所有线程信息,可以使用如下SQL语句:
    + select thread.* from thread, process where process.pid = 123 and thread.ipid = process.id +
  • +
+

线程表与线程运行状态表关系图

+

+ thread_state表记录所有线程的运行状态信息,包含ts(状态起始时间),dur(状态持续时间),cpu, itid, + state(线程状态)。 thread表的id字段与thread_state表的itid字段相关联。
+ GitHub Logo +

+

查询举例

+
    +
  • + 已知tid = 123, 查看当前线程的所有运行状态信息,可以使用如下SQL语句:
    + select thread_state.* from thread, thread_state where thread.tid = 123 and thread.id = + thread_state.itid +
  • +
+

堆内存数据变化表关系图

+ +

+ native_hook表记录堆内存申请(AllocEvent)和释放(FreeEvent)数据。native_hook表通过ipid和itid字段分别与process和thread表的id字段关联,通过callChainId与native_hook_frame表的callChainId字段相关联。
+ native_hook表字段解释如下: +

+
    +
  • + callChainId:唯一标识一次堆内存申请或释放, + 通过与native_hook_frame表关联可以拿到当前申请或释放的函数调用堆栈。 +
  • +
  • addr:堆内存申请/释放的地址。
  • +
  • native_hook_size:堆内存申请/释放的大小。
  • +
+

+ native_hook_frame表记录内存申请/释放的调用堆栈。通过callChainId区分一组调用堆栈,depth为堆栈深度,depth为0时,表示当前行为栈顶数据。
+ GitHub Logo +

+

+ native_hook_statistic表记录内存申请/释放的统计信息。通过callChainId区分一组调用堆栈。每个统计事件将记录当前事件的callChainId,并统计当前调用栈内存分配/释放的总次数和总大小。
+ GitHub Logo +

+

查询举例

+ +
    +
  • + 已知tid = 123,查看当前线程的所有堆内存变化信息,可以使用如下SQL语句:
    + select native_hook.* from thread, native_hook where thread.tid = 123 and thread.id = native_hook.itid +
  • +
  • + 已知callchainid = 1, 查看当前内存变化调用堆栈
    + select * from native_hook_frame where callchain_id = 1 +
  • +
  • + 已知callchainid = 1, 查看当前内存变化调用堆栈对应的统计信息
    + select * from native_hook_statistic where callchain_id = 1 +
  • +
+

日志表与进程线程表关系图

+

+ log表记录日志信息。可以根据seq字段的连续性,来判断是否存在日志丢失的情况。
+ GitHub Logo +

+

查询举例

+
    +
  • + 已知tid = 123,查看当前线程的所有error级别的日志,可以使用如下SQL语句:
    + select * from log where tid = 123 and level = "error" +
  • +
+

perf表之间关系图

+ +
    +
  • perf_report:此表记录Hiperf工具采集数据时的配置信息。
  • +
  • perf_thread:此表记录hiperf采集到的进程和线程数据。
  • +
  • + perf_sample:此表中记录Hiperf工具的采样信息。sample_id唯一表识一次采样记录,与perf_callchain表中的sample_id字段相关联。thread_id为线程号。与perf_thread表中的thread_id字段相关联。event_type_id为当前采样的事件类型id,与perf_report表中的id字段相关联。 +
  • +
  • perf_callchain:此表格记录的是调用栈信息。
  • +
  • + Perf_files:此表格主要存放着获取到的函数符号表和文件信息。file_id唯一表识一个文件,与perf_callchain表中的file_id字段相关联。 +
  • +
+

GitHub Logo

+

查询举例

+ +
    +
  • - 记录调用堆栈和异步调用信息,其中depth,stack_id和parent_stack_id仅在非异步的调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号。 + 已知同步后的时间戳为28463134340470,查询采样数据
    + select * from perf_sample where timestamp_trace = 28463134340470

    -

    字段详细描述

    -
      -
    • dur:调用时长
    • -
    • callid:调用者的ID,比如针对线程表里面的id
    • -
    • identify:调用栈的名字,与表dataDict相关联能够取出其string值
    • -
    • name:调用名称
    • -
    • depth:调用深度
    • -
    • parent_id:父调用的id
    • -
    • spanId:分布式调用关联关系
    • -
    • flag:C表示分布式调用发送方,S表示接受方
    • -
    • args:分布式调用函数参数
    • -
    -

    clk_event_filter表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    nameTEXT
    cpuINT
    -

    表描述

    -

    记录时钟信息。

    -

    字段详细描述

    -
      -
    • Type:时钟事件类型
    • -
    • Name:时钟事件名称
    • -
    -

    clock_event_filter表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    nameTEXT
    cpuINT
    -

    表描述

    -

    此结构用来维护时钟事件,cpu与唯一的ID做关联。

    -

    主要字段描述

    -
      -
    • Type:时钟事件类型
    • -
    • Name:时钟事件名称
    • -
    -

    cpu_measure_filter表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    nameTEXT
    cpuINT
    -

    表描述

    -

    将cpu号作为key1,cpu的频率,空闲等状态作为key2,唯一确定一个filter_id。

    -

    主要字段描述

    -
      -
    • Id(filterid), cpu:事件名称,cpu号
    • -
    -

    cpu_usage表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    tsINT
    durINT
    total_loadREAL
    user_loadREAL
    system_loadREAL
    process_numINT
    -

    表描述

    -

    记录了与CPU使用率相关的数据。

    -

    主要字段描述

    -
      -
    • total_load:总负荷
    • -
    • user_load:用户负载
    • -
    • system_load:系统负载
    • -
    • process_num:线程数
    • -
    -

    data_dict表

    -

    表结构

    - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    dataTEXT
    -

    表描述

    -

    此表记录了一个数据类型ID和字符串的映射。

    -

    主要字段描述

    -
      -
    • id:索引值
    • -
    • data:字符串
    • -
    -

    data_type表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeIdINT
    descTEXT
    -

    表描述

    -

    此表记录了一个数据类型ID和数据描述的映射。

    -

    主要字段描述

    -
      -
    • typeId::数据类型id
    • -
    • Desc:数据类型描述
    • -
    -

    diskio表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    tsINT
    durINT
    rdINT
    wrINT
    rd_speedREAL
    wr_speedREAL
    rd_countINT
    wr_countINT
    rd_count_speedREAL
    wr_count_speedREAL
    -

    表描述

    -

    记录了与磁盘读写相关的数据。

    -

    主要字段描述

    -
      -
    • rd_sectors_kb:读数据的速度
    • -
    • wr_sectors_kb:写入数据的速度
    • -
    • ts:时间戳
    • -
    -

    ebpf_callstack表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    callchain_idINT
    depthTEXT
    ipTEXT
    symbols_idINT
    file_path_idINT
    -

    表描述

    -

    记录了与磁盘读写相关的数据。

    -

    主要字段描述

    -
      -
    • callchain_id:调用栈的唯一标识。与ebpf_callstack表中Callchain_id字段关联
    • -
    • depth:调用栈深度。取值为零时表示栈顶
    • -
    • ip:调用栈ip
    • -
    • symbols_id:调用栈函数名称, 与data_dict中的id字段关联
    • -
    • file_path_id:调用栈函数所属文件路径, 与data_dict中的id字段关联
    • -
    -

    file_system_sample表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    callchain_idINT
    typeINT
    ipidINT
    itidINT
    start_tsINT
    end_tsINT
    durINT
    return_valueTEXT
    error_codeTEXT
    fdINT
    file_idINT
    sizeINT
    first_argumentTEXT
    second_argumentTEXT
    third_argumentTEXT
    fourth_argumentTEXT
    -

    表描述

    -

    记录了调用栈的相关信息。

    -

    主要字段描述

    -
      -
    • callchain_id:调用栈信息ID与file_system_callstack表中call_chain_id字段相关联
    • -
    • type:对应文件操作open,close,read,write
    • -
    • ipid:线程所属的进程ID
    • -
    • start_ts:开始时间
    • -
    • end_ts:结束时间
    • -
    • dur:耗时
    • -
    • return_value:文件操作的返回值
    • -
    • error_code:文件操作发生错误时的错误码
    • -
    • fd:文件描述符fd
    • -
    • file_id:当type为open,close时为其操作的文件路径,当type为read,write时为固定字段(null)
    • -
    • size:在type为read,write时对应的文件的读或者写的大小
    • -
    • first_argument:参数一
    • -
    • second_argument:参数二
    • -
    • third_argument:参数三
    • -
    • fourth_argument:参数四
    • -
    -

    hidump表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    tsINT
    fpsINT
    -

    表描述

    -

    此表记录了设备的帧率信息,fps。

    -

    相关字段描述

    -
      -
    • fps:帧率值
    • -
    -

    hisys_event_measure表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    serialINT
    tsINT
    name_idINT
    key_idINT
    typeINT
    int_valueREAL
    string_valueTEXT
    -

    表描述

    -

    记录所有的system event事件的相关数据,及其相关表的映射信息。

    -

    相关字段描述

    -
      -
    • serial:每条数据过来携带唯一一条id作为标识
    • -
    • name_id:存放事件对应的ID,与data_dict表相关联可以取出对应的字段
    • -
    • - key_id:存放事件包含的字段的ID,与表app_name的id字段相关联,找到app_name表的 - id字段对应行的app_key字段与表data_dict表相关联取出对应的字段 -
    • -
    • type:存放事件所包含的字段的值所属的类型为int型还是string(0为int,1为string)
    • -
    • int_value:存放本事件所包含的字段的int型的值
    • -
    • string_value:存放本事件所包含的字段的string型的值
    • -
    -

    instant表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    tsINT
    nameTEXT
    refINT
    wakeup_fromINT
    ref_typeTEXT
    valueREAL
    -

    表描述

    -

    记录了系统中的waking和wakeup事件。

    -

    字段描述

    -
      -
    • ts:唤醒时间
    • -
    • name:唤醒事件的名称
    • -
    • ref:索引号
    • -
    • wakeup_from:唤醒当前线程的内部线程号(itid)
    • -
    • ref_type:描述了value字段的类型(一般取值为itid)
    • -
    • value:一般为当前线程的内部线程号取值
    • -
    -

    irq表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    tsINT
    durINT
    callidINT
    catTEXT
    nameTEXT
    depthINT
    cookieINT
    parent_idINT
    argsetidINT
    chainIdTEXT
    spanIdTEXT
    parentSpanIdTEXT
    flagTEXT
    argsTEXT
    -

    表描述

    -

    记录中断相关事件。

    -

    相关字段描述

    -
      -
    • dur:调用中断时长
    • -
    • callid:调用中断者的ID,比如针对线程表里面的id
    • -
    • cat:调用栈数据类型(取值范围:irq,softirq...)
    • -
    • name:调用中断的名称
    • -
    • depth:中断调用的深度
    • -
    • parent_id:父调用中断的id
    • -
    • spanId:分布式调用中断关联关系
    • -
    -

    js_heap_edges表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    file_idINT
    edge_indexINT
    typeINT
    name_or_indexINT
    to_nodeINT
    from_node_idINT
    to_node_idINT
    -

    表描述

    -

    记录js内存数据类对象对应的成员的信息。

    -

    相关字段描述

    -
      -
    • file_id:文件ID
    • -
    • edge_index:成员的索引号
    • -
    • type:成员的类型,取值范围为js_heap_info表中的edge_types
    • -
    • name_or_index:数据名称,取值为js_heap_string表中的下标索引
    • -
    • to_node:此成员指向的类对象在nodes数组中的索引
    • -
    • from_node_id:类对象ID,该类对象指向此成员数据
    • -
    • to_node_id:此成员指向到的类对象nodes数组中的ID
    • -
    -

    js_heap_files表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    file_nameTEXT
    start_timeINT
    end_timeINT
    pidINT
    -

    表描述

    -

    记录了js内存数据的文件名称和时间。

    -

    相关字段描述

    -
      -
    • id:文件ID
    • -
    • file_name:文件名称
    • -
    • start_time:数据抓取的起始时间
    • -
    • end_time:数据抓取的终止时间
    • -
    • pid:进程号
    • -
    -

    js_heap_info表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    file_idINT
    keyTEXT
    typeINT
    int_valueINT
    str_valueTEXT
    -

    表描述

    -

    记录了js内存数据类型,如nodes和edges的字段类型和数据总数。

    -

    相关字段描述

    -
      -
    • file_id:文件ID
    • -
    • key:类型名称
    • -
    • type:数据类型索引
    • -
    • int_value:int类型的数据值,如count类型数据
    • -
    • str_value:string类型的数据值,如typename
    • -
    -

    js_heap_location表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    file_idINT
    object_indexINT
    script_idINT
    lineINT
    columnINT
    -

    表描述

    -

    记录了js内存location节点相关数据,此表目前无抓取到的数据。

    -

    相关字段描述

    -
      -
    • file_id:文件ID
    • -
    • object_index:与location关联的类对象的索引,取值为js_heap_nodes的下标索引
    • -
    • script_id:关联到的类对象所在文件的绝对路径ID
    • -
    • line:在类对象所在的文件中的行号
    • -
    • column:在类对象所在的文件中的列号
    • -
    -

    js_heap_nodes表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    file_idINT
    node_indexTEXT
    typeINT
    nameINT
    idTEXT
    self_sizeINT
    edge_countINT
    trace_node_idINT
    detachednessINT
    -

    表描述

    -

    记录了js内存数据中类对象的数据。

    -

    相关字段描述

    -
      -
    • file_id:文件ID
    • -
    • node_index:类对象的索引
    • -
    • type:类对象的类型
    • -
    • name:类对象的名称
    • -
    • id:类对象的唯一ID
    • -
    • self_size:该类对象所有成员的大小(以字节为单位)
    • -
    • edge_count:该类对象指向的类成员的个数
    • -
    • trace_node_id:该类对象关联到js_heap_trace_node表中的调用栈ID
    • -
    • detachedness:是否可以从window全局对象访问此节点,0表示是,1表示否
    • -
    -

    js_heap_sample表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    file_idINT
    timestamp_usINT
    last_assigned_idINT
    -

    表描述

    -

    记录了timeline模式下的时间轴信息。

    -

    相关字段描述

    -
      -
    • file_id:文件ID
    • -
    • timestamp_us:时间信息
    • -
    • last_assigned_id:当前时间点的id
    • -
    -

    js_heap_string表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    file_idINT
    file_indexINT
    stringTEXT
    -

    表描述

    -

    记录了js内存数据中的字符串。

    -

    相关字段描述

    -
      -
    • file_id:文件ID
    • -
    • file_index:索引
    • -
    • string:对应的字符串信息
    • -
    -

    js_heap_trace_function_info表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    file_idINT
    function_indexINT
    function_idINT
    nameINT
    script_nameINT
    script_idINT
    lineINT
    columnINT
    -

    表描述

    -

    记录了timeline模式下的调用栈的每个函数信息。

    -

    相关字段描述

    -
      -
    • file_id:文件ID
    • -
    • function_index:函数索引
    • -
    • function_id:函数ID
    • -
    • name:函数名称
    • -
    • script_name:关联到的类对象所在文件的绝对路径名称
    • -
    • script_id:关联到的类对象所在文件的绝对路径ID
    • -
    • line:在类对象所在的文件中的行号
    • -
    • column:在类对象所在的文件中的列号
    • -
    -

    js_heap_trace_node表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    file_idINT
    idINT
    function_info_indexINT
    countINT
    sizeINT
    parent_idINT
    -

    表描述

    -

    记录了timeline模式下的调用栈的信息。

    -

    相关字段描述

    -
      -
    • file_id:文件ID
    • -
    • id:调用栈节点索引
    • -
    • function_info_index:函数信息索引
    • -
    • count:调用栈个数
    • -
    • size:调用栈大小
    • -
    • parent_id:调用栈父节点
    • -
    -

    live_process表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    tsINT
    durINT
    cpu_timeINT
    process_idINT
    process_nameTEXT
    parent_process_idINT
    uidINT
    user_nameTEXT
    cpu_usageREAL
    pss_infoINT
    thread_numINT
    disk_writesINT
    disk_readsINT
    -

    表描述

    -

    记录了一些实时的进程中执行的一些数据(Monitor)。

    -

    主要字段描述

    -
      -
    • process_id:进程id
    • -
    • process_name:进程名
    • -
    • parent_process_id:父进程的id
    • -
    • uid:用户id
    • -
    • user_name:用户名
    • -
    • cpu_usage:cpu使用率
    • -
    • pss_info:进程信息
    • -
    • thread_num:线程数量
    • -
    • disk_writes:磁盘写量
    • -
    • disk_reads:磁盘读量
    • -
    -

    log表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    seqINT
    tsINT
    pidINT
    tidINT
    levelTEXT
    tagTEXT
    contextTEXT
    origintsINT
    -

    表描述

    -

    记录日志信息。

    -

    关键字段描述

    -
      -
    • Seq:日志序号,保证日志解析的准确性
    • -
    • Ts:打印日志时间
    • -
    • Pid:日志的进程号
    • -
    • Tid:日志的线程号
    • -
    • Level:日志级别
    • -
    • Tag:日志标签
    • -
    • Context:日志内容
    • -
    -

    measure表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    typeTEXT
    tsINT
    durINT
    valueINT
    filter_idINT
    -

    表描述

    -

    记录所有的计量值。

    -

    关键字段描述

    -
      -
    • type:固定字段(measure)
    • -
    • ts:事件时间
    • -
    • dur:该值持续的时长
    • -
    • value:数值
    • -
    • filter_id:对应filter表中的ID
    • -
    -

    measure_filter表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    nameTEXT
    source_arg_set_idINT
    -

    表描述

    +
  • +
  • - 记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录。 + 已知同步后的时间戳为28463134340470,查询采样数据对应的的调用栈信息
    + select A.* from perf_callchain as A, perf_sample as B where B.timestamp_trace = 28463134340470 and + A.sample_id = B.sample_id

    -

    字段详细描述

    +
  • +
  • - 过滤分类(type),过滤名称(key2),数据ID(key1)。
    - 数据ID在process_measure_filter, sys_event_filter中作为id。 + 已知同步后的时间戳为28463134277762,查询采样数据的函数名及文件路径
    + select A.*, B.name, C.path from perf_sample as A, perf_callchain as B, perf_files as C where + A.timestamp_trace = 28463134277762 and B.sample_id = A.sample_id and B.callchain_id = 0 and B.file_id = + C.file_id and C.serial_id = 0

    -

    meta表

    -

    表结构

    - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    nameTEXT
    valueTEXT
    -

    表描述

    +
  • +
  • - 此表记录了数据解析或导出时的一些现场数据,比如使用的TraceStreamer版本, - 工具的发布时间,数据解析的时间,数据的持续时长,以及原始数据的格式。 + 已知线程号为6700,查询所有的采样记录
    + select * from perf_sample where thread_id = 6700

    -

    主要字段描述

    -
      -
    • Name:指定元数据的key
    • -
    • Value:指定元数据的value
    • -
    -

    native_hook表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    callChainIdINT
    ipidINT
    itidINT
    event_typeTEXT
    sub_type_idNUM
    start_tsINT
    end_tsINT
    durINT
    addrINT
    heap_sizeINT
    all_heap_sizeINT
    current_size_durINT
    last_lib_idINT
    -

    表描述

    -

    记录native_hook抓取的某个进程的堆内存,内存映射相关数据。

    -

    关键字段描述

    -
      -
    • callChainId:唯一标识一条native_hook数据
    • -
    • event_type:事件类型取值范围(AllocEvent,FreeEvent,MmapEvent, MunmapEvent)
    • -
    • sub_type_id:子事件类型(只有sub_type字段为MmapEvent时,该字段才会有值)
    • -
    • start_ts:申请内存开始时间
    • -
    • end_ts:释放内存时间
    • -
    • Dur:申请内存活跃时间
    • -
    • Addr:申请内存地址
    • -
    • mem_size:申请或释放内存大小
    • -
    • - all_mem_size:从采集数据开始到当前时刻,申请并活跃的内存总量。 - event_type为AllocEvent或者FreeEvent时,表示活跃的堆内存总量。当event_type为MmapEvent或者MunmapEvent时,表示活跃的映射内存总量 -
    • -
    • current_size_dur:表示当前活跃内存总量的持续时间
    • -
    • last_lib_id:函数调用栈他最后一个函数所属的文件路径,除了文件名中带musl和libc++
    • -
    -

    native_hook_frame表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    callchain_idINT
    depthINT
    symbol_idINT
    file_idINT
    offsetINT
    symbol_offsetINT
    -

    表描述

    -

    记录了内存的申请和释放的堆栈。

    -

    相关字段描述

    -
      -
    • callchain_id:标识一组调用堆栈
    • -
    • depth:调用栈深度
    • -
    • symbol_id:函数名
    • -
    • file_id:函数所属文件
    • -
    -

    native_hook_statistic表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    callchain_idINT
    ipidINT
    tsINT
    typeINT
    apply_countINT
    release_countINT
    apply_sizeINT
    release_sizeINT
    -

    表描述

    -

    该表记录了内存申请/释放的统计信息。

    -

    关键字段描述

    -
      -
    • callchain_id:内存分配的回调链id
    • -
    • ipid:进程id
    • -
    • ts:统计数据上报时间
    • -
    • type:事件类型,0代表malloc事件,1代表mmap事件
    • -
    • apply_count:当前调用栈内存分配总次数
    • -
    • release_count:当前调用栈内存释放总次数
    • -
    • apply_size:当前调用栈累计分配总大小
    • -
    • release_size:当前调用栈累计释放总大小
    • -
    -

    network表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    tsINT
    durINT
    txINT
    rxINT
    tx_speedREAL
    rx_speedREAL
    packet_inINT
    packet_in_secREAL
    packet_outINT
    packet_out_secREAL
    net_typeTEXT
    -

    表描述

    -

    记录了网络数据传输相关的信息。

    -

    主要字段描述

    -
      -
    • tv_sec:时间,秒为单位
    • -
    • tv_nsec:时间,纳秒为单位
    • -
    • tx_bytes:网络数据的写入量
    • -
    • rx_bytes:网络数据的读取量
    • -
    -

    paged_memory_sample表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    callchain_idINT
    typeINT
    ipidINT
    start_tsINT
    end_tsINT
    durINT
    sizeINT
    addrTEXT
    itidINT
    -

    表描述

    -

    记录了网络数据传输相关的信息。

    -

    主要字段描述

    -
      -
    • callchain_id: 取值相同的一组数据,表示一个完整的调用栈
    • -
    • type:事件类型
    • -
    • ipid:TS内部进程号
    • -
    • start_ts:开始时间
    • -
    • end_ts:结束时间
    • -
    • dur:持续时间
    • -
    • size:操作页数
    • -
    • itid:TS内部线程号
    • -
    -

    perf_callchain表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    callchain_idINT
    depthINT
    vaddr_in_fileINT
    file_idINT
    symbol_idINT
    nameTEXT
    -

    表描述

    -

    记录了Hiperf采样数据的调用栈信息。

    -

    主要字段描述

    -
      -
    • callchain_id:标识一组调用堆栈
    • -
    • depth:调用栈深度
    • -
    • vaddr_in_file:函数在文件中的虚拟地址
    • -
    • file_id:与PerfFiles中的file_id字段相关联
    • -
    • symbol_id:与PerfFiles中的symbol_id相关联
    • -
    • name:函数名
    • -
    -

    perf_files表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    file_idINT
    serial_idINT
    symbolTEXT
    pathTEXT
    -

    表描述

    -

    记录Hiperf工具采集到的函数符号表和文件名。

    -

    主要字段描述

    -
      -
    • file_id:文件编号
    • -
    • serial_id:一个文件中可能有多个函数,serial_id表示函数的编号
    • -
    • symbol:函数名
    • -
    • path:文件路径
    • -
    -

    perf_report表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    report_typeTEXT
    report_valueTEXT
    -

    表描述

    +
  • +
  • - 记录Hiperf工具采集数据时的配置信息。包括:抓取的事件类型,抓取数据的命令, 抓数据时指定的进程名称。 + 已知进程号为7863,查询所有的采样记录
    + select A.* from perf_sample as A, perf_thread as B where B.process_id = 7863 and A.thread_id = + B.thread_id

    -

    主要字段描述

    -
      -
    • - report_type:数据类型。取值只有三种类型:config_name(事件类型), workload(抓取的进程名), - cmdline(抓取命令) -
    • -
    • report_value:对应类型的取值
    • -
    -

    perf_sample表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    callchain_idINT
    timestampINT
    thread_idINT
    event_countINT
    event_type_idINT
    timestamp_traceINT
    cpu_idINT
    thread_stateTEXT
    -

    表描述

    -

    记录Hiperf工具的采样信息。

    -

    主要字段描述

    -
      -
    • timestamp:未进行时钟源同步的时间戳
    • -
    • thread_id:线程号
    • -
    • event_count:采样统计
    • -
    • event_type_id:事件类型编号。与PerfReport表的id字段相关联
    • -
    • timestamp_trace:时钟源同步后的时间戳
    • -
    • cpu_id:cpu核编号
    • -
    • - thread_state:线程状态。采样对应Sched_Waking事件时,为Runing;对应Sched_Switch事件时,为Suspend。其余事件类型,为“-” -
    • -
    -

    perf_thread表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    thread_idINT
    process_idINT
    thread_nameTEXT
    -

    表描述

    -

    记录Hiperf工具采集到的进程和线程数据。

    -

    主要字段描述

    -
      -
    • thread_id:线程号
    • -
    • process_id:进程号
    • -
    • thread_name:线程名
    • -
    -

    process表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    ipidINT
    typeTEXT
    pidINT
    nameTEXT
    start_tsINT
    switch_countINT
    thread_countINT
    slice_countINT
    mem_countINT
    -

    表描述

    -

    记录了进程相关数据。

    -

    关键字段描述

    -
      -
    • id:进程在数据库重新重新定义的id,从0开始序列增长
    • -
    • ipid:TS内部进程id
    • -
    • type:固定取值:process
    • -
    • pid:进程的真实id
    • -
    • name:进程名字
    • -
    • start_ts:开始时间
    • -
    • switch_count:统计内部有多少个线程有切换
    • -
    • thread_count:统计其线程个数
    • -
    • slice_count:进程内有多个线程有slice数据
    • -
    • mem_count:进程是否有内存数据
    • -
    -

    process_filter表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    nameTEXT
    ipidINT
    -

    表描述

    +
  • +
  • - 将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, - filter_id同时被记录在filter表中。 + 查询所有采样对应的事件类型
    + select A.*, B.report_value from perf_sample as A, perf_report as B where A.event_type_id = B.id

    -

    主要字段描述

    -
      -
    • id:进程id
    • -
    • type:固定取值:process_filter
    • -
    • name:进程名
    • -
    • ipid:该进程表中的id与process表中的id相关联
    • -
    -

    process_measure表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    typeTEXT
    tsINT
    valueNUM
    filter_idINT
    -

    表描述

    -

    保存进程的内存,堆栈值等所有计量值信息。

    -

    字段详细描述

    -
      -
    • ts:事件时间
    • -
    • value:数值
    • -
    • filter_id:对应process_measure_filter表中的ID
    • -
    -

    process_measure_filter表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    nameTEXT
    ipidINT
    -

    表描述

    +
  • +
+

帧渲染表之间的关系图

+ +

+ frame_slice: 记录RS(RenderService)和应用的帧渲染。
+ gpu_slice: 记录RS的帧对应的gpu渲染时长。
+ frame_maps:记录应用到RS的帧的映射关系。
+ GitHub Logo +

+

查询示例

+ +
    +
  • - 将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, - filter_id同时被记录在measure_filter表中。 + 已知进程,查询进程对应的实际渲染帧
    + select * from frame_slice where ipid = 1

    -

    字段详细描述

    -
      -
    • type:固定取值:process_measure_filter
    • -
    • name:cpu状态名
    • -
    • ipid:进程内部编号
    • -
    -

    raw表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    tsINT
    nameTEXT
    cpuINT
    itidINT
    -

    表描述

    -

    记录了系统中的waking、wakup、cpu_idel、cpu_frequency数据。

    -

    相关字段描述

    -
      -
    • type:固定字段(raw)
    • -
    • name:调度名称(取值:cpu_idle,sched_wakeup,sched_waking)
    • -
    • cpu:事件发生在哪个CPU
    • -
    • itid:时间对应哪个utid
    • -
    -

    sched_slice表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    tsINT
    durINT
    ts_endINT
    cpuINT
    itidINT
    end_stateTEXT
    priorityINT
    -

    表描述

    -

    此数据结构主要作为ThreadState的上下文使用,这张表是sched_switch事件的原始记录。

    -

    主要字段描述

    -
      -
    • ts:事件发生事件
    • -
    • type:固定字段(sched_slice)
    • -
    • dur:状态持续时长
    • -
    • ts_end:状态结束时长
    • -
    • cpu:事件发生在哪个cpu
    • -
    • itid:事件对应哪个utid
    • -
    • end_state:线程的终结状态
    • -
    -

    smaps表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    timestampINT
    start_addrTEXT
    end_addrTEXT
    dirtyINT
    swapperINT
    resident_sizeINT
    pssINT
    virtaul_sizeINT
    resideREAL
    protection_idINT
    path_idINT
    -

    表描述

    -

    记录进程的内存消耗的相关信息采样。

    -

    主要字段描述

    -
      -
    • id:状态持续时长
    • -
    • timestamp:事件发生事件
    • -
    • start_addr:内存段地址的起始位置
    • -
    • end_addr:内存段地址的结束位置
    • -
    • dirty:其他进程共享的被写的页的大小 + 已被改写的私有页面的大小
    • -
    • swapper:存在于交换分区的数据大小
    • -
    • resident_size:实际分配的内存大小
    • -
    • pss:平摊计算后的实际物理使用内存
    • -
    • virtaul_size:虚拟内存空间的大小
    • -
    • reside:实际分配的内存大小与虚拟内存空间的大小的比
    • -
    • protection_id:内存段的权限id与表data_dict的id字段相关联
    • -
    • path_id:如果区域是从文件映射的,则这是文件的名称对应的id序号与表data_dict的id字段相关联
    • -
    -

    stat表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    event_nameTEXT
    stat_typeTEXT
    countINT
    serverityTEXT
    sourceTEXT
    -

    表描述

    +
  • +
  • - 此结果用来统计数据解析中各类数据的数据条数,数据和合法性,数据的匹配程度(begin-end),数据的损失等,查看此结构对应的表,可对数据源有基本的了解。 + 已知进程的实际渲染帧的dst为12,求其对应的RS进程的渲染帧
    + select * from frame_slice where id = 12

    -

    主要字段描述

    -
      -
    • event_name:数据类型
    • -
    • stat_type:数据状态
    • -
    • count:数据条数
    • -
    • severity:严重级别
    • -
    • source:数据来源
    • -
    -

    symbols表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    funcnameTEXT
    addrINT
    -

    表描述

    -

    此表记录了被调用函数与其地址的映射关系。

    -

    相关字段描述

    -
      -
    • funcname:系统调用名称
    • -
    • adr:系统调用地址
    • -
    -

    syscall表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    syscall_numINT
    typeTEXT
    ipidINT
    tsINT
    retINT
    -

    表描述

    -

    记录用户空间函数与内核空间函数相互调用记录。

    -

    相关字段描述

    -
      -
    • syscall_num:系统调用的序号
    • -
    • type:固定取值:enter或者exit
    • -
    • ipid:线程所属的进程ID
    • -
    • ts:时间戳
    • -
    • ret:返回值,在type为exit时有效
    • -
    -

    sys_event_filter表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    nameTEXT
    -

    表描述

    -

    记录所有的filter。

    -

    相关字段描述

    -
      -
    • type:文件类型
    • -
    • name:文件名
    • -
    -

    sys_mem_measure表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    typeTEXT
    tsINT
    valueINT
    filter_idINT
    -

    表描述

    -

    记录系统内存与系统虚拟内存。

    -

    相关字段描述

    -
      -
    • ts:事件时间
    • -
    • value:数值
    • -
    • filter_id:对应filter表中的ID
    • -
    -

    thread表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    itidINT
    typeTEXT
    tidINT
    nameTEXT
    start_tsINT
    end_tsINT
    ipidINT
    is_main_threadINT
    switch_countINT
    -

    表描述

    -

    记录了线程相关数据。

    -

    字段详细描述

    -
      -
    • id:线程在数据库重新重新定义的id,从0开始序列增长
    • -
    • itid:TS内部线程id
    • -
    • type:固定字段(thread)
    • -
    • tid:线程号
    • -
    • name:线程名
    • -
    • start_ts:开始时间
    • -
    • end_ts:结束时间
    • -
    • ipid:线程所属的进程id, 关联process表中的ID
    • -
    • is_main_thread:是否主线程,主线程即该线程实际就是进程本身
    • -
    • switch_count:当前线程的切换次数
    • -
    -

    thread_filter表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    nameTEXT
    itidINT
    -

    表描述

    +
  • +
  • - 将线程ID作为key1,线程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, - filter_id同时被记录在filter表中。 + 已知RS的渲染帧在frame_slice中所在行是14,求其对应的GPU渲染时长
    + select * from gpu_slice where frame_row = 14

    -

    主要字段描述

    -
      -
    • id:线程id
    • -
    • type:线程类型
    • -
    • name:线程名称
    • -
    • itid:该表中的tid与thread表中的tid相关联
    • -
    -

    thread_state表

    -

    表结构

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Columns NameSQL TYPE
    idINT
    typeTEXT
    tsINT
    durINT
    cpuINT
    itidINT
    tidINT
    pidINT
    stateTEXT
    -

    表描述

    -

    记录了线程状态相关的数据。

    -

    字段详细描述

    -
      -
    • id:线程状态在数据库中的id,从0开始序列增长
    • -
    • ts:该线程状态的起始时间
    • -
    • dur:该线程状态的持续时间
    • -
    • cpu:该线程在哪个cpu上执行(针对running状态的线程)
    • -
    • itid:该状态所属的线程id, 关联线程表中的id
    • -
    • tid:线程号
    • -
    • pid:进程号
    • -
    • state:线程实际的的状态值
    • -
    -
    'R', Runnable状态
    +    
  • +
+

JS内存数据表关系图

+

js_heap_files:记录js内存数据的文件名和文件索引

+

+

+ js_heap_nodes:记录js内存类对象数据
+ js_heap_edges:记录js内存类对象的成员数据
+ js_heap_trace_node:记录timeline的调用栈信息
+ js_heap_sample:记录timeline的时间轴信息
+ +

+

TraceStreamer输出数据库表格详细介绍

+

app_name表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
flagINT
app_nameINT
app_keyINT
+

表描述

+

记录HiSysevent上报事件中的IDE相关事件中APPNAME的表关联信息。

+

字段详细描述

+
    +
  • id:用于与表hisys_event_measure表中的key_id字段做对应
  • +
  • app_name:对应的事件的信息ID
  • +
  • app_key:对应的事件的APPNAME字段的信息ID
  • +
+

args表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
keyINT
datatypeINT
valueINT
argsetINT
+

表描述

+

记录方法的参数集合。

+

字段详细描述

+
    +
  • key:键
  • +
  • datatype:数据类型
  • +
  • value:取值
  • +
  • argset:参数集合
  • +
+

bio_latency_sample表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
callchain_idINT
datatypeINT
typeINT
ipidINT
itidINT
start_tsINT
end_tsINT
latency_durINT
tierINT
sizeINT
block_numberTEXT
pathTEXT
dur_per_4kINT
+

表描述

+

记录IO操作相关方法调用,及调用栈数据。

+

字段详细描述

+
    +
  • callchain_id:调用栈的唯一标识。与ebpf_callstack表中Callchain_id字段关联
  • +
  • + type:事件类型其取值为枚举类型(DATA_READ,DATA_WRITE,METADATA_READ,- METADATA_WRITE,PAGE_IN,PAGE_OUT) +
  • +
  • ipid:TS内部进程号
  • +
  • itid:TS内部线程号
  • +
  • start_ts:开始时间
  • +
  • end_ts:结束时间
  • +
  • latency_dur:总延迟
  • +
  • tier:优先级
  • +
  • size:文件大小
  • +
  • block_number:数据量大小(一般为4K)
  • +
  • path:路径id
  • +
  • dur_per_4k:每4k数据的平均延迟
  • +
+

callstack表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
tsINT
durINT
callidINT
catTEXT
identifyINT
nameTEXT
depthINT
cookieINT
parent_idINT
argsetidINT
chainIdTEXT
spanIdTEXT
parentSpanIdTEXT
flagTEXT
argsTEXT
+

表描述

+

+ 记录调用堆栈和异步调用信息,其中depth,stack_id和parent_stack_id仅在非异步的调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号。 +

+

字段详细描述

+
    +
  • dur:调用时长
  • +
  • callid:调用者的ID,比如针对线程表里面的id
  • +
  • identify:调用栈的名字,与表dataDict相关联能够取出其string值
  • +
  • name:调用名称
  • +
  • depth:调用深度
  • +
  • parent_id:父调用的id
  • +
  • spanId:分布式调用关联关系
  • +
  • flag:C表示分布式调用发送方,S表示接受方
  • +
  • args:分布式调用函数参数
  • +
+

clk_event_filter表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
nameTEXT
cpuINT
+

表描述

+

记录时钟信息。

+

字段详细描述

+
    +
  • Type:时钟事件类型
  • +
  • Name:时钟事件名称
  • +
+

clock_event_filter表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
nameTEXT
cpuINT
+

表描述

+

此结构用来维护时钟事件,cpu与唯一的ID做关联。

+

主要字段描述

+
    +
  • Type:时钟事件类型
  • +
  • Name:时钟事件名称
  • +
+

cpu_measure_filter表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
nameTEXT
cpuINT
+

表描述

+

将cpu号作为key1,cpu的频率,空闲等状态作为key2,唯一确定一个filter_id。

+

主要字段描述

+
    +
  • Id(filterid), cpu:事件名称,cpu号
  • +
+

cpu_usage表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
tsINT
durINT
total_loadREAL
user_loadREAL
system_loadREAL
process_numINT
+

表描述

+

记录了与CPU使用率相关的数据。

+

主要字段描述

+
    +
  • total_load:总负荷
  • +
  • user_load:用户负载
  • +
  • system_load:系统负载
  • +
  • process_num:线程数
  • +
+

data_dict表

+

表结构

+ + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
dataTEXT
+

表描述

+

此表记录了一个数据类型ID和字符串的映射。

+

主要字段描述

+
    +
  • id:索引值
  • +
  • data:字符串
  • +
+

data_type表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeIdINT
descTEXT
+

表描述

+

此表记录了一个数据类型ID和数据描述的映射。

+

主要字段描述

+
    +
  • typeId::数据类型id
  • +
  • Desc:数据类型描述
  • +
+

diskio表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
tsINT
durINT
rdINT
wrINT
rd_speedREAL
wr_speedREAL
rd_countINT
wr_countINT
rd_count_speedREAL
wr_count_speedREAL
+

表描述

+

记录了与磁盘读写相关的数据。

+

主要字段描述

+
    +
  • rd_sectors_kb:读数据的速度
  • +
  • wr_sectors_kb:写入数据的速度
  • +
  • ts:时间戳
  • +
+

ebpf_callstack表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
callchain_idINT
depthTEXT
ipTEXT
symbols_idINT
file_path_idINT
+

表描述

+

记录了与磁盘读写相关的数据。

+

主要字段描述

+
    +
  • callchain_id:调用栈的唯一标识
  • +
  • depth:调用栈深度。取值为零时表示栈顶
  • +
  • ip:调用栈ip
  • +
  • symbols_id:调用栈函数名称, 与data_dict中的id字段关联
  • +
  • file_path_id:调用栈函数所属文件路径, 与data_dict中的id字段关联
  • +
+

file_system_sample表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
callchain_idINT
typeINT
ipidINT
itidINT
start_tsINT
end_tsINT
durINT
return_valueTEXT
error_codeTEXT
fdINT
file_idINT
sizeINT
first_argumentTEXT
second_argumentTEXT
third_argumentTEXT
fourth_argumentTEXT
+

表描述

+

记录了调用栈的相关信息。

+

主要字段描述

+
    +
  • callchain_id:调用栈信息ID与file_system_callstack表中call_chain_id字段相关联
  • +
  • type:对应文件操作open,close,read,write
  • +
  • ipid:线程所属的进程ID
  • +
  • start_ts:开始时间
  • +
  • end_ts:结束时间
  • +
  • dur:耗时
  • +
  • return_value:文件操作的返回值
  • +
  • error_code:文件操作发生错误时的错误码
  • +
  • fd:文件描述符fd
  • +
  • file_id:当type为open,close时为其操作的文件路径,当type为read,write时为固定字段(null)
  • +
  • size:在type为read,write时对应的文件的读或者写的大小
  • +
  • first_argument:参数一
  • +
  • second_argument:参数二
  • +
  • third_argument:参数三
  • +
  • fourth_argument:参数四
  • +
+

hidump表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
tsINT
fpsINT
+

表描述

+

此表记录了设备的帧率信息,fps。

+

相关字段描述

+
    +
  • fps:帧率值
  • +
+

hisys_event_measure表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
serialINT
tsINT
name_idINT
key_idINT
typeINT
int_valueREAL
string_valueTEXT
+

表描述

+

记录所有的system event事件的相关数据,及其相关表的映射信息。

+

相关字段描述

+
    +
  • serial:每条数据过来携带唯一一条id作为标识
  • +
  • name_id:存放事件对应的ID,与data_dict表相关联可以取出对应的字段
  • +
  • + key_id:存放事件包含的字段的ID,与表app_name的id字段相关联,找到app_name表的 + id字段对应行的app_key字段与表data_dict表相关联取出对应的字段 +
  • +
  • type:存放事件所包含的字段的值所属的类型为int型还是string(0为int,1为string)
  • +
  • int_value:存放本事件所包含的字段的int型的值
  • +
  • string_value:存放本事件所包含的字段的string型的值
  • +
+

instant表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
tsINT
nameTEXT
refINT
wakeup_fromINT
ref_typeTEXT
valueREAL
+

表描述

+

记录了系统中的waking和wakeup事件。

+

字段描述

+
    +
  • ts:唤醒时间
  • +
  • name:唤醒事件的名称
  • +
  • ref:索引号
  • +
  • wakeup_from:唤醒当前线程的内部线程号(itid)
  • +
  • ref_type:描述了value字段的类型(一般取值为itid)
  • +
  • value:一般为当前线程的内部线程号取值
  • +
+

irq表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
tsINT
durINT
callidINT
catTEXT
nameTEXT
depthINT
cookieINT
parent_idINT
argsetidINT
chainIdTEXT
spanIdTEXT
parentSpanIdTEXT
flagTEXT
argsTEXT
+

表描述

+

记录中断相关事件。

+

相关字段描述

+
    +
  • dur:调用中断时长
  • +
  • callid:调用中断者的ID,比如针对线程表里面的id
  • +
  • cat:调用栈数据类型(取值范围:irq,softirq...)
  • +
  • name:调用中断的名称
  • +
  • depth:中断调用的深度
  • +
  • parent_id:父调用中断的id
  • +
  • spanId:分布式调用中断关联关系
  • +
+

js_config表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
pidINT
typeINT
intervalINT
capture_numeric_valueINT
trace_allocationINT
enable_cpu_profilerINT
cpu_profiler_intervalINT
+

表描述

+

记录arkTs数据采集的相关配置。

+

相关字段描述

+
    +
  • pid:目标进程ID。
  • +
  • + type:JS数据类型,取值与枚举HeapType对应,0表示JS内存数据为snapshot类型,1表示JS内存数据为timeline类型,-1表示没有JS内存数据。 +
  • +
  • interval:当type=0时生效,单位是秒,表示一次snapshot事件和下一次snapshot事件之间的间隔。
  • +
  • capture_numeric_value:当type=0时生效,表示是否同时抓取numeric。
  • +
  • track_allocation:当type=1时生效,表示是否抓取allocations。
  • +
  • enable_cpu_profiler:表示是否存在cpuprofiler的数据。
  • +
  • cpu_profiler_interval:表示cpuprofiler数据的采集间隔。
  • +
+

js_cpu_profiler_node表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
function_idINT
function_indexINT
script_idINT
url_indexINT
line_numberINT
column_numberINT
hit_countINT
childrenINT
parent_idINT
+

表描述

+

记录cpu profiler中node节点的数据。

+

相关字段描述

+
    +
  • function_id: 函数的ID号。
  • +
  • function_index:函数名称在data_dict中的索引号。
  • +
  • script_id:关联到的类对象所在文件的绝对路径ID。
  • +
  • url_index:关联到的类对象所在文件的绝对路径名称在data_dict中的索引号。
  • +
  • line_number:类对象所在文件的行号。
  • +
  • column_number:类对象所在文件的列号。
  • +
  • hit_count:采样次数。
  • +
  • children:子节点的id号。
  • +
  • parent_id:父节点的id号。
  • +
+

js_cpu_profiler_sample表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
function_idINT
start_timeINT
end_timeINT
durINT
+

表描述

+

记录了cpu profiler 中sample节点的数据。

+

相关字段描述

+
    +
  • id: ts内部ID号。
  • +
  • function_id:函数的ID号。
  • +
  • start_time:数据上报的起始时间。
  • +
  • end_time:数据上报的终止时间。
  • +
  • dur:数据上报的间隔时间。
  • +
+

js_heap_edges表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
file_idINT
edge_indexINT
typeINT
name_or_indexINT
to_nodeINT
from_node_idINT
to_node_idINT
+

表描述

+

记录js内存数据类对象对应的成员的信息。

+

相关字段描述

+
    +
  • file_id:文件ID
  • +
  • edge_index:成员的索引号
  • +
  • type:成员的类型,取值范围为js_heap_info表中的edge_types
  • +
  • name_or_index:数据名称,取值为js_heap_string表中的下标索引
  • +
  • to_node:此成员指向的类对象在nodes数组中的索引
  • +
  • from_node_id:类对象ID,该类对象指向此成员数据
  • +
  • to_node_id:此成员指向到的类对象nodes数组中的ID
  • +
+

js_heap_files表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
file_nameTEXT
start_timeINT
end_timeINT
pidINT
+

表描述

+

记录了js内存数据的文件名称和时间。

+

相关字段描述

+
    +
  • id:文件ID
  • +
  • file_name:文件名称
  • +
  • start_time:数据抓取的起始时间
  • +
  • end_time:数据抓取的终止时间
  • +
  • pid:进程号
  • +
+

js_heap_info表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
file_idINT
keyTEXT
typeINT
int_valueINT
str_valueTEXT
+

表描述

+

记录了js内存数据类型,如nodes和edges的字段类型和数据总数。

+

相关字段描述

+
    +
  • file_id:文件ID
  • +
  • key:类型名称
  • +
  • type:数据类型索引
  • +
  • int_value:int类型的数据值,如count类型数据
  • +
  • str_value:string类型的数据值,如typename
  • +
+

js_heap_location表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
file_idINT
object_indexINT
script_idINT
lineINT
columnINT
+

表描述

+

记录了js内存location节点相关数据,此表目前无抓取到的数据。

+

相关字段描述

+
    +
  • file_id:文件ID
  • +
  • object_index:与location关联的类对象的索引,取值为js_heap_nodes的下标索引
  • +
  • script_id:关联到的类对象所在文件的绝对路径ID
  • +
  • line:在类对象所在的文件中的行号
  • +
  • column:在类对象所在的文件中的列号
  • +
+

js_heap_nodes表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
file_idINT
node_indexTEXT
typeINT
nameINT
idTEXT
self_sizeINT
edge_countINT
trace_node_idINT
detachednessINT
+

表描述

+

记录了js内存数据中类对象的数据。

+

相关字段描述

+
    +
  • file_id:文件ID
  • +
  • node_index:类对象的索引
  • +
  • type:类对象的类型
  • +
  • name:类对象的名称
  • +
  • id:类对象的唯一ID
  • +
  • self_size:该类对象所有成员的大小(以字节为单位)
  • +
  • edge_count:该类对象指向的类成员的个数
  • +
  • trace_node_id:该类对象关联到js_heap_trace_node表中的调用栈ID
  • +
  • detachedness:是否可以从window全局对象访问此节点,0表示是,1表示否
  • +
+

js_heap_sample表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
file_idINT
timestamp_usINT
last_assigned_idINT
+

表描述

+

记录了timeline模式下的时间轴信息。

+

相关字段描述

+
    +
  • file_id:文件ID
  • +
  • timestamp_us:时间信息
  • +
  • last_assigned_id:当前时间点的id
  • +
+

js_heap_string表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
file_idINT
file_indexINT
stringTEXT
+

表描述

+

记录了js内存数据中的字符串。

+

相关字段描述

+
    +
  • file_id:文件ID
  • +
  • file_index:索引
  • +
  • string:对应的字符串信息
  • +
+

js_heap_trace_function_info表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
file_idINT
function_indexINT
function_idINT
nameINT
script_nameINT
script_idINT
lineINT
columnINT
+

表描述

+

记录了timeline模式下的调用栈的每个函数信息。

+

相关字段描述

+
    +
  • file_id:文件ID
  • +
  • function_index:函数索引
  • +
  • function_id:函数ID
  • +
  • name:函数名称
  • +
  • script_name:关联到的类对象所在文件的绝对路径名称
  • +
  • script_id:关联到的类对象所在文件的绝对路径ID
  • +
  • line:在类对象所在的文件中的行号
  • +
  • column:在类对象所在的文件中的列号
  • +
+

js_heap_trace_node表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
file_idINT
idINT
function_info_indexINT
countINT
sizeINT
parent_idINT
+

表描述

+

记录了timeline模式下的调用栈的信息。

+

相关字段描述

+
    +
  • file_id:文件ID
  • +
  • id:调用栈节点索引
  • +
  • function_info_index:函数信息索引
  • +
  • count:调用栈个数
  • +
  • size:调用栈大小
  • +
  • parent_id:调用栈父节点
  • +
+

app_startup表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
call_idINT
ipidINT
tidINT
start_timeINT
end_timeINT
start_nameINT
packed_nameINT
+

表描述

+

记录了应用启动的相关信息。

+

相关字段描述

+
    +
  • call_id:调用者的ID,比如针对线程表里面的id
  • +
  • ipid:内部进程号
  • +
  • tid:内部线程号
  • +
  • start_time:阶段开始时间
  • +
  • end_time:阶段结束时间
  • +
  • start_name:阶段名称
  • +
  • packed_name:应用名称
  • +
+

static_intialize表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
call_idINT
ipidINT
tidINT
start_timeINT
end_timeINT
so_nameINT
depthINT
+

表描述

+

记录了so初始化的相关信息。

+

相关字段描述

+
    +
  • call_id:调用者的ID,比如针对线程表里面的id
  • +
  • ipid:内部进程号
  • +
  • tid:内部线程号
  • +
  • start_time:阶段开始时间
  • +
  • end_time:阶段结束时间
  • +
  • so_name:so文件名称
  • +
  • depth:泳道图的深度
  • +
+

live_process表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
tsINT
durINT
cpu_timeINT
process_idINT
process_nameTEXT
parent_process_idINT
uidINT
user_nameTEXT
cpu_usageREAL
pss_infoINT
thread_numINT
disk_writesINT
disk_readsINT
+

表描述

+

记录了一些实时的进程中执行的一些数据(Monitor)。

+

主要字段描述

+
    +
  • process_id:进程id
  • +
  • process_name:进程名
  • +
  • parent_process_id:父进程的id
  • +
  • uid:用户id
  • +
  • user_name:用户名
  • +
  • cpu_usage:cpu使用率
  • +
  • pss_info:进程信息
  • +
  • thread_num:线程数量
  • +
  • disk_writes:磁盘写量
  • +
  • disk_reads:磁盘读量
  • +
+

log表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
seqINT
tsINT
pidINT
tidINT
levelTEXT
tagTEXT
contextTEXT
origintsINT
+

表描述

+

记录日志信息。

+

关键字段描述

+
    +
  • Seq:日志序号,保证日志解析的准确性
  • +
  • Ts:打印日志时间
  • +
  • Pid:日志的进程号
  • +
  • Tid:日志的线程号
  • +
  • Level:日志级别
  • +
  • Tag:日志标签
  • +
  • Context:日志内容
  • +
+

measure表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
typeTEXT
tsINT
durINT
valueINT
filter_idINT
+

表描述

+

记录所有的计量值。

+

关键字段描述

+
    +
  • type:固定字段(measure)
  • +
  • ts:事件时间
  • +
  • dur:该值持续的时长
  • +
  • value:数值
  • +
  • filter_id:对应filter表中的ID
  • +
+

measure_filter表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
nameTEXT
source_arg_set_idINT
+

表描述

+

+ 记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录。 +

+

字段详细描述

+

+ 过滤分类(type),过滤名称(key2),数据ID(key1)。
+ 数据ID在process_measure_filter, sys_event_filter中作为id。 +

+

meta表

+

表结构

+ + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
nameTEXT
valueTEXT
+

表描述

+

+ 此表记录了数据解析或导出时的一些现场数据,比如使用的TraceStreamer版本, + 工具的发布时间,数据解析的时间,数据的持续时长,以及原始数据的格式。 +

+

主要字段描述

+
    +
  • Name:指定元数据的key
  • +
  • Value:指定元数据的value
  • +
+

native_hook表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
callChainIdINT
ipidINT
itidINT
event_typeTEXT
sub_type_idNUM
start_tsINT
end_tsINT
durINT
addrINT
heap_sizeINT
all_heap_sizeINT
current_size_durINT
last_lib_idINT
+

表描述

+

记录native_hook抓取的某个进程的堆内存,内存映射相关数据。

+

关键字段描述

+
    +
  • callChainId:唯一标识一条native_hook数据
  • +
  • event_type:事件类型取值范围(AllocEvent,FreeEvent,MmapEvent, MunmapEvent)
  • +
  • sub_type_id:子事件类型(只有sub_type字段为MmapEvent时,该字段才会有值)
  • +
  • start_ts:申请内存开始时间
  • +
  • end_ts:释放内存时间
  • +
  • Dur:申请内存活跃时间
  • +
  • Addr:申请内存地址
  • +
  • mem_size:申请或释放内存大小
  • +
  • + all_mem_size:从采集数据开始到当前时刻,申请并活跃的内存总量。 + event_type为AllocEvent或者FreeEvent时,表示活跃的堆内存总量。当event_type为MmapEvent或者MunmapEvent时,表示活跃的映射内存总量 +
  • +
  • current_size_dur:表示当前活跃内存总量的持续时间
  • +
  • last_lib_id:函数调用栈他最后一个函数所属的文件路径,除了文件名中带musl和libc++
  • +
+

native_hook_frame表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
callchain_idINT
depthINT
symbol_idINT
file_idINT
offsetINT
symbol_offsetINT
+

表描述

+

记录了内存的申请和释放的堆栈。

+

相关字段描述

+
    +
  • callchain_id:标识一组调用堆栈
  • +
  • depth:调用栈深度
  • +
  • symbol_id:函数名
  • +
  • file_id:函数所属文件
  • +
+

native_hook_statistic表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
callchain_idINT
ipidINT
tsINT
typeINT
apply_countINT
release_countINT
apply_sizeINT
release_sizeINT
+

表描述

+

该表记录了内存申请/释放的统计信息。

+

关键字段描述

+
    +
  • callchain_id:内存分配的回调链id
  • +
  • ipid:进程id
  • +
  • ts:统计数据上报时间
  • +
  • type:事件类型,0代表malloc事件,1代表mmap事件
  • +
  • apply_count:当前调用栈内存分配总次数
  • +
  • release_count:当前调用栈内存释放总次数
  • +
  • apply_size:当前调用栈累计分配总大小
  • +
  • release_size:当前调用栈累计释放总大小
  • +
+

network表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
tsINT
durINT
txINT
rxINT
tx_speedREAL
rx_speedREAL
packet_inINT
packet_in_secREAL
packet_outINT
packet_out_secREAL
net_typeTEXT
+

表描述

+

记录了网络数据传输相关的信息。

+

主要字段描述

+
    +
  • tv_sec:时间,秒为单位
  • +
  • tv_nsec:时间,纳秒为单位
  • +
  • tx_bytes:网络数据的写入量
  • +
  • rx_bytes:网络数据的读取量
  • +
+

paged_memory_sample表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
callchain_idINT
typeINT
ipidINT
start_tsINT
end_tsINT
durINT
sizeINT
addrTEXT
itidINT
+

表描述

+

记录了网络数据传输相关的信息。

+

主要字段描述

+
    +
  • callchain_id: 取值相同的一组数据,表示一个完整的调用栈
  • +
  • type:事件类型
  • +
  • ipid:TS内部进程号
  • +
  • start_ts:开始时间
  • +
  • end_ts:结束时间
  • +
  • dur:持续时间
  • +
  • size:操作页数
  • +
  • itid:TS内部线程号
  • +
+

perf_callchain表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
callchain_idINT
depthINT
vaddr_in_fileINT
file_idINT
symbol_idINT
nameTEXT
+

表描述

+

记录了Hiperf采样数据的调用栈信息。

+

主要字段描述

+
    +
  • callchain_id:标识一组调用堆栈
  • +
  • depth:调用栈深度
  • +
  • vaddr_in_file:函数在文件中的虚拟地址
  • +
  • file_id:与PerfFiles中的file_id字段相关联
  • +
  • symbol_id:与PerfFiles中的symbol_id相关联
  • +
  • name:函数名
  • +
+

perf_files表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
file_idINT
serial_idINT
symbolTEXT
pathTEXT
+

表描述

+

记录Hiperf工具采集到的函数符号表和文件名。

+

主要字段描述

+
    +
  • file_id:文件编号
  • +
  • serial_id:一个文件中可能有多个函数,serial_id表示函数的编号
  • +
  • symbol:函数名
  • +
  • path:文件路径
  • +
+

perf_report表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
report_typeTEXT
report_valueTEXT
+

表描述

+

+ 记录Hiperf工具采集数据时的配置信息。包括:抓取的事件类型,抓取数据的命令, 抓数据时指定的进程名称。 +

+

主要字段描述

+
    +
  • + report_type:数据类型。取值只有三种类型:config_name(事件类型), workload(抓取的进程名), + cmdline(抓取命令) +
  • +
  • report_value:对应类型的取值
  • +
+

perf_sample表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
callchain_idINT
timestampINT
thread_idINT
event_countINT
event_type_idINT
timestamp_traceINT
cpu_idINT
thread_stateTEXT
+

表描述

+

记录Hiperf工具的采样信息。

+

主要字段描述

+
    +
  • timestamp:未进行时钟源同步的时间戳
  • +
  • thread_id:线程号
  • +
  • event_count:采样统计
  • +
  • event_type_id:事件类型编号。与PerfReport表的id字段相关联
  • +
  • timestamp_trace:时钟源同步后的时间戳
  • +
  • cpu_id:cpu核编号
  • +
  • + thread_state:线程状态。采样对应Sched_Waking事件时,为Runing;对应Sched_Switch事件时,为Suspend。其余事件类型,为“-” +
  • +
+

perf_thread表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
thread_idINT
process_idINT
thread_nameTEXT
+

表描述

+

记录Hiperf工具采集到的进程和线程数据。

+

主要字段描述

+
    +
  • thread_id:线程号
  • +
  • process_id:进程号
  • +
  • thread_name:线程名
  • +
+

process表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
ipidINT
typeTEXT
pidINT
nameTEXT
start_tsINT
switch_countINT
thread_countINT
slice_countINT
mem_countINT
+

表描述

+

记录了进程相关数据。

+

关键字段描述

+
    +
  • id:进程在数据库重新重新定义的id,从0开始序列增长
  • +
  • ipid:TS内部进程id
  • +
  • type:固定取值:process
  • +
  • pid:进程的真实id
  • +
  • name:进程名字
  • +
  • start_ts:开始时间
  • +
  • switch_count:统计内部有多少个线程有切换
  • +
  • thread_count:统计其线程个数
  • +
  • slice_count:进程内有多个线程有slice数据
  • +
  • mem_count:进程是否有内存数据
  • +
+

process_filter表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
nameTEXT
ipidINT
+

表描述

+

+ 将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, + filter_id同时被记录在filter表中。 +

+

主要字段描述

+
    +
  • id:进程id
  • +
  • type:固定取值:process_filter
  • +
  • name:进程名
  • +
  • ipid:该进程表中的id与process表中的id相关联
  • +
+

process_measure表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
typeTEXT
tsINT
valueNUM
filter_idINT
+

表描述

+

保存进程的内存,堆栈值等所有计量值信息。

+

字段详细描述

+
    +
  • ts:事件时间
  • +
  • value:数值
  • +
  • filter_id:对应process_measure_filter表中的ID
  • +
+

process_measure_filter表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
nameTEXT
ipidINT
+

表描述

+

+ 将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, + filter_id同时被记录在measure_filter表中。 +

+

字段详细描述

+
    +
  • type:固定取值:process_measure_filter
  • +
  • name:cpu状态名
  • +
  • ipid:进程内部编号
  • +
+

raw表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
tsINT
nameTEXT
cpuINT
itidINT
+

表描述

+

记录了系统中的waking、wakup、cpu_idel、cpu_frequency数据。

+

相关字段描述

+
    +
  • type:固定字段(raw)
  • +
  • name:调度名称(取值:cpu_idle,sched_wakeup,sched_waking)
  • +
  • cpu:事件发生在哪个CPU
  • +
  • itid:时间对应哪个utid
  • +
+

sched_slice表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
tsINT
durINT
ts_endINT
cpuINT
itidINT
end_stateTEXT
priorityINT
+

表描述

+

此数据结构主要作为ThreadState的上下文使用,这张表是sched_switch事件的原始记录。

+

主要字段描述

+
    +
  • ts:事件发生事件
  • +
  • type:固定字段(sched_slice)
  • +
  • dur:状态持续时长
  • +
  • ts_end:状态结束时长
  • +
  • cpu:事件发生在哪个cpu
  • +
  • itid:事件对应哪个utid
  • +
  • end_state:线程的终结状态
  • +
+

smaps表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
timestampINT
start_addrTEXT
end_addrTEXT
dirtyINT
swapperINT
resident_sizeINT
pssINT
virtaul_sizeINT
resideREAL
protection_idINT
path_idINT
+

表描述

+

记录进程的内存消耗的相关信息采样。

+

主要字段描述

+
    +
  • id:状态持续时长
  • +
  • timestamp:事件发生事件
  • +
  • start_addr:内存段地址的起始位置
  • +
  • end_addr:内存段地址的结束位置
  • +
  • dirty:其他进程共享的被写的页的大小 + 已被改写的私有页面的大小
  • +
  • swapper:存在于交换分区的数据大小
  • +
  • resident_size:实际分配的内存大小
  • +
  • pss:平摊计算后的实际物理使用内存
  • +
  • virtaul_size:虚拟内存空间的大小
  • +
  • reside:实际分配的内存大小与虚拟内存空间的大小的比
  • +
  • protection_id:内存段的权限id与表data_dict的id字段相关联
  • +
  • path_id:如果区域是从文件映射的,则这是文件的名称对应的id序号与表data_dict的id字段相关联
  • +
+

stat表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
event_nameTEXT
stat_typeTEXT
countINT
serverityTEXT
sourceTEXT
+

表描述

+

+ 此结果用来统计数据解析中各类数据的数据条数,数据和合法性,数据的匹配程度(begin-end),数据的损失等,查看此结构对应的表,可对数据源有基本的了解。 +

+

主要字段描述

+
    +
  • event_name:数据类型
  • +
  • stat_type:数据状态
  • +
  • count:数据条数
  • +
  • severity:严重级别
  • +
  • source:数据来源
  • +
+

symbols表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
funcnameTEXT
addrINT
+

表描述

+

此表记录了被调用函数与其地址的映射关系。

+

相关字段描述

+
    +
  • funcname:系统调用名称
  • +
  • adr:系统调用地址
  • +
+

syscall表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
syscall_numINT
typeTEXT
ipidINT
tsINT
retINT
+

表描述

+

记录用户空间函数与内核空间函数相互调用记录。

+

相关字段描述

+
    +
  • syscall_num:系统调用的序号
  • +
  • type:固定取值:enter或者exit
  • +
  • ipid:线程所属的进程ID
  • +
  • ts:时间戳
  • +
  • ret:返回值,在type为exit时有效
  • +
+

sys_event_filter表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
nameTEXT
+

表描述

+

记录所有的filter。

+

相关字段描述

+
    +
  • type:文件类型
  • +
  • name:文件名
  • +
+

sys_mem_measure表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
typeTEXT
tsINT
valueINT
filter_idINT
+

表描述

+

记录系统内存与系统虚拟内存。

+

相关字段描述

+
    +
  • ts:事件时间
  • +
  • value:数值
  • +
  • filter_id:对应filter表中的ID
  • +
+

thread表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
itidINT
typeTEXT
tidINT
nameTEXT
start_tsINT
end_tsINT
ipidINT
is_main_threadINT
switch_countINT
+

表描述

+

记录了线程相关数据。

+

字段详细描述

+
    +
  • id:线程在数据库重新重新定义的id,从0开始序列增长
  • +
  • itid:TS内部线程id
  • +
  • type:固定字段(thread)
  • +
  • tid:线程号
  • +
  • name:线程名
  • +
  • start_ts:开始时间
  • +
  • end_ts:结束时间
  • +
  • ipid:线程所属的进程id, 关联process表中的ID
  • +
  • is_main_thread:是否主线程,主线程即该线程实际就是进程本身
  • +
  • switch_count:当前线程的切换次数
  • +
+

thread_filter表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
nameTEXT
itidINT
+

表描述

+

+ 将线程ID作为key1,线程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, + filter_id同时被记录在filter表中。 +

+

主要字段描述

+
    +
  • id:线程id
  • +
  • type:线程类型
  • +
  • name:线程名称
  • +
  • itid:该表中的tid与thread表中的tid相关联
  • +
+

thread_state表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
typeTEXT
tsINT
durINT
cpuINT
itidINT
tidINT
pidINT
stateTEXT
+

表描述

+

记录了线程状态相关的数据。

+

字段详细描述

+
    +
  • id:线程状态在数据库中的id,从0开始序列增长
  • +
  • ts:该线程状态的起始时间
  • +
  • dur:该线程状态的持续时间
  • +
  • cpu:该线程在哪个cpu上执行(针对running状态的线程)
  • +
  • itid:该状态所属的线程id, 关联线程表中的id
  • +
  • tid:线程号
  • +
  • pid:进程号
  • +
  • state:线程实际的的状态值
  • +
+
'R', Runnable状态
 "S", interruptible sleep
 "D", uninterruptible sleep
 "D-IO", uninterruptible io
 "D-NIO", uninterruptible nio
 "Runing", Runing状态
-"I", interrupted
-"T", Traced
+"T", Task stoped.
+"t"  Traced.
 "X", ExitedDead
 "Z", Zombie
-"I", CloneThread
-"I", TaskKilled
+"P", Parked
+"I", Task_Dead
 "DK",
 "DK-IO",
 "DK-NIO",
 "TK", TracedKill
-"R", WakeKill
-"P", Parked
-"R+", ForeGround
+"R+", WakeKill
+"R+", TaskNew
+"R-B", Task runnable binder.
 
-

clock_snapshot表

-

表结构

- - - - - - - - - - - - - - - - - - - - - -
Columns NameSQL TYPE
clock_idINT
tsINT
clock_nameTEXT
-

表描述

-

时钟号和时间,时钟名的映射表。

-

关键字段描述

-
    -
  • clock_id:时钟号
  • -
  • ts:时钟快照报的时间
  • -
  • - clock_name:时钟号对应的时钟名字
    - 时钟快照是用来对齐不同时钟号的时间
    - 比如,时钟号1的时间100,和时钟号2的时间200对齐
    - 则时钟号为2 的250,转换为时钟号1的时间后,为150 -
  • -
-

datasource_clockid表

-

表结构

- - - - - - - - - - - - - - - - - -
Columns NameSQL TYPE
data_source_nameTEXT
clock_idINT
-

表描述

-

数据源和时钟号的映射表。

-

关键字段描述

-
    -
  • data_source_name:数据源的名称,和数据源的插件名保持一致
  • -
  • - clock_id:时钟号,对应clock_snapshot中的时钟号
    - 这个表是用来告诉IDE,不同的事件源的事件,原始时钟号是多少,在数据库中保存的事件,通常是转换为boottime后的时间,但有些情况下,IDE仍然需要知道原始的时钟号是怎样的 -
  • -
-

frame_slice表

-

表结构

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Columns NameSQL TYPE
tsINT
vsyncINT
ipidINT
itidINT
callstack_idINT
durINT
srcTEXT
dstINT
typeINT
flagINT
depthINT
frame_noINT
-

表描述

-

应用的实际渲染帧和期望渲染帧的开始时间,持续时长,以及RenderService和App之间的关联关系。

-

关键字段描述

-
    -
  • callstack_id:该帧数据对应着callstack表的调用栈所在的行数
  • -
  • dur:该帧渲染时长(当数据不完整时,改行数据为空)
  • -
  • src:该帧是被哪一帧(该表中对应的行数)触发的,有多个值时,用逗号分割
  • -
  • dst:该帧对应的渲染帧是哪一行
  • -
  • type: 0 说明该行数据是实际渲染帧, 1 说明该行数据是期望渲染帧
  • -
  • - flag: 空时,为不完整的数据;0 表示实际渲染帧不卡帧, 1 表示实际渲染帧卡帧, 2 - 表示数据不需要绘制(没有frameNum信息) -
  • -
  • depth:预留
  • -
  • frame_no:预留
  • -
-

frame_maps表

-

表结构

- - - - - - - - - - - - - - - - - - - - - -
Columns NameSQL TYPE
tsINT
src_rowINT
dst_rowINT
-

表描述

-

该表记录了app到RenderService的帧的映射关系,同frame_slice表中的src映射到dst的关系。

-

关键字段描述

-
    -
  • src_row:frame_slice表中app的帧所在的行
  • -
  • dst_row:frame_slice表中RenderService的帧所在的行
  • -
-

gpu_slice表

-

表结构

- - - - - - - - - - - - - - - - - -
Columns NameSQL TYPE
frame_rowINT
durINT
-

表描述

-

该表记录了每一帧数据在GPU上的渲染时长。

-

关键字段描述

-
    -
  • frame_row:frame_slice表中渲染帧所在的行
  • -
  • dur:帧渲染时长
  • -
-

trace_range表

-

表结构

- - - - - - - - - - - - - - - - - -
Columns NameSQL TYPE
start_tsINT
end_tsINT
-

表描述

-

该表记录了解析开始时间以及结束时间。

-

关键字段描述

-
    -
  • start_ts:trace的开始时间,纳秒为单位
  • -
  • end_ts:trace的结束时间,纳秒为单位
  • -
-
- - - +

clock_snapshot表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
clock_idINT
tsINT
clock_nameTEXT
+

表描述

+

时钟号和时间,时钟名的映射表。

+

关键字段描述

+
    +
  • clock_id:时钟号
  • +
  • ts:时钟快照报的时间
  • +
  • + clock_name:时钟号对应的时钟名字
    + 时钟快照是用来对齐不同时钟号的时间
    + 比如,时钟号1的时间100,和时钟号2的时间200对齐
    + 则时钟号为2 的250,转换为时钟号1的时间后,为150 +
  • +
+

datasource_clockid表

+

表结构

+ + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
data_source_nameTEXT
clock_idINT
+

表描述

+

数据源和时钟号的映射表。

+

关键字段描述

+
    +
  • data_source_name:数据源的名称,和数据源的插件名保持一致
  • +
  • + clock_id:时钟号,对应clock_snapshot中的时钟号
    + 这个表是用来告诉IDE,不同的事件源的事件,原始时钟号是多少,在数据库中保存的事件,通常是转换为boottime后的时间,但有些情况下,IDE仍然需要知道原始的时钟号是怎样的 +
  • +
+

frame_slice表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
tsINT
vsyncINT
ipidINT
itidINT
callstack_idINT
durINT
srcTEXT
dstINT
typeINT
flagINT
depthINT
frame_noINT
+

表描述

+

应用的实际渲染帧和期望渲染帧的开始时间,持续时长,以及RenderService和App之间的关联关系。

+

关键字段描述

+
    +
  • callstack_id:该帧数据对应着callstack表的调用栈所在的行数
  • +
  • dur:该帧渲染时长(当数据不完整时,改行数据为空)
  • +
  • src:该帧是被哪一帧(该表中对应的行数)触发的,有多个值时,用逗号分割
  • +
  • dst:该帧对应的渲染帧是哪一行
  • +
  • type: 0 说明该行数据是实际渲染帧, 1 说明该行数据是期望渲染帧
  • +
  • + flag: 空时,为不完整的数据;0 表示实际渲染帧不卡帧, 1 表示实际渲染帧卡帧(expectEndTime < + actualEndTime为异常), 2 表示数据不需要绘制(没有frameNum信息),3 表示rs进程与app进程起止异常(|expRsStartTime + - expUiEndTime| < 1ms 正常,否则异常。这里使用期待帧的时间差做判断,给实际帧打标签) +
  • +
  • depth:预留
  • +
  • frame_no:预留
  • +
+

frame_maps表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
tsINT
src_rowINT
dst_rowINT
+

表描述

+

该表记录了app到RenderService的帧的映射关系,同frame_slice表中的src映射到dst的关系。

+

关键字段描述

+
    +
  • src_row:frame_slice表中app的帧所在的行
  • +
  • dst_row:frame_slice表中RenderService的帧所在的行
  • +
+

gpu_slice表

+

表结构

+ + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
frame_rowINT
durINT
+

表描述

+

该表记录了每一帧数据在GPU上的渲染时长。

+

关键字段描述

+
    +
  • frame_row:frame_slice表中渲染帧所在的行
  • +
  • dur:帧渲染时长
  • +
+

trace_range表

+

表结构

+ + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
start_tsINT
end_tsINT
+

表描述

+

该表记录了解析开始时间以及结束时间。

+

关键字段描述

+
    +
  • start_ts:trace的开始时间,纳秒为单位
  • +
  • end_ts:trace的结束时间,纳秒为单位
  • +
+

task_pool表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
allocation_task_rowINT
execute_task_rowINT
return_task_rowINT
allocation_itidINT
execute_itidINT
return_itidINT
execute_idINT
priorityINT
execute_stateINT
return_stateINT
timeout_rowINT
+

表描述

+

该表记录了任务池相关数据,与callstack表关联。

+

关键字段描述

+
    +
  • allocation_task_row:与callstack表id号相关联
  • +
  • execute_task_row:与callstack表id号相关联
  • +
  • return_task_row:与callstack表id号相关联
  • +
  • allocation_itid:任务分发的itid
  • +
  • execute_itid:任务执行的itid
  • +
  • return_itid:任务返回的itid
  • +
  • execute_id:任务执行id
  • +
  • priority:任务分发独有的,优先级{HIGH : 0,MEDIUM : 1,LOW : 2}
  • +
  • execute_state:任务执行独有的执行状态{NOT_FOUND : 0,WAITING : 1,RUNNING : 2,CANCELED : 3}
  • +
  • return_state:任务返回独有的任务返回状态[IsCanceled DeserializeFailed Successful Unsuccessful]
  • +
  • timeout_row:任务执行超时时更新此列,将对应的 callstack 表行号存于对应的任务行
  • +
+

animation表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
input_timeINT
start_pointINT
end_pointINT
+

表描述

+

该表记录动效的响应时延和完成时延等信息。

+

关键字段描述

+
    +
  • input_time:输入时间点
  • +
  • start_point:开始时间点
  • +
  • end_point:结束时间点
  • +
+

dynamic_frame表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
xINT
yINT
widthINT
heightINT
alphaTEXT
nameINT
end_timeINT
+

表描述

+

该表记录动效帧的坐标、分辨率、结束时间等信息。

+

关键字段描述

+
    +
  • x:坐标x
  • +
  • y:坐标y
  • +
  • width:宽
  • +
  • height:高
  • +
  • alpha:透明度
  • +
  • name:当前动效帧名字
  • +
  • end_time:结束时间
  • +
+

device_info表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
physical_widthINT
physical_heightINT
physical_frame_rateINT
+

表描述

+

该表记录设备分辨率和帧率等信息。

+

关键字段描述

+
    +
  • physical_width:设备宽
  • +
  • physical_height:设备高
  • +
  • physical_frame_rate:设备帧率
  • +
+

device_state表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
brightnessINT
bt_stateINT
locationINT
wifiINT
stream_defaultINT
voice_callINT
musicINT
stream_ringINT
mediaINT
voice_assistantINT
systemINT
alarmINT
notificationINT
bt_scoINT
enforced_audibleINT
stream_dtmfINT
stream_ttsINT
accessibilityINT
recordingINT
stream_allINT
+

表描述

+

该表记录设备屏幕亮度,蓝牙,位置,wifi,音乐,媒体等信息。

+

关键字段描述

+
    +
  • brightness:屏幕亮度
  • +
  • bt_state:蓝牙状态
  • +
  • location:位置信息
  • +
  • wifi:无线网络状态
  • +
  • voice_call:语音通话
  • +
  • music:音乐播放
  • +
  • media:多媒体
  • +
  • voice_assistant:语音助手
  • +
  • system:系统
  • +
  • alarm:闹钟
  • +
  • notification:消息通知
  • +
  • bt_sco:蓝牙语音
  • +
  • accessibility:访问权限
  • +
  • recording:录音
  • +
+

trace_config表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
trace_sourceINT
keyINT
valueINT
+

表描述

+

该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。

+

关键字段描述

+
    +
  • trace_source:事件源
  • +
  • key:事件需要关注的信息名
  • +
  • value:事件需要关注的信息名对应的信息值
  • +
+

memory_ashmem表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
tsINT
ipidINT
adjINT
fdINT
ashmem_name_idINT
sizeINT
pssINT
ashmem_idINT
timeINT
ref_countINT
purgedINT
flagINT
+

表描述

+

该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。

+

关键字段描述

+
    +
  • ts:时间戳
  • +
  • ipid:内部进程号
  • +
  • fd:共享内存文件描述符
  • +
  • ashmem_name_id:共享内存名
  • +
  • size:共享内存大小
  • +
  • pss:PSS内存大小
  • +
  • ashmem_id:共享内存ID
  • +
  • ref_count:引用计数
  • +
  • flag:去重标记,0表示正常,1表示进程内部重复数据,2表示进程间重复数据
  • +
+

memory_dma表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
tsINT
ipidINT
fdINT
sizeINT
inoINT
exp_pidINT
exp_task_comm_idINT
buf_name_idINT
exp_name_idINT
flagINT
+

表描述

+

该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。

+

关键字段描述

+
    +
  • ts:时间戳
  • +
  • ipid:内部进程号
  • +
  • fd:dma内存文件描述符
  • +
  • size:dma内存大小
  • +
  • exp_pid:申请者的进程号
  • +
  • buf_name_id:dma内存名
  • +
  • exp_name_id:申请者进程名
  • +
  • flag:去重标记,0表示正常,1表示进程内部重复数据,2表示进程间重复数据
  • +
+

memory_process_gpu表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
tsINT
gpu_name_idINT
all_gpu_sizeINT
addrTEXT
ipidINT
itidINT
used_gpu_sizeINT
+

表描述

+

该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。

+

关键字段描述

+
    +
  • ts:时间戳
  • +
  • gpu_name_id:gpu内存名称
  • +
  • all_gpu_size:进程占用gpu总大小
  • +
  • addr:gpu内存地址
  • +
  • ipid:内部进程号
  • +
  • itid:内部线程号
  • +
  • used_gpu_size:已使用的gpu大小
  • +
+

memory_window_gpu表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
tsINT
window_name_idINT
window_idINT
module_name_idINT
category_name_idINT
sizeINT
countINT
purgeable_sizeINT
+

表描述

+

该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。

+

关键字段描述

+
    +
  • ts:时间戳
  • +
  • window_name_id:窗口名
  • +
  • window_id:窗口id
  • +
  • module_name_id:模块名
  • +
  • category_name_id:目录名
  • +
  • size:内存大小
  • +
  • count:内存申请个数
  • +
+

static_initalize表

+

表结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Columns NameSQL TYPE
idINT
ipidINT
tidINT
call_idINT
start_timeINT
end_timeINT
so_nameTEXT
depthINT
+

表描述

+

该表记录了so初始化相关数据。

+

关键字段描述

+
    +
  • ipid:内部进程号
  • +
  • tid:内部线程号
  • +
  • call_id:调用者的ID,对应线程表里面的itid
  • +
  • start_time:阶段开始时间
  • +
  • end_time:阶段结束时间
  • +
  • so_name:so文件名称
  • +
  • depth:泳道图的深度
  • +
+
+ + + diff --git a/ide/src/doc/md/des_tables.md b/ide/src/doc/md/des_tables.md index 4b17ec0c2f7dbb5d7d3b3aceff29be84c4940848..509d3a73cfdeae22aa2f06b5f1a248b5fece7f94 100644 --- a/ide/src/doc/md/des_tables.md +++ b/ide/src/doc/md/des_tables.md @@ -13,23 +13,36 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库 ## TraceStreamer输出数据库包含以下表格 | 表名称 |作用| | ---- |---- | -| app_name | 记录HiSysEvent事件的事件名与IDE部分事件的字段名为APPNAME中存放的相关信息的映射关系 | +| animation | 记录动效的响应时延和完成时延| +| app_name | 记录HiSysEvent事件的事件名与IDE部分事件的字段名为APPNAME中存放的相关信息的映射关系| +| app_startup | 记录了应用启动相关数据| | args | 记录方法参数集合| | bio_latency_sample | 记录IO操作相关方法调用,及调用栈数据| | callstack | 记录调用堆栈和异步调用信息,其中depth,stack_id和parent_stack_id仅在非异步调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号| | clk_event_filter | 记录时钟相关的信息| | clock_event_filter | 此结构用来维护时钟事件,cpu与唯一的ID做关联| +| clock_snapshot | 时钟号和时间,时钟名的映射表| | cpu_measure_filter | cpu事件过滤器表| | cpu_usage | 记录CPU使用率事件| +| datasource_clockid | 数据源和时钟号的映射表| | data_dict | 记录常用的字符串,将字符串和索引关联,降低程序运行的内存占用,用作辅助数据| | data_type | 记录数据类型和typeId的关联关系| +| device_info | 记录设备分辨率和帧率| +| device_state | 记录设备屏幕亮度,蓝牙,位置,wifi,音乐,媒体等信息| | diskio | 记录磁盘读写数据事件| +| dynamic_frame | 记录动效帧的分辨率和结束时间等| | ebpf_callstack | 记录了采样相关信息| -| file_system_samp | 记录了调用栈的相关信息| +| file_system_sample | 记录了调用栈的相关信息| +| frame_maps | 记录应用到RS的帧的映射关系| +| frame_slice | 记录RS(RenderService)和应用的帧渲染| +| gpu_slice | 记录RS的帧对应的gpu渲染时长| | hidump | 记录FPS(Frame Per Second)数据| | hisys_event_measure | 记录了HiSysEvent事件相关数据,目前HiSysEvent事件包括了异常事件,IDE事件,器件状态事件 | | instant | 记录Sched_waking, sched_wakeup事件, 用作ThreadState表的上下文使用 | | irq | 记录中断相关事件| +| js_config | 记录了arkTs数据采集的相关配置| +| js_cpu_profiler_node | 记录了cpu profiler中node节点的数据| +| js_cpu_profiler_sample | 记录了cpu profiler中sample节点的数据| | js_heap_edges | 记录了js内存数据类对象对应的成员的信息| | js_heap_files | 记录了js内存数据的名称和时间| | js_heap_info | 记录了js内存数据类型,如nodes和edges的字段类型和数据总数| @@ -41,7 +54,12 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库 | js_heap_trace_node | 记录了timeline模式下的调用栈信息| | live_process | 记录了一些实时的进程中执行的一些数据| | log | 记录hilog打印日志数据| +| measure | 记录所有的计量值| | measure_filter | 记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录| +| memory_ashmem | 记录了进程所占用的ashmem相关信息| +| memory_dma | 记录了进程占用的DMA内存相关信息| +| memory_process_gpu | 记录进程占用GPU内存相关信息| +| memory_window_gpu | 记录窗口占用GPU内存相关信息| | meta | 记录执行解析操作相关的基本信息| | native_hook | 记录堆内存申请与释放相关的数据| | native_hook_frame | 记录堆内存申请与释放相关的调用栈| @@ -61,54 +79,71 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库 | sched_slice | 此数据结构主要作为ThreadState的上下文使用,这张表是sched_switch事件的原始记录| | smaps | 记录进程的内存消耗的相关信息采样| | stat | 此结果用来统计数据解析中各类数据的数据条数,数据和合法性,数据的匹配程度(begin-end),数据的损失等,查看此结构对应的表,可对数据源有基本的了解| +| static_initalize | 记录了so初始化相关数据| | symbols | 记录系统调用名称和其函数指针的对应关系,trace中用addr来映射function_name来节省存储空间| | syscall | 记录用户空间函数与内核空间函数相互调用记录| | sys_event_filter | 记录所有的filter| | sys_mem_measure | 记录了所有的系统内存相关的测量信息| +| task_pool | 记录任务池相关数据,与callstack表相关联| | thread | 记录所有的线程信息| | thread_filter | 过滤线程| | thread_state | 记录线程状态信息| +| trace_config | 记录trace数据源,proto的事件-plugin与其process_name| | trace_range | 记录ftrace数据与其他类型数据的时间交集,供前端展示数据时使用| -| clock_snapshot | 时钟号和时间,时钟名的映射表| -| datasource_clockid | 数据源和时钟号的映射表| ## 表与事件来源 | 表名称 | 事件源 | 插件名 | 备注 | | ---- | ---- | ---- | ---- | +|animation | - |ftrace-plugin |记录动效的响应时延和完成时延 | |app_name | - |hisysevent-plugin |JSON数据源 | |args | - |ftrace-plugin |配合callstack使用 | +|bio_latency_sample | - | - |IO操作相关方法调用,及调用栈数据 | |callstack | - |ftrace-plugin |异步或非异步的调用 | |cpu_measure_filter | - |ftrace-plugin |cpu跟踪器,cpu频率等 | |cpu_usage | - |cpu-plugin |cpu使用率 | |data_dict | 通用的 | - |所有字符串的记录 | |data_type | 通用的 | - |辅助表 | +|device_info | - |ftrace-plugin |记录设备分辨率和帧率 | +|device_state | 通用的 |hisysevent-plugin |记录设备屏幕亮度,蓝牙,位置等信息 | +|dynamic_frame | - |ftrace-plugin |动效帧的分辨率和结束时间等 | +|ebpf_callstack | - | - |磁盘读写相关的数据 | |file_system_callstack | - | - |ebpf文件系统 | |file_system_sample | - | - |ebpf文件系统 | -|frame_maps | - |ftrace-plugin |帧渲染数据,app到RS的映射 | -|frame_slice | - |ftrace-plugin |帧渲染数据 | -|gpu_slice | - |ftrace-plugin |gpu渲染时长 | +|frame_maps | - |ftrace-plugin |帧渲染数据,app到RS的映射 | +|frame_slice | - |ftrace-plugin |帧渲染数据 | +|gpu_slice | - |ftrace-plugin |gpu渲染时长 | |hidump | - |hidump-plugin |FPS数据 | |hisys_event_measure | - |hisysevent-plugin |JSON数据源 | |instant | - |ftrace-plugin |waking和wakeup事件 | |irq | - |ftrace-plugin |记录中断事件 | -| js_heap_edges | - |arkts-plugin | js内存数据 | -| js_heap_files | - |arkts-plugin | js内存数据 | -| js_heap_info | - |arkts-plugin | js内存数据 | -| js_heap_location | - |arkts-plugin | js内存数据 | -| js_heap_nodes | - |arkts-plugin | js内存数据 | -| js_heap_sample | - |arkts-plugin | js内存数据 | -| js_heap_string | - |arkts-plugin | js内存数据 | -| js_heap_trace_function_info | - |arkts-plugin | js内存数据 | -| js_heap_trace_node | - |arkts-plugin | js内存数据 | +|js_config | - |arkts-plugin | arkTs数据采集的配置 | +|js_cpu_profiler_node | - |arkts-plugin | 记录了cpu profiler中node节点的数据 | +|js_cpu_profiler_sample | - |arkts-plugin | 记录了cpu profiler中sample节点的数据 | +|js_heap_edges | - |arkts-plugin | js内存数据 | +|js_heap_files | - |arkts-plugin | js内存数据 | +|js_heap_info | - |arkts-plugin | js内存数据 | +|js_heap_location | - |arkts-plugin | js内存数据 | +|js_heap_nodes | - |arkts-plugin | js内存数据 | +|js_heap_sample | - |arkts-plugin | js内存数据 | +|js_heap_string | - |arkts-plugin | js内存数据 | +|js_heap_trace_function_info | - |arkts-plugin | js内存数据 | +|js_heap_trace_node | - |arkts-plugin | js内存数据 | +|app_startup | - |ftrace-plugin | 应用启动数据 | +|static_initalize | - |ftrace-plugin | so初始化数据 | |live_process | - |process-plugin |Monitor数据 | |network | - |network-plugin |Monitor数据 | |diskio | - |diskio-plugin |Monitor数据 | |log | - |hilog-plugin |系统日志 | |measure | 通用的 | - |系统中的计量值(数值型)| |measure_filter | 通用的 | - |计量值的查询辅助表 | +|memory_ashmem | - |memory-plugin |进程所占用ashmem相关信息 | +|memory_dma | - |memory-plugin |进程占用的DMA内存相关信息 | +|memory_process_gpu | - |memory-plugin |进程占用GPU内存相关信息 | +|memory_window_gpu | - |memory-plugin |窗口占用GPU内存相关信息 | |meta | 通用的 | - |记录解析现场数据(解析时间,数据类型,解析工具等)| |native_hook | - |nativehook/hookdaemon |malloc && mmap内存数据 | |native_hook_frame | - |nativehook/hookdaemon |native_hook调用栈数据 | |native_hook_statistic | - |nativehook/hookdaemon |malloc && mmap统计数据 | +|paged_memory_sample | - | - |网络数据传输相关的信息 | |perf_callchain | - |perf-plugin |perf数据(非插件模式) | |perf_files | - | - |perf数据(非插件模式) | |perf_report | - | - |perf数据(非插件模式) | @@ -128,10 +163,12 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库 |sys_mem_measure | - |memory-plugin |系统内存 | |thread | 通用的 | - |线程信息(常用) | |thread_state | 通用的 |ftrace-plugin |线程调度图(常用) | +|trace_config | 通用的 |hisysevent-plugin |记录trace数据源 | |trace_range | 通用的 | - |trace数据的时长 | |thread_filter | 通用的 |ftrace-plugin |线程计量跟踪表(比较少用)| -|clock_snapshot | 通用的 |通用的 |时钟号和时间,时钟名的映射表| -|datasource_clockid | 通用的 |通用的 |数据源和时钟号的映射表| +|clock_snapshot | 通用的 |通用的 |时钟号和时间,时钟名的映射表| +|datasource_clockid | 通用的 |通用的 |数据源和时钟号的映射表| +|task_pool | - | - |任务池数据 | ## ___表格关系图___ --- @@ -225,13 +262,13 @@ frame_maps:记录应用到RS的帧的映射关系。 js_heap_files:记录js内存数据的文件名和文件索引 -![GitHub Logo](../../figures/traceStreamer/js_heap_files.png) +![1683163158954](image/des_tables/js_heap_files.png) js_heap_nodes:记录js内存类对象数据 js_heap_edges:记录js内存类对象的成员数据 js_heap_trace_node:记录timeline的调用栈信息 js_heap_sample:记录timeline的时间轴信息 -![GitHub Logo](../../figures/traceStreamer/js_heap_nodes.png) +![1683163373206](image/des_tables/js_heap_nodes.png) ## TraceStreamer输出数据库表格详细介绍 ### app_name表 #### 表结构 @@ -450,7 +487,7 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 记录了与磁盘读写相关的数据。 #### 主要字段描述 -- callchain_id:调用栈的唯一标识。与ebpf_callstack表中Callchain_id字段关联 +- callchain_id:调用栈的唯一标识 - depth:调用栈深度。取值为零时表示栈顶 - ip:调用栈ip - symbols_id:调用栈函数名称, 与data_dict中的id字段关联 @@ -578,6 +615,73 @@ js_heap_sample:记录timeline的时间轴信息 - parent_id:父调用中断的id - spanId:分布式调用中断关联关系 + +### js_config表 +#### 表结构 +| Columns Name | SQL TYPE | +| ------------- | -------- | +| pid | INT | +| type | INT | +| interval | INT | +| capture_numeric_value | INT | +| trace_allocation | INT | +| enable_cpu_profiler | INT | +| cpu_profiler_interval | INT | +#### 表描述 +记录arkTs数据采集的相关配置。 +#### 相关字段描述 +- pid:目标进程ID。 +- type:JS数据类型,取值与枚举HeapType对应,0表示JS内存数据为snapshot类型,1表示JS内存数据为timeline类型,-1表示没有JS内存数据。 +- interval:当type=0时生效,单位是秒,表示一次snapshot事件和下一次snapshot事件之间的间隔。 +- capture_numeric_value:当type=0时生效,表示是否同时抓取numeric。 +- track_allocation:当type=1时生效,表示是否抓取allocations。 +- enable_cpu_profiler:表示是否存在cpuprofiler的数据。 +- cpu_profiler_interval:表示cpuprofiler数据的采集间隔。 + +### js_cpu_profiler_node表 +#### 表结构 +| Columns Name | SQL TYPE | +| ------------- | -------- | +| function_id | INT | +| function_index | INT | +| script_id | INT | +| url_index | INT | +| line_number | INT | +| column_number | INT | +| hit_count | INT | +| children | INT | +| parent_id | INT | +#### 表描述 +记录cpu profiler中node节点的数据。 +#### 相关字段描述 +- function_id: 函数的ID号。 +- function_index:函数名称在data_dict中的索引号。 +- script_id:关联到的类对象所在文件的绝对路径ID。 +- url_index:关联到的类对象所在文件的绝对路径名称在data_dict中的索引号。 +- line_number:类对象所在文件的行号。 +- column_number:类对象所在文件的列号。 +- hit_count:采样次数。 +- children:子节点的id号。 +- parent_id:父节点的id号。 + +### js_cpu_profiler_sample表 +#### 表结构 +| Columns Name | SQL TYPE | +| ------------- | -------- | +| id | INT | +| function_id | INT | +| start_time | INT | +| end_time | INT | +| dur | INT | +#### 表描述 +记录了cpu profiler 中sample节点的数据。 +#### 相关字段描述 +- id: ts内部ID号。 +- function_id:函数的ID号。 +- start_time:数据上报的起始时间。 +- end_time:数据上报的终止时间。 +- dur:数据上报的间隔时间。 + ### js_heap_edges表 #### 表结构 | Columns Name | SQL TYPE | @@ -752,6 +856,50 @@ js_heap_sample:记录timeline的时间轴信息 - size:调用栈大小 - parent_id:调用栈父节点 +### app_startup表 +#### 表结构 +| Columns Name | SQL TYPE | +| ------------------- | -------- | +| call_id | INT | +| ipid | INT | +| tid | INT | +| start_time | INT | +| end_time | INT | +| start_name | INT | +| packed_name | INT | +#### 表描述 +记录了应用启动的相关信息。 +#### 相关字段描述 +- call_id:调用者的ID,比如针对线程表里面的id +- ipid:内部进程号 +- tid:内部线程号 +- start_time:阶段开始时间 +- end_time:阶段结束时间 +- start_name:阶段名称 +- packed_name:应用名称 + +### static_intialize表 +#### 表结构 +| Columns Name | SQL TYPE | +| ------------------- | -------- | +| call_id | INT | +| ipid | INT | +| tid | INT | +| start_time | INT | +| end_time | INT | +| so_name | INT | +| depth | INT | +#### 表描述 +记录了so初始化的相关信息。 +#### 相关字段描述 +- call_id:调用者的ID,比如针对线程表里面的id +- ipid:内部进程号 +- tid:内部线程号 +- start_time:阶段开始时间 +- end_time:阶段结束时间 +- so_name:so文件名称 +- depth:泳道图的深度 + ### live_process表 #### 表结构 | Columns Name | SQL TYPE | @@ -1364,22 +1512,22 @@ js_heap_sample:记录timeline的时间轴信息 'R', Runnable状态 "S", interruptible sleep "D", uninterruptible sleep -"D-IO", uninterruptible io -"D-NIO", uninterruptible nio -"Runing", Runing状态 -"I", interrupted -"T", Traced +"D-IO", uninterruptible io +"D-NIO", uninterruptible nio +"Runing", Runing状态 +"T", Task stoped. +"t" Traced. "X", ExitedDead "Z", Zombie -"I", CloneThread -"I", TaskKilled +"P", Parked +"I", Task_Dead "DK", "DK-IO", "DK-NIO", -"TK", TracedKill -"R", WakeKill -"P", Parked -"R+", ForeGround +"TK", TracedKill +"R+", WakeKill +"R+", TaskNew +"R-B", Task runnable binder. ``` ### clock_snapshot表 @@ -1411,6 +1559,7 @@ js_heap_sample:记录timeline的时间轴信息 - data_source_name:数据源的名称,和数据源的插件名保持一致 - clock_id:时钟号,对应clock_snapshot中的时钟号 这个表是用来告诉IDE,不同的事件源的事件,原始时钟号是多少,在数据库中保存的事件,通常是转换为boottime后的时间,但有些情况下,IDE仍然需要知道原始的时钟号是怎样的 + ### frame_slice表 ### 表结构 | Columns Name | SQL TYPE | @@ -1435,9 +1584,10 @@ js_heap_sample:记录timeline的时间轴信息 - src:该帧是被哪一帧(该表中对应的行数)触发的,有多个值时,用逗号分割 - dst:该帧对应的渲染帧是哪一行 - type: 0 说明该行数据是实际渲染帧, 1 说明该行数据是期望渲染帧 -- flag: 空时,为不完整的数据;0 表示实际渲染帧不卡帧, 1 表示实际渲染帧卡帧, 2 表示数据不需要绘制(没有frameNum信息) +- flag: 空时,为不完整的数据;0 表示实际渲染帧不卡帧, 1 表示实际渲染帧卡帧(expectEndTime < actualEndTime为异常), 2 表示数据不需要绘制(没有frameNum信息),3 表示rs进程与app进程起止异常(|expRsStartTime - expUiEndTime| < 1ms 正常,否则异常。这里使用期待帧的时间差做判断,给实际帧打标签) - depth:预留 - frame_no:预留 + ### frame_maps表 ### 表结构 | Columns Name | SQL TYPE | @@ -1450,6 +1600,7 @@ js_heap_sample:记录timeline的时间轴信息 #### 关键字段描述 - src_row:frame_slice表中app的帧所在的行 - dst_row:frame_slice表中RenderService的帧所在的行 + ### gpu_slice表 ### 表结构 | Columns Name | SQL TYPE | @@ -1461,6 +1612,7 @@ js_heap_sample:记录timeline的时间轴信息 #### 关键字段描述 - frame_row:frame_slice表中渲染帧所在的行 - dur:帧渲染时长 + ### trace_range表 #### 表结构 | Columns Name | SQL TYPE | @@ -1471,4 +1623,273 @@ js_heap_sample:记录timeline的时间轴信息 该表记录了解析开始时间以及结束时间。 #### 关键字段描述 - start_ts:trace的开始时间,纳秒为单位 -- end_ts:trace的结束时间,纳秒为单位 \ No newline at end of file +- end_ts:trace的结束时间,纳秒为单位 + +### task_pool表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|allocation_task_row |INT | +|execute_task_row |INT | +|return_task_row |INT | +|allocation_itid |INT | +|execute_itid |INT | +|return_itid |INT | +|execute_id |INT | +|priority |INT | +|execute_state |INT | +|return_state |INT | +|timeout_row |INT | +#### 表描述 +该表记录了任务池相关数据,与callstack表关联。 +#### 关键字段描述 +- allocation_task_row:与callstack表id号相关联 +- execute_task_row:与callstack表id号相关联 +- return_task_row:与callstack表id号相关联 +- allocation_itid:任务分发的itid +- execute_itid:任务执行的itid +- return_itid:任务返回的itid +- execute_id:任务执行id +- priority:任务分发独有的,优先级{HIGH : 0,MEDIUM : 1,LOW : 2} +- execute_state:任务执行独有的执行状态{NOT_FOUND : 0,WAITING : 1,RUNNING : 2,CANCELED : 3} +- return_state:任务返回独有的任务返回状态[IsCanceled DeserializeFailed Successful Unsuccessful] +- timeout_row:任务执行超时时更新此列,将对应的 callstack 表行号存于对应的任务行 + +### animation表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|input_time |INT | +|start_point |INT | +|end_point |INT | +#### 表描述 +该表记录动效的响应时延和完成时延等信息。 +#### 关键字段描述 +- input_time:输入时间点 +- start_point:开始时间点 +- end_point:结束时间点 + +### dynamic_frame表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|x |INT | +|y |INT | +|width |INT | +|height |INT | +|alpha |TEXT | +|name |INT | +|end_time |INT | +#### 表描述 +该表记录动效帧的坐标、分辨率、结束时间等信息。 +#### 关键字段描述 +- x:坐标x +- y:坐标y +- width:宽 +- height:高 +- alpha:透明度 +- name:当前动效帧名字 +- end_time:结束时间 + +### device_info表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|physical_width |INT | +|physical_height |INT | +|physical_frame_rate |INT | +#### 表描述 +该表记录设备分辨率和帧率等信息。 +#### 关键字段描述 +- physical_width:设备宽 +- physical_height:设备高 +- physical_frame_rate:设备帧率 + +### device_state表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|brightness |INT | +|bt_state |INT | +|location |INT | +|wifi |INT | +|stream_default |INT | +|voice_call |INT | +|music |INT | +|stream_ring |INT | +|media |INT | +|voice_assistant |INT | +|system |INT | +|alarm |INT | +|notification |INT | +|bt_sco |INT | +|enforced_audible |INT | +|stream_dtmf |INT | +|stream_tts |INT | +|accessibility |INT | +|recording |INT | +|stream_all |INT | +#### 表描述 +该表记录设备屏幕亮度,蓝牙,位置,wifi,音乐,媒体等信息。 +#### 关键字段描述 +- brightness:屏幕亮度 +- bt_state:蓝牙状态 +- location:位置信息 +- wifi:无线网络状态 +- voice_call:语音通话 +- music:音乐播放 +- media:多媒体 +- voice_assistant:语音助手 +- system:系统 +- alarm:闹钟 +- notification:消息通知 +- bt_sco:蓝牙语音 +- accessibility:访问权限 +- recording:录音 + +### trace_config表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|trace_source |INT | +|key |INT | +|value |INT | +#### 表描述 +该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。 +#### 关键字段描述 +- trace_source:事件源 +- key:事件需要关注的信息名 +- value:事件需要关注的信息名对应的信息值 + +### memory_ashmem表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|ts |INT | +|ipid |INT | +|adj |INT | +|fd |INT | +|ashmem_name_id|INT | +|size |INT | +|pss |INT | +|ashmem_id |INT | +|time |INT | +|ref_count |INT | +|purged |INT | +|flag |INT | +#### 表描述 +该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。 +#### 关键字段描述 +- ts:时间戳 +- ipid:内部进程号 +- fd:共享内存文件描述符 +- ashmem_name_id:共享内存名 +- size:共享内存大小 +- pss:PSS内存大小 +- ashmem_id:共享内存ID +- ref_count:引用计数 +- flag:去重标记,0表示正常,1表示进程内部重复数据,2表示进程间重复数据 + +### memory_dma表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|ts |INT | +|ipid |INT | +|fd |INT | +|size |INT | +|ino |INT | +|exp_pid |INT | +|exp_task_comm_id|INT | +|buf_name_id |INT | +|exp_name_id |INT | +|flag |INT | +#### 表描述 +该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。 +#### 关键字段描述 +- ts:时间戳 +- ipid:内部进程号 +- fd:dma内存文件描述符 +- size:dma内存大小 +- exp_pid:申请者的进程号 +- buf_name_id:dma内存名 +- exp_name_id:申请者进程名 +- flag:去重标记,0表示正常,1表示进程内部重复数据,2表示进程间重复数据 + +### memory_process_gpu表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|ts |INT | +|gpu_name_id |INT | +|all_gpu_size |INT | +|addr |TEXT | +|ipid |INT | +|itid |INT | +|used_gpu_size |INT | +#### 表描述 +该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。 +#### 关键字段描述 +- ts:时间戳 +- gpu_name_id:gpu内存名称 +- all_gpu_size:进程占用gpu总大小 +- addr:gpu内存地址 +- ipid:内部进程号 +- itid:内部线程号 +- used_gpu_size:已使用的gpu大小 + +### memory_window_gpu表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|ts |INT | +|window_name_id|INT | +|window_id |INT | +|module_name_id|INT | +|category_name_id|INT | +|size |INT | +|count |INT | +|purgeable_size|INT | +#### 表描述 +该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。 +#### 关键字段描述 +- ts:时间戳 +- window_name_id:窗口名 +- window_id:窗口id +- module_name_id:模块名 +- category_name_id:目录名 +- size:内存大小 +- count:内存申请个数 + +### static_initalize表 +#### 表结构 +| Columns Name | SQL TYPE | +|---- |---- | +|id |INT | +|ipid |INT | +|tid |INT | +|call_id |INT | +|start_time |INT | +|end_time |INT | +|so_name |TEXT | +|depth |INT | +#### 表描述 +该表记录了so初始化相关数据。 +#### 关键字段描述 +- ipid:内部进程号 +- tid:内部线程号 +- call_id:调用者的ID,对应线程表里面的itid +- start_time:阶段开始时间 +- end_time:阶段结束时间 +- so_name:so文件名称 +- depth:泳道图的深度 \ No newline at end of file diff --git a/ide/src/doc/md/quickstart_Application_operation_skills.md b/ide/src/doc/md/quickstart_Application_operation_skills.md index 219aa684a27e281d37db4182fdaa8f01d9f7c3ee..785b7e32f362aceff9a5127d23fe4f81358572bd 100644 --- a/ide/src/doc/md/quickstart_Application_operation_skills.md +++ b/ide/src/doc/md/quickstart_Application_operation_skills.md @@ -21,3 +21,70 @@ 第一部分是?trace=(固定格式)。 第二部分是trace文件的url(https://iot.itocm.com:9001/upload/ftrace_small.txt),此处根据文件的url实际地址填写。 第三部分,&link=true(固定格式)。 + +###Tab页信息和泳道图可跳转(点击和框选场景,框选类似搜索) +泳道图高亮场景:框选Cpu Frequency 或者Cpu State泳道图后,弹出Cpu Frequency或Cpu State Tab页,在点击Tab页表格的行时,框选范围泳道图的当前行的Value值一样的部分上方会出现一条以圆点开头颜色比趋势图颜色同色但稍深的粗线条,如下图: +![GitHub Logo](../../figures/OperationSkills/Tabskill.jpg) +搜索场景:框选函数调用栈的泳道图,弹出Slices Tab页,点击表格行,会跳转到框选范围内的第一条调用栈的位置,点击下图Slices Tab页的H:FlushVsync调用栈。 +![GitHub Logo](../../figures/OperationSkills/Tabskillcalltack.jpg) +会跳转到H:FlushVsync调用栈的位置。 +![GitHub Logo](../../figures/OperationSkills/Tabcallstackskip.jpg) +###Tab页中start time支持绝对时间 +在有startTime的点选Tab页(目前有PurgeTotal、PurgePin、Current Selection三个)中添加绝对时间,startTime是以抓取时间为参考,开始抓取时间为0,取当前点选数据的startTs属性即可,绝对时间是数据上报的时间显示,如下图: +![GitHub Logo](../../figures/OperationSkills/Tababsolutetime.jpg) +###支持基于优先级的线程状态展示 +Sched Priority Tab页,按优先级显示调度,显示框选范围内所有Running以及Running之前的Runnable线程的最小,最大,平均耗时。 +![GitHub Logo](../../figures/OperationSkills/schedpritab.jpg) +###内容支持宽度可伸缩 +原来表格的单元格宽度是设置好的,有些单元格里的内容比较长,看不到全部,现在每行的表头添加一个灰色竖线,拖动时单元格宽度随之改变。 +![GitHub Logo](../../figures/OperationSkills/Tabdrag.jpg) +###一键展开和收起,逐级展开和收起 +将树形表格全部改为默认收起,在表头左上角添加双尖箭头图标,默认箭头朝外,点击图标,表格的每一层都展开,图标上的箭头改为朝里面,再次点击表格每一层都收起,图标上的箭头改为朝外面 +![GitHub Logo](../../figures/OperationSkills/Taboneclick.jpg) +###支持shift+m多次框选,框选列表显示和操作(跳转,取消),快捷键跳转ctrl+[/]和一键取消 +每次框选泳道图后,按下shift+m键,在当前框选的开始和结束位置出现卡尺,如果只按下m键,会将上一次按m键出现的卡尺清除,在当前框选位置画卡尺,页面上每个卡尺都放进tab页中,在tab页中可以给卡尺改变颜色和移除旗子。用快捷键改变当前选中的卡尺。按下快捷键“ctrl+[”或“ctrl+]”的时候,会跳转到当前选中卡尺的上\下一个卡尺上,也就是上\下一个卡尺两侧变为实心,对应表格中的那行背景颜色变浅蓝色。 + +###旗子标记可快速跳转,框选列表显示和操作(跳转,取消),快捷跳转ctrl+;/’和一键取消 +在时间刻度下方点击会出现旗子和tab页,每次点击都将旗子都放进tab页中,在tab页中可以给旗子改变颜色和移除旗子。用快捷键改变当前选中的旗子。按下快捷键“ctrl+,”或“ctrl+.”的时候,会跳转到当前选中旗子的上\下一个旗子上,也就是上\下一个旗子变为实心有旗杆,对应表格中的那行背景颜色变浅蓝色。 +![GitHub Logo](../../figures/OperationSkills/rowskillflag.jpg) +###泳道图支持一键收起和展开(收起前的状态) +点击时间刻度的最左边的双箭头,可以对已展开的泳道图进行一键收起和展开 +![GitHub Logo](../../figures/OperationSkills/rowskilon.jpg) +###单个泳道图显示为多行时可折叠为1行(收藏和非收藏) +单个泳道图点击会将泳道图折叠为一行,折腾后的字体是蓝色。 +![GitHub Logo](../../figures/OperationSkills/Tabskillfold.jpg) +###已支持的泳道图按照模板分类显示,NaitveMemory,Hisysevent,应用内存等 +导入trace文件后,页面右上角的出现漏斗图标,点击会出现Display Template页面,Template Select区域显示已经添加到显示模板中的泳道图,每类泳道图后面会有一个多选框,默认不勾选,如果勾选页面上就只保留勾选的泳道图。 +![GitHub Logo](../../figures/OperationSkills/Tabskilltemple.jpg) +###所有进程的用户输入事件归一显示,观察操作事件和对象 +对于用户InputEvent会绘制到固定的泳道图。 +![GitHub Logo](../../figures/OperationSkills/rowskillinput.jpg) +###支持收藏的泳道图整体画布可伸缩 +收藏以后的泳道图可以在红线位置处上下伸缩拖动。 +![GitHub Logo](../../figures/OperationSkills/collectskilldrag.jpg) +###用户自定义分组化收藏(2组),及一键取消所有收藏 +选择界面上的G1和G2,可以根据自己的需求将泳道图收藏到对应G1或者G2中,点击G1和G2旁边的星号可以一键取消所有收藏。 +![GitHub Logo](../../figures/OperationSkills/collectskillg.jpg) +###trace顶部的cpu负载预览颜色随着负载降低,亮度降低的能力对比度提升 +原来表示负载的颜色利用了透明度,对比不够明显,此次修改利用颜色的亮度,负载越大颜色更深,最深的接近黑色,负载越小颜色越浅,最浅的的为白色。 +![GitHub Logo](../../figures/OperationSkills/colorcontrast.jpg) +###导航栏/泳道图背景颜色支持颜色可选,字体颜色可感知slice的颜色而进行变化,颜色动态可配 +给用户提供两种模式,浅色模式(导航栏白底黑字,泳道图颜色偏淡)和深色模式(导航栏黑底白字,泳道图颜色偏深),点击最左下方的小桶标志用户可以按需选择,并且用户可以自定义systemTrace页面的颜色,给用户更多自由,自己动手设置自己喜欢的颜色,提升用户体验。 +![GitHub Logo](../../figures/OperationSkills/colorchoose.jpg) +###高阶debug sql指导:Sample queries,比如CPU,线程,内存,io的等 +用户根据需要了解的trace数据,可以点击预置好的sql查询出对应的数据。 +![GitHub Logo](../../figures/OperationSkills/sqlselect.jpg) +###鼠标滚轮放大、缩小(已支持),ctrl+滚轮左右拖动跟手性优化 +用户可以利用鼠标滚轮对界面进行放大和缩小,ctrl+滚轮左右拖动。 +###历史搜索关键字可显示/可选择查找 +在搜索框里的关键字可以保留显示,用户可以直接选择对应的关键字进行搜索,点击删除也可以将关键字删除。 +![GitHub Logo](../../figures/OperationSkills/searchskill.jpg) +###线程唤醒关系树 +线程唤醒关系树功能是指在系统打开trace文件解析完成之后,在CPU泳道图上点选,可以查看该线程Slice的唤醒关系树,点击GetWakeupList会以链式结构和表格分别在泳道图和tab上展示线程的唤醒关系树信息,点击GetWakeupList按钮旁边的星号按钮可以对唤醒树对应的泳道图一键收藏。 +![GitHub Logo](../../figures/OperationSkills/threadtree.jpg) +###Trace抓取动态可停 +在抓取trace过程中,点击StopRecord按钮会对抓取命令进行启停,等待抓取停止命令返回后,将生成的文件拉取下来进行文件的解析。 +![GitHub Logo](../../figures/OperationSkills/tracestop.jpg) +###Smartperf web端集成hdc命令能力 +在现有的配置界面上,新增一个Web版本的shell界面,可以支持shell命令 +![GitHub Logo](../../figures/OperationSkills/shellconfig.jpg) \ No newline at end of file diff --git a/ide/src/doc/md/quickstart_Frametimeline.md b/ide/src/doc/md/quickstart_Frametimeline.md index 99d722b3f9eb6ffe06db66600f5ddc22f6d40879..d03c5fea7303082a65138e5ae4d3af4314174289 100644 --- a/ide/src/doc/md/quickstart_Frametimeline.md +++ b/ide/src/doc/md/quickstart_Frametimeline.md @@ -1,47 +1,64 @@ -# Frame timeline抓取和展示说明 +# Frame timeline 抓取和展示说明 + 抓取和展示卡顿丢帧检测的数据。 -## Frame timeline的抓取 -### Frame timeline抓取界面配置说明 -打开Frame timeline开关抓取Frametimeline数据。 -![GitHub Logo]( ../../figures/Frame/frameset.jpg) -### Frame timeline文件的抓取 -点击Record setting,在output file path输入文件名hiprofiler_dataframe.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 -![GitHub Logo]( ../../figures/Frame/framesetting.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击Record抓取,抓取过程中会显示抓取时长。 -![GitHub Logo]( ../../figures/Frame/frameexcuting.jpg) -## Frame timeline功能介绍 -将抓取的文件导入到smartperf工具查看。 -### Frame timeline泳道图展示 -Frame timeline展开就可以看到泳道图,泳道图上可以显示帧编号。 -![GitHub Logo]( ../../figures/Frame/framechart.jpg) -+ Expected Timeline:理想帧泳道图。 -+ Actual Timeline:真实帧泳道图。 -### Frame timeline泳道图的框选功能 + +## Frame timeline 的抓取 + +### Frame timeline 抓取界面配置说明 + +打开 Frame timeline 开关抓取 Frametimeline 数据。 +![GitHub Logo](../../figures/Frame/frameset.jpg) + +### Frame timeline 文件的抓取 + +点击 Record setting,在 output file path 输入文件名 hiprofiler_dataframe.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 +![GitHub Logo](../../figures/Frame/framesetting.jpg) +点击 Trace command,就会根据上面的配置生成抓取命令,点击 Record 抓取,抓取过程中会显示抓取时长。 +![GitHub Logo](../../figures/Frame/frameexcuting.jpg) + +## Frame timeline 功能介绍 + +将抓取的文件导入到 smartperf 工具查看。 + +### Frame timeline 泳道图展示 + +Frame timeline 展开就可以看到泳道图,泳道图上可以显示帧编号。 +![GitHub Logo](../../figures/Frame/framechart.jpg) + +- Expected Timeline:理想帧泳道图。 +- Actual Timeline:真实帧泳道图。 + +### Frame timeline 泳道图的框选功能 + 可以对真实帧数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格。 -Frames的Tab页如图: -![GitHub Logo]( ../../figures/Frame/frameprocess.jpg) -+ Jank Type:卡顿类型。 -+ Min duration:最小持续时间。 -+ Max duration:最大持续时间。 -+ Mean duration:平均持续时间。 -+ Occurrences:事件数。 -### Frame timeline泳道图的点选功能 -通过点选理想帧和真实帧展示Tab页(Current Selection)。 -理想帧Tab页如下图: -![GitHub Logo]( ../../figures/Frame/frameexpectedtab.jpg) -+ Name:帧编号。 -+ StartTime:启动时间。 -+ Absolute Time:绝对时间。 -+ Duration:持续时间。 -+ Process:进程名。 -真实帧Tab页如下图: -![GitHub Logo]( ../../figures/Frame/frameactualtab.jpg) -+ Name:帧编号。 -+ StartTime:启动时间。 -+ Absolute Time:绝对时间。 -+ Duration:持续时间。 -+ Process:进程名。 -+ Jank Type:卡顿类型。 -+ Gpu Duration:GPU耗时。 -+ FrameTimeLine flows:显示的是绘制一帧的完整过程, 由两个阶段组成应用的提交一帧。 -+ Following flows:展示真实帧包含的关联的帧,图中斜向上箭头点击会进行跳转功能直接定位到具体进程真实帧位置,点选的同时还将包含的关联帧通过线连起来,可以跨越多个进程。 +Frames 的 Tab 页如图: +![GitHub Logo](../../figures/Frame/frameprocess.jpg) + +- Jank Type:卡顿类型。 +- Min duration:最小持续时间。 +- Max duration:最大持续时间。 +- Mean duration:平均持续时间。 +- Occurrences:事件数。 + +### Frame timeline 泳道图的点选功能 + +通过点选理想帧和真实帧展示 Tab 页(Current Selection)。 +理想帧 Tab 页如下图: +![GitHub Logo](../../figures/Frame/frameexpectedtab.jpg) + +- Name:帧编号。 +- StartTime:启动时间。 +- Absolute Time:绝对时间。 +- Duration:持续时间。 +- Process:进程名。 + 真实帧 Tab 页如下图: + ![GitHub Logo](../../figures/Frame/frameactualtab.jpg) +- Name:帧编号。 +- StartTime:启动时间。 +- Absolute Time:绝对时间。 +- Duration:持续时间。 +- Process:进程名。 +- Jank Type:卡顿类型。 +- Gpu Duration:GPU耗时。 +- FrameTimeLine flows:显示的是绘制一帧的完整过程, 由两个阶段组成应用的提交一帧。 +- Following flows:展示真实帧包含的关联的帧,图中斜向上箭头点击会进行跳转功能直接定位到具体进程真实帧位置,点选的同时还将包含的关联帧通过线连起来,可以跨越多个进程。 diff --git a/ide/src/doc/md/quickstart_Import_so.md b/ide/src/doc/md/quickstart_Import_so.md index e07d95d2bf8135d0dce60937a2e8b049cedff3ec..51cd5149e9245b02f1d82d6de4f248428b2c84b3 100644 --- a/ide/src/doc/md/quickstart_Import_so.md +++ b/ide/src/doc/md/quickstart_Import_so.md @@ -1,137 +1,153 @@ # 调用栈可视化和不同库函数调用占比说明 -调用栈可视化可以将开发者编译的so符号化结果展示出来,不同库函数的占比通过饼图的方式展示出来。 -## Native Memory文件的不同库函数占比 -Native Memory分为三级统计,分别按照内存分配的类型(Alloc/Mmap),lib库,函数进行统计分析。其中lib跟函数为每一条调用栈,从栈顶往下查找,非musl库与c++库的第一条函数及其lib为每次分配归属的函数及lib库。 -点击Analysis的Tab页,先以内存分配的类型去统计。 + +调用栈可视化可以将开发者编译的 so 符号化结果展示出来,不同库函数的占比通过饼图的方式展示出来。 + +## Native Memory 文件的不同库函数占比 + +Native Memory 分为三级统计,分别按照内存分配的类型(Alloc/Mmap),lib 库,函数进行统计分析。其中 lib 跟函数为每一条调用栈,从栈顶往下查找,非 musl 库与 c++库的第一条函数及其 lib 为每次分配归属的函数及 lib 库。 +点击 Analysis 的 Tab 页,先以内存分配的类型去统计。 ![GitHub Logo](../../figures/ImportSo/Native_import_all.jpg) -+ Memory Type:事件类型。 -+ Existing:框选区域内申请没有释放的大小。 -+ #Existing:框选区域内申请没有释放的次数。 -+ Total Bytes:框选区间内申请的大小。 -+ #Total:框选区间内申请的次数。 -+ Transient:框选区域内释放的大小。 -+ #Transient:框选区域内释放的次数。 -+ %:各个显示项的占比。 -以lib库去统计,如图显示的是AllocEvent的so占比的饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/Native_import_so_Existing.jpg) -+ Library:So名称。 -+ Existing:框选区域内申请没有释放的大小。 -+ #Existing:框选区域内申请没有释放的次数。 -+ Total Bytes:框选区间内申请的大小。 -+ #Total:框选区间内申请的次数。 -+ Transient:框选区域内释放的大小。 -+ #Transient:框选区域内释放的次数。 -+ %:各个显示项的占比。 -以函数去统计,如图显示的是AllocEvent/libmali-bifrost-g52-g2p0-ohos.so的函数占比的饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/Native_import_so_function.jpg) -+ Function:函数名称。 -+ Existing:框选区域内申请没有释放的大小。 -+ #Existing:框选区域内申请没有释放的次数。 -+ Total Bytes:框选区间内申请的大小。 -+ #Total:框选区间内申请的次数。 -+ Transient:框选区域内释放的大小。 -+ #Transient:框选区域内释放的次数。 -+ %:各个显示项的占比。 -## Hiperf文件的不同库函数占比 -Hiperf分为四级统计,分别按照进程,线程,lib库,函数进行统计。其中lib跟函数为每一条调用栈的栈顶函数及其lib。 -点击Analysis的Tab页,先以进程去统计。 + +- Memory Type:事件类型。 +- Existing:框选区域内申请没有释放的大小。 +- #Existing:框选区域内申请没有释放的次数。 +- Total Bytes:框选区间内申请的大小。 +- #Total:框选区间内申请的次数。 +- Transient:框选区域内释放的大小。 +- #Transient:框选区域内释放的次数。 +- %:各个显示项的占比。 + 以 lib 库去统计,如图显示的是 AllocEvent 的 so 占比的饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/Native_import_so_Existing.jpg) +- Library:So名称。 +- Existing:框选区域内申请没有释放的大小。 +- #Existing:框选区域内申请没有释放的次数。 +- Total Bytes:框选区间内申请的大小。 +- #Total:框选区间内申请的次数。 +- Transient:框选区域内释放的大小。 +- #Transient:框选区域内释放的次数。 +- %:各个显示项的占比。 + 以函数去统计,如图显示的是 AllocEvent/libmali-bifrost-g52-g2p0-ohos.so 的函数占比的饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/Native_import_so_function.jpg) +- Function:函数名称。 +- Existing:框选区域内申请没有释放的大小。 +- #Existing:框选区域内申请没有释放的次数。 +- Total Bytes:框选区间内申请的大小。 +- #Total:框选区间内申请的次数。 +- Transient:框选区域内释放的大小。 +- #Transient:框选区域内释放的次数。 +- %:各个显示项的占比。 + +## Hiperf 文件的不同库函数占比 + +Hiperf 分为四级统计,分别按照进程,线程,lib 库,函数进行统计。其中 lib 跟函数为每一条调用栈的栈顶函数及其 lib。 +点击 Analysis 的 Tab 页,先以进程去统计。 ![GitHub Logo](../../figures/ImportSo/Hiperf_import_all.jpg) -+ ProcessName:进程名。 -+ Weight:该进程下的调用方法的执行次数。 -+ %:该进程下的调用方法的执行占比。 -以线程统计,如图显示的是hiperf进程下的线程的饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/Hiperf_import_thread.jpg) -+ ThreadName:线程名。 -+ Weight:该线程下的调用方法的执行次数。 -+ %:该线程下的调用方法的执行占比。 -以lib库统计,如图显示的是hiperf线程下的各so占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/Hiperf_import_lib.jpg) -+ Library:so的名称。 -+ Weight:该so的调用方法的执行次数。 -+ %:该so的调用方法的执行占比。 -以函数统计,如图显示的是ld-musl-aarch64.so.1下的各函数占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/Hiperf_import_Fuc.jpg) -+ Library:so的名称。 -+ Weight:该so的调用方法的执行次数。 -+ %:该so的调用方法的执行占比。 -## FileSystem文件的不同库函数占比 -FileSystem分为五级统计,分别按照进程,系统调用类型,线程,lib库,函数进行统计。其中lib跟函数为每一条调用栈,从栈顶往下查找,非musl库与c++库的第一条函数及其lib为每次分配归属的函数及lib库。 -点击Analysis的Tab页,先以进程去统计。 + +- ProcessName:进程名。 +- Weight:该进程下的调用方法的执行次数。 +- %:该进程下的调用方法的执行占比。 + 以线程统计,如图显示的是 hiperf 进程下的线程的饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/Hiperf_import_thread.jpg) +- ThreadName:线程名。 +- Weight:该线程下的调用方法的执行次数。 +- %:该线程下的调用方法的执行占比。 + 以 lib 库统计,如图显示的是 hiperf 线程下的各 so 占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/Hiperf_import_lib.jpg) +- Library:so的名称。 +- Weight:该so的调用方法的执行次数。 +- %:该so的调用方法的执行占比。 + 以函数统计,如图显示的是 ld-musl-aarch64.so.1 下的各函数占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/Hiperf_import_Fuc.jpg) +- Library:so的名称。 +- Weight:该so的调用方法的执行次数。 +- %:该so的调用方法的执行占比。 + +## FileSystem 文件的不同库函数占比 + +FileSystem 分为五级统计,分别按照进程,系统调用类型,线程,lib 库,函数进行统计。其中 lib 跟函数为每一条调用栈,从栈顶往下查找,非 musl 库与 c++库的第一条函数及其 lib 为每次分配归属的函数及 lib 库。 +点击 Analysis 的 Tab 页,先以进程去统计。 ![GitHub Logo](../../figures/ImportSo/filesystem_import_process.jpg) -+ ProcessName:进程名。 -+ Duration:总时长。 -+ %:总时长占比。 -以系统调用类型统计,如图显示的是grep进程下的Read和Write系统调用的时长占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/filesystem_import_Type.jpg) -+ Type:系统调用类型(Read和Write)。 -+ Duration:系统调用的总时长。 -+ %:总时长占比。 -以线程统计,如图显示的是系统调用是Read类型的线程的占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/filesystem_import_thread.jpg) -+ ThreadName:线程名。 -+ Duration:该线程的系统调用的总时长。 -+ %:总时长占比。 -以lib库统计,如图显示toybox的lib库的占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/filesystem_import_lib.jpg) -+ Library:so的名称。 -+ Duration:该so的系统调用的总时长。 -+ %:总时长占比。 -以函数统计,如图显示0x558111afbc (toybox)的函数占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/filesystem_import_func.jpg) -+ Function:函数名称。 -+ Duration:该函数的系统调用的总时长。 -+ %:总时长占比。 -## Bio文件的不同库函数占比 -Bio分为五级统计,分别按照进程,系统调用类型,线程,lib库,函数进行统计。其中lib跟函数为每一条调用栈,从栈顶往下查找,非submit_bio第一条函数及其lib为每次分配归属的函数及lib库。 -点击Analysis的Tab页,先以进程去统计。 + +- ProcessName:进程名。 +- Duration:总时长。 +- %:总时长占比。 + 以系统调用类型统计,如图显示的是 grep 进程下的 Read 和 Write 系统调用的时长占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/filesystem_import_Type.jpg) +- Type:系统调用类型(Read和Write)。 +- Duration:系统调用的总时长。 +- %:总时长占比。 + 以线程统计,如图显示的是系统调用是 Read 类型的线程的占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/filesystem_import_thread.jpg) +- ThreadName:线程名。 +- Duration:该线程的系统调用的总时长。 +- %:总时长占比。 + 以 lib 库统计,如图显示 toybox 的 lib 库的占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/filesystem_import_lib.jpg) +- Library:so的名称。 +- Duration:该so的系统调用的总时长。 +- %:总时长占比。 + 以函数统计,如图显示 0x558111afbc (toybox)的函数占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/filesystem_import_func.jpg) +- Function:函数名称。 +- Duration:该函数的系统调用的总时长。 +- %:总时长占比。 + +## Bio 文件的不同库函数占比 + +Bio 分为五级统计,分别按照进程,系统调用类型,线程,lib 库,函数进行统计。其中 lib 跟函数为每一条调用栈,从栈顶往下查找,非 submit_bio 第一条函数及其 lib 为每次分配归属的函数及 lib 库。 +点击 Analysis 的 Tab 页,先以进程去统计。 ![GitHub Logo](../../figures/ImportSo/bio_import_process.jpg) -+ ProcessName:进程名。 -+ Duration:总时长。 -+ %:总时长占比。 -以系统调用类型统计,如图显示的是jbd2/mmcblk0p11进程下的DATA_WRITE系统调用的时长占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/bio_import_Type.jpg) -+ Type:系统调用类型。 -+ Duration:系统调用的总时长。 -+ %:总时长占比。 -以线程统计,如图显示的是系统调用是DATA_WRITE类型的线程的占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/bio_import_thread.jpg) -+ ThreadName:线程名。 -+ Duration:该线程的系统调用的总时长。 -+ %:总时长占比。 -以lib库统计,如图显示kallsyms的lib库的占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/bio_import_lib.jpg) -+ Library:so的名称。 -+ Duration:该so的系统调用的总时长。 -+ %:总时长占比。 -以函数统计,如图显示submit_bh的函数占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/bio_import_func.jpg) -+ Function:函数名称。 -+ Duration:该函数的系统调用的总时长。 -+ %:总时长占比。 -## Page Fault文件的不同库函数占比 -Page Fault分为五级统计,分别按照进程,系统调用类型,线程,lib库,函数进行统计。其中lib跟函数为每一条调用栈,从栈顶往下查找,非musl库与c++库的第一条函数及其lib为每次分配归属的函数及lib库。 -点击Analysis的Tab页,先以进程去统计。 + +- ProcessName:进程名。 +- Duration:总时长。 +- %:总时长占比。 + 以系统调用类型统计,如图显示的是 jbd2/mmcblk0p11 进程下的 DATA_WRITE 系统调用的时长占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/bio_import_Type.jpg) +- Type:系统调用类型。 +- Duration:系统调用的总时长。 +- %:总时长占比。 + 以线程统计,如图显示的是系统调用是 DATA_WRITE 类型的线程的占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/bio_import_thread.jpg) +- ThreadName:线程名。 +- Duration:该线程的系统调用的总时长。 +- %:总时长占比。 + 以 lib 库统计,如图显示 kallsyms 的 lib 库的占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/bio_import_lib.jpg) +- Library:so的名称。 +- Duration:该so的系统调用的总时长。 +- %:总时长占比。 + 以函数统计,如图显示 submit_bh 的函数占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/bio_import_func.jpg) +- Function:函数名称。 +- Duration:该函数的系统调用的总时长。 +- %:总时长占比。 + +## Page Fault 文件的不同库函数占比 + +Page Fault 分为五级统计,分别按照进程,系统调用类型,线程,lib 库,函数进行统计。其中 lib 跟函数为每一条调用栈,从栈顶往下查找,非 musl 库与 c++库的第一条函数及其 lib 为每次分配归属的函数及 lib 库。 +点击 Analysis 的 Tab 页,先以进程去统计。 ![GitHub Logo](../../figures/ImportSo/pagefault_import_process.jpg) -+ ProcessName:进程名。 -+ Duration:总时长。 -+ %:总时长占比。 -以系统调用类型统计,如图显示的是1.ui进程下的File Backed In和Copy On Writer系统调用的时长占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/pagefault_import_Type.jpg) -+ Type:系统调用类型。 -+ Duration:系统调用的总时长。 -+ %:总时长占比。 -以线程统计,如图显示的是系统调用是File Backed In类型的线程的占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/pagefault_import_thread.jpg) -+ ThreadName:线程名。 -+ Duration:该线程的系统调用的总时长。 -+ %:总时长占比。 -以lib库统计,如图显示各lib库的占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/pagefault_import_lib.jpg) -+ Library:so的名称。 -+ Duration:该so的系统调用的总时长。 -+ %:总时长占比。 -以函数统计,如图显示各函数占比饼图和Table表。 -![GitHub Logo](../../figures/ImportSo/pagefault_import_func.jpg) -+ Function:函数名称。 -+ Duration:该函数的系统调用的总时长。 -+ %:总时长占比。 \ No newline at end of file + +- ProcessName:进程名。 +- Duration:总时长。 +- %:总时长占比。 + 以系统调用类型统计,如图显示的是 1.ui 进程下的 File Backed In 和 Copy On Writer 系统调用的时长占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/pagefault_import_Type.jpg) +- Type:系统调用类型。 +- Duration:系统调用的总时长。 +- %:总时长占比。 + 以线程统计,如图显示的是系统调用是 File Backed In 类型的线程的占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/pagefault_import_thread.jpg) +- ThreadName:线程名。 +- Duration:该线程的系统调用的总时长。 +- %:总时长占比。 + 以 lib 库统计,如图显示各 lib 库的占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/pagefault_import_lib.jpg) +- Library:so的名称。 +- Duration:该so的系统调用的总时长。 +- %:总时长占比。 + 以函数统计,如图显示各函数占比饼图和 Table 表。 + ![GitHub Logo](../../figures/ImportSo/pagefault_import_func.jpg) +- Function:函数名称。 +- Duration:该函数的系统调用的总时长。 +- %:总时长占比。 diff --git a/ide/src/doc/md/quickstart_Js_memory.md b/ide/src/doc/md/quickstart_Js_memory.md index 0eb71f7bee4e96c5d9525446f9f2c819fe7e6bee..d7396c51e7bd9c186eb9a55798352fa28bd926b3 100644 --- a/ide/src/doc/md/quickstart_Js_memory.md +++ b/ide/src/doc/md/quickstart_Js_memory.md @@ -1,85 +1,107 @@ -# Js Memory抓取和展示说明 -Js Memory是查看程序中存量内存的情况。 -## Js Memory的抓取 -### Js Memory抓取配置参数 +# Js Memory 抓取和展示说明 + +Js Memory 是查看程序中存量内存的情况。 + +## Js Memory 的抓取 + +### Js Memory 抓取配置参数 + ![GitHub Logo](../../figures/Jsmemory/jsmemorysetting.jpg) 配置参数说明: -* Process:设置抓取的进程ID,此处以1747进程号为例。 -* Heap snapshot:堆快照性能分析会显示网页的JavaScript对象和相关DOM节点中内存分配情况。 -* include numerical values in capture:在快照中添加数字。 -* Interval:抓取的时间间隔。 -* Allocation insteumentation on timeline:分配时间轴显示了插桩的JavaScript内存分配随时间变化的情况。 -* record stack traces of allocations(extra performance overhead):录制各项分配的堆栈轨迹(会产生额外的性能开销)。 - -再点击Record setting,在output file path输入文件名hiprofiler_data_jsmemory.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是30s。 + +- Process:设置抓取的进程 ID,此处以 1747 进程号为例。 +- Heap snapshot:堆快照性能分析会显示网页的 JavaScript 对象和相关 DOM 节点中内存分配情况。 +- include numerical values in capture:在快照中添加数字。 +- Interval:抓取的时间间隔。 +- Allocation insteumentation on timeline:分配时间轴显示了插桩的 JavaScript 内存分配随时间变化的情况。 +- record stack traces of allocations(extra performance overhead):录制各项分配的堆栈轨迹(会产生额外的性能开销)。 + +再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_jsmemory.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 30s。 ![GitHub Logo](../../figures/Jsmemory/jsmemoryset.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击Record抓取,抓取过程中会显示抓取时长。 +点击 Trace command,就会根据上面的配置生成抓取命令,点击 Record 抓取,抓取过程中会显示抓取时长。 ![GitHub Logo](../../figures/Jsmemory/jsmemoryrecord.jpg) -## Js Memory展示说明 -将抓取的jsmemory文件导入到smartperf工具中查看,查看程序中存量内存的情况。 -### Js Memory泳道图展示类型 + +## Js Memory 展示说明 + +将抓取的 jsmemory 文件导入到 smartperf 工具中查看,查看程序中存量内存的情况。 + +### Js Memory 泳道图展示类型 + 堆快照类型文件的泳道图展示。 ![GitHub Logo](../../figures/Jsmemory/jsnapshotChart.jpg) -+ Heapsnapshot:堆快照性能分析会显示网页的JavaScript对象和相关DOM节点中内存分配情况。 -时间轴上分配插桩类型文件的泳道图展示。 -![GitHub Logo](../../figures/Jsmemory/jstimelineChart.jpg) -+ Heaptimeline:分配时间轴显示了插桩的JavaScript内存分配随时间变化的情况。 - -### Js Memory泳道图的框选功能 -可以对内存的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有两个tab页。 -Summary的Tab页,主要显示了总览视图,通过类的名称来分组显示对象。 + +- Heapsnapshot:堆快照性能分析会显示网页的JavaScript对象和相关DOM节点中内存分配情况。 + 时间轴上分配插桩类型文件的泳道图展示。 + ![GitHub Logo](../../figures/Jsmemory/jstimelineChart.jpg) +- Heaptimeline:分配时间轴显示了插桩的JavaScript内存分配随时间变化的情况。 + +### Js Memory 泳道图的框选功能 + +可以对内存的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有两个 tab 页。 +Summary 的 Tab 页,主要显示了总览视图,通过类的名称来分组显示对象。 ![GitHub Logo](../../figures/Jsmemory/JsSummary.jpg) -+ Constructor:类创建的所有对象,其中 + +- Constructor:类创建的所有对象,其中 第一层为类名,后面的x表示该类创建了多少实例。 第二层为该类的实例名+id,id唯一。 第三层以下为实例中的成员变量。 -+ Distance:使用节点的最短简单路径显示到根的距离。 - 例如下图其中GC Root为根节点,distance为0,G为上次GC之后新申请内存的实例,distance为100000000。在界面上显示为-,A、B、C、D、E、F、H为调用节点;以E为例,从A->D->F>E,distance为4,从A->D->E,distance为3;从B->E,distance为2,遵循最小distance原则,E的distance为2,同理D的distance为2,F的distance为2,H的distance也为2。 +- Distance:使用节点的最短简单路径显示到根的距离。 + + 例如下图其中 GC Root 为根节点,distance 为 0,G 为上次 GC 之后新申请内存的实例,distance 为 100000000。在界面上显示为-,A、B、C、D、E、F、H 为调用节点;以 E 为例,从 A->D->F>E,distance 为 4,从 A->D->E,distance 为 3;从 B->E,distance 为 2,遵循最小 distance 原则,E 的 distance 为 2,同理 D 的 distance 为 2,F 的 distance 为 2,H 的 distance 也为 2。 - 其中第一层类的distance为该类所有实例中最小的distance,如果有实例的distance为-,类的distance也为-(-表示没有被root节点引用的实例,如下图的G) - ![GitHub Logo](../../figures/Jsmemory/js_sample.png) -+ ShallowSize:是指实例自身占用的内存, 可以理解为保存该'数据结构'需要多少内存 + 其中第一层类的 distance 为该类所有实例中最小的 distance,如果有实例的 distance 为-,类的 distance 也为-(-表示没有被 root 节点引用的实例,如下图的 G) + ![GitHub Logo](../../figures/Jsmemory/js_sample.png) + +- ShallowSize:是指实例自身占用的内存, 可以理解为保存该'数据结构'需要多少内存 例如下面的代码: -``` javascript - class X { - a: number = 0; - b: boolean = false; - c: ChartStruct = new ChartStruct(); - } + +```javascript +class X { + a: number = 0; + b: boolean = false; + c: ChartStruct = new ChartStruct(); +} ``` + 假设当前是在64位系统, 对于类X来说, 一个X实例的Shallow Size为: 类定义的8byte 没有继承其他类, 所以没有父类fields - a,b变量为基本类型number,boolean型, js中都为8byte; + a,b变量为基本类型number,boolean型, js中都为8byte; c变量是引用类型, 和它是否指向具体实例无关, 固定占4byte -+ RetainedSize:Retained Size含义为表示当一个实例被GC回收时, 可以同时被回收的实例的Shallow Size之和。 - * 如上图所示;假设所有的节点Size都为1,按照A->B->C的顺序回收。 - * 当A被回收时,H被D调用,先不回收,D没有被调用,D回收,由于D被回收,H没有被调用,H回收,由于F被C调用,E被B、F也调用了,所以不能被回收,此时A的Retained Size为3,D的Retained Size为2, H的Retained Size为1。 - * 当B被回收时,由于E被F占用,所以E不会被回收,此时B的Retained Size为1。 - * 当C被回收时,F没有被调用,E没有被调用,所以都会被回收,此时C的Retained Size为3,F的Retained Size为2, E的Retained Size为1。 +- RetainedSize:Retained Size含义为表示当一个实例被GC回收时, 可以同时被回收的实例的Shallow Size之和。 + - 如上图所示;假设所有的节点 Size 都为 1,按照 A->B->C 的顺序回收。 + - 当 A 被回收时,H 被 D 调用,先不回收,D 没有被调用,D 回收,由于 D 被回收,H 没有被调用,H 回收,由于 F 被 C 调用,E 被 B、F 也调用了,所以不能被回收,此时 A 的 Retained Size 为 3,D 的 Retained Size 为 2, H 的 Retained Size 为 1。 + - 当 B 被回收时,由于 E 被 F 占用,所以 E 不会被回收,此时 B 的 Retained Size 为 1。 + - 当 C 被回收时,F 没有被调用,E 没有被调用,所以都会被回收,此时 C 的 Retained Size 为 3,F 的 Retained Size 为 2, E 的 Retained Size 为 1。 -Comparison的Tab页,主要显示了比较视图,显示两份快照间的不同之处,主要比较类创建与释放的实例数量。 +Comparison 的 Tab 页,主要显示了比较视图,显示两份快照间的不同之处,主要比较类创建与释放的实例数量。 ![GitHub Logo](../../figures/Jsmemory/JsComparison.jpg) -+ #Constructor:类创建的所有对象,类名与id相同视为同一个实例,其中 + +- #Constructor:类创建的所有对象,类名与id相同视为同一个实例,其中 第一层为类的比较,每个时间点的对比其他时间点的类创建与销毁了哪些实例。 第二层为实例,由于展示的是创建或者销毁实例,固只展示Size大小。 第三层以下为实例的成员变量,不存在比较信息。 -+ #New:新增的实例数量,圆点代表有意义的数据,下划线代表无意义的数据。 -+ #Deleted:删除的实例数量。 -+ #Delta:#New减去#Deleted的数量。 -+ Alloc.Size:新增实例的Size。 -+ Freed Size:删除实例的Size。 -+ Size Delta:Delta的Size。 -### Js Memory的辅助信息功能 -在Summary和Comparison的Tab页,选中左边实例,右边Retainers的Tab页会显示多少个实例引用了左边选中的实例。 +- #New:新增的实例数量,圆点代表有意义的数据,下划线代表无意义的数据。 +- #Deleted:删除的实例数量。 +- #Delta:#New减去#Deleted的数量。 +- Alloc.Size:新增实例的Size。 +- Freed Size:删除实例的Size。 +- Size Delta:Delta的Size。 + +### Js Memory 的辅助信息功能 + +在 Summary 和 Comparison 的 Tab 页,选中左边实例,右边 Retainers 的 Tab 页会显示多少个实例引用了左边选中的实例。 ![GitHub Logo](../../figures/Jsmemory/jsmemorycallstack.jpg) -+ Object:引用的实例。 -+ Distance:使用节点的最短简单路径显示到根的距离。 -+ ShallowSize:所有对象的本身的内存大小之和。 -+ RetainedSize:对象以及其相关的对象一起被删除后所释放的内存大小,同一组对象之间的最大保留大小。 -### Js Memory详细显示的过滤功能 -在下方的Class Filter中输入类名,可以对类名进行过滤,如下图输入array,会过滤出类名是array的相关数据。 -![GitHub Logo](../../figures/Jsmemory/Jsmemoryfilter.jpg) \ No newline at end of file + +- Object:引用的实例。 +- Distance:使用节点的最短简单路径显示到根的距离。 +- ShallowSize:所有对象的本身的内存大小之和。 +- RetainedSize:对象以及其相关的对象一起被删除后所释放的内存大小,同一组对象之间的最大保留大小。 + +### Js Memory 详细显示的过滤功能 + +在下方的 Class Filter 中输入类名,可以对类名进行过滤,如下图输入 array,会过滤出类名是 array 的相关数据。 +![GitHub Logo](../../figures/Jsmemory/Jsmemoryfilter.jpg) diff --git a/ide/src/doc/md/quickstart_ability_monitor.md b/ide/src/doc/md/quickstart_ability_monitor.md index d43839353e5a2a77b0a3c59d39709e9875aabd57..e0325ef11faad9e62ea4383cb69499f15df0f121 100644 --- a/ide/src/doc/md/quickstart_ability_monitor.md +++ b/ide/src/doc/md/quickstart_ability_monitor.md @@ -1,113 +1,127 @@ -# Ability Monitor抓取和展示说明 -抓取和展示处理的CPU,内存,磁盘IO和网络使用情况统计。 -## Ability Monitor的抓取 -### Ability Monitor抓取界面配置说明 -点击Probes config,如选择抓取AbilityMonitor。 -![GitHub Logo]( ../../figures/AbilityMonitor/abilityset.jpg) -### Ability Monitor文件的抓取 -点击Record setting,在output file path输入文件名hiprofiler_data_abilitymonitor.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 -![GitHub Logo]( ../../figures/AbilityMonitor/abilitysetting.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 -![GitHub Logo]( ../../figures/AbilityMonitor/abilitycommand.jpg) -输入hdc_shell,进入设备,执行命令。 -![GitHub Logo]( ../../figures/AbilityMonitor/abilityexcutecommand.jpg) -进入指定目录,cd /data/local/tmp进入到目录,会看到生成的trace文件。 -![GitHub Logo]( ../../figures/AbilityMonitor/abilityhtrace.jpg) -## Ability Monitor功能介绍 -将抓取的文件导入到smartperf工具查看,能了解CPU,内存,磁盘IO和网络的使用情况。 -### Ability Monitor泳道图展示 -Ability Monitor展开就可以看到泳道图,包括CPU,内存,磁盘IO,网络的使用情况。 -![GitHub Logo]( ../../figures/AbilityMonitor/abilitymonitorflowchart.jpg) -+ CPU Total Load:总的CPU使用率。 -+ CPU User Load:CPU在用户态空间运行的使用率。 -+ CPU System Load:CPU在内核空间运行的使用率。 -+ MemoryTotal: 总计物理内存的大小。 -+ Cached:缓存的大小。 -+ SwapTotal: 虚拟内存。 -+ Disk Bytes Read/Sec:每秒从磁盘读取到内存的字节数。 -+ Disk Bytes Written/Sec: 每秒从内存写入磁盘的字节数。 -+ Disk Read Ops/Sec:读入的字节数。 -+ Disk Written Ops/Sec: 写入的字节数。 -+ Network Bytes In/Sec:每秒接收的网络数据字节数。 -+ Network Bytes Out/Sec: 每秒发送的网络数据字节数。 -+ Network Packets In/Sec:每秒接收的网络数据包数。 -+ Network Packets Out/Sec: 每秒发送的网络数据包数。 -### Ability Monitor泳道图的框选功能 -可以对CPU,内存,磁盘IO和网络的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有六个tab页。 -Live Processes的Tab页如图: -![GitHub Logo]( ../../figures/AbilityMonitor/liveprocess.jpg) -+ Process ID:进程的ID。 -+ Process Name:进程名称。 -+ Responsible Process:父进程ID。 -+ User ID:用户ID。 -+ %CPU:进程的CPU占用率。 -+ CPU Time:CPU运行时间。 -+ #Threads:进程的线程数量。 -+ Memory:内存值。 -+ Disk Writes(B):磁盘读入的字节数。 -+ Disk Reads(B):磁盘写入的字节数。 -Processes History的Tab页如图: -![GitHub Logo]( ../../figures/AbilityMonitor/ProcessesHistory.jpg) -+ Process ID:进程ID。 -+ Alive:进程是否存活。 -+ First Seen:开始时间。 -+ Last Seen:所选区域的结束时间。 -+ Process Name:进程名称。 -+ Responsible Process:父进程ID。 -+ User ID:用户ID。 -+ CPU Time:CPU运行时间。 -框选CPU Total Load,CPU User Load,CPU System Load三个区域的泳道图,会展示System CPU Summary的Tab页。 -![GitHub Logo]( ../../figures/AbilityMonitor/cpusummary.jpg) -+ Start Time:采集时间的时间戳。 -+ Duration:前一次采集到本次采集的时间差。 -+ TotalLoad%:总的CPU使用率。 -+ UserLoad%:CPU在用户态空间运行的使用率。 -+ SystemLoad%:CPU在内核空间运行的使用率。 -+ Process:进程号。 -框选MemoryTotal,Cached,SwapTota三个区域的泳道图,会展示System Memory Summary的Tab页。 -![GitHub Logo]( ../../figures/AbilityMonitor/memorytab.jpg) -+ Start Time:采集时间的时间戳。 -+ Duration:前一次采集到本次采集的时间差。 -+ MemTotal:总内存大小。 -+ MemFree:空闲内存大小。 -+ Buffers:文件的缓冲大小。 -+ Cached:缓存的大小。 -+ Shmem:已被分配的共享内存大小。 -+ Slab:内核数据缓存大小。 -+ SUnreclaim:不可回收的Slab大小。 -+ Swap Toal:交换空间的总大小。 -+ SwapFree:未被使用交换空间的大小。 -+ Mapped:设备和文件等映射的大小。 -+ VmallocUsed:已被使用的虚拟内存大小。 -+ PageTables:管理内存分页的索引表大小。 -+ KernelStack:Kernel消耗的内存。 -+ Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小。 -+ Inactive:在不经常使用中的缓冲或高速缓冲存储器页面文件的大小。 -+ Unevictable:不能被释放的内存页。 -+ VmallocTotal:可以vmalloc虚拟内存大小。 -+ CmaTotal:总的连续可用内存。 -+ CmaFree:空闲的可用内存。 -框选Disk Bytes Read/Sec,Disk Bytes Written/Sec,Disk Read Ops/Sec,Disk Written Ops/Sec四个区域的泳道图,会展示System Disk Summary的Tab页。 -![GitHub Logo]( ../../figures/AbilityMonitor/disktab.jpg) -+ Start Time:采集时间的时间戳。 -+ Duration:前一次采集到本次采集的时间差。 -+ Data Read:从磁盘读取到内存的总字节数。 -+ Data Read/sec:每秒从磁盘读取到内存的字节数。 -+ Data Write:从内存写入磁盘的总字节数。 -+ Data Write/sec:每秒从内存写入磁盘的字节数。 -+ Reads In:读入的字节数。 -+ Reads In/sec:每秒读入的字节数。 -+ Write Out:写入的字节数。 -+ Write Out/sec:每秒写入的字节数。 -框选Network Bytes In/Sec,Network Bytes Out/Sec,Network Packets In/Sec,Network Packets Out/Sec四个区域的泳道图,会展示System Network Summary的Tab页。 -![GitHub Logo]( ../../figures/AbilityMonitor/network.jpg) -+ Start Time:采集时间的时间戳。 -+ Duration:前一次采集到本次采集的时间差。 -+ Data Received:接收的网络数据总字节数。 -+ Data Received/sec:每秒接收的网络数据字节数。 -+ Data Send:发送的网络数据总字节数。 -+ Data Send/sec:每秒发送的网络数据字节数。 -+ Packets In:接收的网络总数据包数。 -+ Packets In/sec:每秒接收的网络数据包数。 -+ Packets Out:发送的网络总数据包数。 -+ Packets Out/sec:每秒发送的网络数据包数。 +# Ability Monitor 抓取和展示说明 + +抓取和展示处理的 CPU,内存,磁盘 IO 和网络使用情况统计。 + +## Ability Monitor 的抓取 + +### Ability Monitor 抓取界面配置说明 + +点击 Probes config,如选择抓取 AbilityMonitor。 +![GitHub Logo](../../figures/AbilityMonitor/abilityset.jpg) + +### Ability Monitor 文件的抓取 + +点击 Record setting,在 output file path 输入文件名 hiprofiler_data_abilitymonitor.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 +![GitHub Logo](../../figures/AbilityMonitor/abilitysetting.jpg) +点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 +![GitHub Logo](../../figures/AbilityMonitor/abilitycommand.jpg) +输入 hdc_shell,进入设备,执行命令。 +![GitHub Logo](../../figures/AbilityMonitor/abilityexcutecommand.jpg) +进入指定目录,cd /data/local/tmp 进入到目录,会看到生成的 trace 文件。 +![GitHub Logo](../../figures/AbilityMonitor/abilityhtrace.jpg) + +## Ability Monitor 功能介绍 + +将抓取的文件导入到 smartperf 工具查看,能了解 CPU,内存,磁盘 IO 和网络的使用情况。 + +### Ability Monitor 泳道图展示 + +Ability Monitor 展开就可以看到泳道图,包括 CPU,内存,磁盘 IO,网络的使用情况。 +![GitHub Logo](../../figures/AbilityMonitor/abilitymonitorflowchart.jpg) + +- CPU Total Load:总的CPU使用率。 +- CPU User Load:CPU在用户态空间运行的使用率。 +- CPU System Load:CPU在内核空间运行的使用率。 +- MemoryTotal: 总计物理内存的大小。 +- Cached:缓存的大小。 +- SwapTotal: 虚拟内存。 +- Disk Bytes Read/Sec:每秒从磁盘读取到内存的字节数。 +- Disk Bytes Written/Sec: 每秒从内存写入磁盘的字节数。 +- Disk Read Ops/Sec:读入的字节数。 +- Disk Written Ops/Sec: 写入的字节数。 +- Network Bytes In/Sec:每秒接收的网络数据字节数。 +- Network Bytes Out/Sec: 每秒发送的网络数据字节数。 +- Network Packets In/Sec:每秒接收的网络数据包数。 +- Network Packets Out/Sec: 每秒发送的网络数据包数。 + +### Ability Monitor 泳道图的框选功能 + +可以对 CPU,内存,磁盘 IO 和网络的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有六个 tab 页。 +Live Processes 的 Tab 页如图: +![GitHub Logo](../../figures/AbilityMonitor/liveprocess.jpg) + +- Process ID:进程的ID。 +- Process Name:进程名称。 +- Responsible Process:父进程ID。 +- User ID:用户ID。 +- %CPU:进程的CPU占用率。 +- CPU Time:CPU运行时间。 +- #Threads:进程的线程数量。 +- Memory:内存值。 +- Disk Writes(B):磁盘读入的字节数。 +- Disk Reads(B):磁盘写入的字节数。 + Processes History 的 Tab 页如图: + ![GitHub Logo](../../figures/AbilityMonitor/ProcessesHistory.jpg) +- Process ID:进程ID。 +- Alive:进程是否存活。 +- First Seen:开始时间。 +- Last Seen:所选区域的结束时间。 +- Process Name:进程名称。 +- Responsible Process:父进程ID。 +- User ID:用户ID。 +- CPU Time:CPU运行时间。 + 框选 CPU Total Load,CPU User Load,CPU System Load 三个区域的泳道图,会展示 System CPU Summary 的 Tab 页。 + ![GitHub Logo](../../figures/AbilityMonitor/cpusummary.jpg) +- Start Time:采集时间的时间戳。 +- Duration:前一次采集到本次采集的时间差。 +- TotalLoad%:总的CPU使用率。 +- UserLoad%:CPU在用户态空间运行的使用率。 +- SystemLoad%:CPU在内核空间运行的使用率。 +- Process:进程号。 + 框选 MemoryTotal,Cached,SwapTota 三个区域的泳道图,会展示 System Memory Summary 的 Tab 页。 + ![GitHub Logo](../../figures/AbilityMonitor/memorytab.jpg) +- Start Time:采集时间的时间戳。 +- Duration:前一次采集到本次采集的时间差。 +- MemTotal:总内存大小。 +- MemFree:空闲内存大小。 +- Buffers:文件的缓冲大小。 +- Cached:缓存的大小。 +- Shmem:已被分配的共享内存大小。 +- Slab:内核数据缓存大小。 +- SUnreclaim:不可回收的Slab大小。 +- Swap Toal:交换空间的总大小。 +- SwapFree:未被使用交换空间的大小。 +- Mapped:设备和文件等映射的大小。 +- VmallocUsed:已被使用的虚拟内存大小。 +- PageTables:管理内存分页的索引表大小。 +- KernelStack:Kernel消耗的内存。 +- Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小。 +- Inactive:在不经常使用中的缓冲或高速缓冲存储器页面文件的大小。 +- Unevictable:不能被释放的内存页。 +- VmallocTotal:可以vmalloc虚拟内存大小。 +- CmaTotal:总的连续可用内存。 +- CmaFree:空闲的可用内存。 + 框选 Disk Bytes Read/Sec,Disk Bytes Written/Sec,Disk Read Ops/Sec,Disk Written Ops/Sec 四个区域的泳道图,会展示 System Disk Summary 的 Tab 页。 + ![GitHub Logo](../../figures/AbilityMonitor/disktab.jpg) +- Start Time:采集时间的时间戳。 +- Duration:前一次采集到本次采集的时间差。 +- Data Read:从磁盘读取到内存的总字节数。 +- Data Read/sec:每秒从磁盘读取到内存的字节数。 +- Data Write:从内存写入磁盘的总字节数。 +- Data Write/sec:每秒从内存写入磁盘的字节数。 +- Reads In:读入的字节数。 +- Reads In/sec:每秒读入的字节数。 +- Write Out:写入的字节数。 +- Write Out/sec:每秒写入的字节数。 + 框选 Network Bytes In/Sec,Network Bytes Out/Sec,Network Packets In/Sec,Network Packets Out/Sec 四个区域的泳道图,会展示 System Network Summary 的 Tab 页。 + ![GitHub Logo](../../figures/AbilityMonitor/network.jpg) +- Start Time:采集时间的时间戳。 +- Duration:前一次采集到本次采集的时间差。 +- Data Received:接收的网络数据总字节数。 +- Data Received/sec:每秒接收的网络数据字节数。 +- Data Send:发送的网络数据总字节数。 +- Data Send/sec:每秒发送的网络数据字节数。 +- Packets In:接收的网络总数据包数。 +- Packets In/sec:每秒接收的网络数据包数。 +- Packets Out:发送的网络总数据包数。 +- Packets Out/sec:每秒发送的网络数据包数。 diff --git a/ide/src/doc/md/quickstart_animation.md b/ide/src/doc/md/quickstart_animation.md index 59ded268af06ec94e089c409d05c3bb330ebe877..4bfe801ce8b87a9ad8be665bd0ea2d6e0ccfbe45 100644 --- a/ide/src/doc/md/quickstart_animation.md +++ b/ide/src/doc/md/quickstart_animation.md @@ -7,9 +7,9 @@ ### Animation展示说明 将抓取的Animation文件导入到smartperf工具中,查看图形子系统和应用动效卡顿类问题。 ### Animation泳道图展示 -Animation的响应时延泳道图显示,泳道图的Slice会显示响应时延,如下图中的Completion delay(683.035938ms)。 +Animation的响应时延和完成时延泳道图显示,泳道图的Slice会显示响应时延和完成时延,如下图中的Response delay(79.379165ms),Completion delay(2606.938539ms)。 ![GitHub Logo](../../figures/animation/anrsdelayrow.jpg)。 -Animation的动效曲线和帧间距的总泳道图,如图点击leashWindow40旁边的小齿轮可以切换leashWindow。 +Animation的动效曲线和帧间距的总泳道图,如图点击WindowScene_mm37旁边的小齿轮可以切换WindowScene。 ![GitHub Logo](../../figures/animation/anrsallrow.jpg)。 Animation的动效曲线泳道图展示,如下: ![GitHub Logo](../../figures/animation/anieffectcurv.jpg) @@ -33,11 +33,11 @@ Animation的帧间距泳道图展示,如下: + Index: 属性索引。 + Value:属性值。 ### 帧间距泳道图点选功能 -点选帧间距泳道图,Frame spacing的Tab页会显示这一个点的帧间距计算数据,一个点要计算两个属性的的帧间距,所以需要显示两个属性的。 +点选帧间距泳道图,Frame spacing的Tab页会显示这一个点的帧间距计算数据,一个点要计算四个属性的的帧间距,所以需要显示四个属性的。 ![GitHub Logo](../../figures/animation/anispacingselect.jpg) + Timestamp: 时间戳信息。 + Index: 属性索引。 -+ property:动效宽度或高度属性。 ++ property:动效宽度,高度,X,Y的属性。 + Value2: 当前帧的属性值。 + Value1: 前一帧的属性值。 + Screen:存储设备的物理宽度/高度。 @@ -49,7 +49,7 @@ Animation的帧间距泳道图展示,如下: ![GitHub Logo](../../figures/animation/anispacingdrag.jpg) + Timestamp: 时间戳信息。 + Index: 属性索引。 -+ property:动效宽度或高度属性。 ++ property:动效宽度,高度,X,Y的属性。 + Value2: 当前帧的属性值。 + Value1: 前一帧的属性值。 + Screen:存储设备的物理宽度/高度。 diff --git a/ide/src/doc/md/quickstart_arkts.md b/ide/src/doc/md/quickstart_arkts.md index 0c70e942382b7a0aa0ac56c6013b51262f1b09b2..c5c40238edffe127b472213761168191c5943f74 100644 --- a/ide/src/doc/md/quickstart_arkts.md +++ b/ide/src/doc/md/quickstart_arkts.md @@ -1,44 +1,59 @@ -# Cpuprofiler抓取和展示说明 -Cpuprofiler模板帮助ArkTs开发和测试分析虚拟机层执行开销大问题,提供Ts层耗时长函数和阶段。 -## Cpuprofiler的抓取 -#### Cpuprofiler的抓取配置参数 -打开Start Ark Ts Record总开关下面的Start cpu profiler开关抓取cpuprofiler数据。 +# Cpuprofiler 抓取和展示说明 + +Cpuprofiler 模板帮助 ArkTs 开发和测试分析虚拟机层执行开销大问题,提供 Ts 层耗时长函数和阶段。 + +## Cpuprofiler 的抓取 + +#### Cpuprofiler 的抓取配置参数 + +打开 Start Ark Ts Record 总开关下面的 Start cpu profiler 开关抓取 cpuprofiler 数据。 ![GitHub Logo](../../figures/arkts/cpuprofilerconfig.jpg) -### Cpuprofiler展示说明 -将抓取的cpuprofiler文件导入到smartperf中,查看Ts层耗时长的函数和阶段。 + +### Cpuprofiler 展示说明 + +将抓取的 cpuprofiler 文件导入到 smartperf 中,查看 Ts 层耗时长的函数和阶段。 ![GitHub Logo](../../figures/arkts/cpuprofilerrow.jpg) -### Cpuprofiler的泳道图悬浮显示 -鼠标放到泳道图的Slice上会有悬浮框显示。 + +### Cpuprofiler 的泳道图悬浮显示 + +鼠标放到泳道图的 Slice 上会有悬浮框显示。 ![GitHub Logo](../../figures/arkts/cpuprofilertip.jpg) -+ Name : 函数名。 -+ Self Time: 函数自身执行时间(不包含其调用者)。 -+ Total Time : 函数自身及调用者的调用时间总和。 -+ Url : 函数所在的文件名称。 -### Cpuprofiler泳道图的点选和框选功能 -点选或者框选泳道图上函数名的Slice,会显示Js Profiler Statistics,Js Profiler CallTree,Js Profiler BottomUp的Tab页信息。 -Js Profiler Statistics的Tab页显示数据的维度信息,以饼图和Table表的方式展示,如下图: + +- Name : 函数名。 +- Self Time: 函数自身执行时间(不包含其调用者)。 +- Total Time : 函数自身及调用者的调用时间总和。 +- Url : 函数所在的文件名称。 + +### Cpuprofiler 泳道图的点选和框选功能 + +点选或者框选泳道图上函数名的 Slice,会显示 Js Profiler Statistics,Js Profiler CallTree,Js Profiler BottomUp 的 Tab 页信息。 +Js Profiler Statistics 的 Tab 页显示数据的维度信息,以饼图和 Table 表的方式展示,如下图: ![GitHub Logo](../../figures/arkts/cpuprofilerselects.jpg) ![GitHub Logo](../../figures/arkts/cpuprofilerdrags.jpg) -+ Type : 维度名称,有九大维度(NAPI、ARKUI_ENGINE、BUTLTIN、GC、AINT、CINT、AOT、RUNTIME、OTHER)。 -+ Total : 时间。 -+ % : 时间占比。 -Js Profiler CallTree的Tab页把name,url,depth,parent相同的函数合并,构建成一个top down的树结构,以树形表格的形式显示,表格中显示函数调用关系,如下图: -![GitHub Logo](../../figures/arkts/cpuprofilerselectc.jpg) -![GitHub Logo](../../figures/arkts/cpuprofilerdragc.jpg) -+ Symbol : 函数名。 -+ Self Time: 函数自身执行时间(不包含其调用者)。 -+ Total Time : 函数自身及调用者的调用时间总和。 -Js Profiler BottomUp的Tab页把name,url,depth,parent相同的函数合并,构建成一个bottom up的树结构,以树形表格的形式显示,只不过作为根节点的是被调用者,表格中显示函数被调用关系,如下图: -![GitHub Logo](../../figures/arkts/cpuprofilerselectb.jpg) -![GitHub Logo](../../figures/arkts/cpuprofilerdragb.jpg) -+ Symbol : 函数名。 -+ Self Time: 函数自身执行时间(不包含其调用者)。 -+ Total Time : 函数自身及调用者的调用时间总和。 -### Cpuprofiler的Heaviest Stack功能 -Js Profiler CallTree的Tab页的Heaviest Stack表格显示的是选中的函数的完整的调用栈。 + +- Type : 维度名称,有九大维度(NAPI、ARKUI_ENGINE、BUTLTIN、GC、AINT、CINT、AOT、RUNTIME、OTHER)。 +- Total : 时间。 +- % : 时间占比。 + Js Profiler CallTree 的 Tab 页把 name,url,depth,parent 相同的函数合并,构建成一个 top down 的树结构,以树形表格的形式显示,表格中显示函数调用关系,如下图: + ![GitHub Logo](../../figures/arkts/cpuprofilerselectc.jpg) + ![GitHub Logo](../../figures/arkts/cpuprofilerdragc.jpg) +- Symbol : 函数名。 +- Self Time: 函数自身执行时间(不包含其调用者)。 +- Total Time : 函数自身及调用者的调用时间总和。 + Js Profiler BottomUp 的 Tab 页把 name,url,depth,parent 相同的函数合并,构建成一个 bottom up 的树结构,以树形表格的形式显示,只不过作为根节点的是被调用者,表格中显示函数被调用关系,如下图: + ![GitHub Logo](../../figures/arkts/cpuprofilerselectb.jpg) + ![GitHub Logo](../../figures/arkts/cpuprofilerdragb.jpg) +- Symbol : 函数名。 +- Self Time: 函数自身执行时间(不包含其调用者)。 +- Total Time : 函数自身及调用者的调用时间总和。 + +### Cpuprofiler 的 Heaviest Stack 功能 + +Js Profiler CallTree 的 Tab 页的 Heaviest Stack 表格显示的是选中的函数的完整的调用栈。 ![GitHub Logo](../../figures/arkts/cpuprofilerheavic.jpg) -Js Profiler BottomUp的Tab页的Heaviest Stack表格显示的是选中的函数的完整的逆序调用栈。 +Js Profiler BottomUp 的 Tab 页的 Heaviest Stack 表格显示的是选中的函数的完整的逆序调用栈。 ![GitHub Logo](../../figures/arkts/cpuprofilerheavib.jpg) -+ Symbol : 函数名。 -+ Total Time : 函数自身及调用者的调用时间总和。 -+ % : 总时间占比。 \ No newline at end of file + +- Symbol : 函数名。 +- Total Time : 函数自身及调用者的调用时间总和。 +- % : 总时间占比。 diff --git a/ide/src/doc/md/quickstart_bio.md b/ide/src/doc/md/quickstart_bio.md index d4182083de97647a1521fb00cf857e41df006b65..4862bc402df44d8680c79329e67400ae5bb5aac5 100644 --- a/ide/src/doc/md/quickstart_bio.md +++ b/ide/src/doc/md/quickstart_bio.md @@ -1,85 +1,111 @@ -# Bio的抓取和展示说明 -抓取和展示IO延迟的数据。 -## Bio的抓取 -### Bio抓取配置参数 +# Bio 的抓取和展示说明 + +抓取和展示 IO 延迟的数据。 + +## Bio 的抓取 + +### Bio 抓取配置参数 + ![GitHub Logo](../../figures/Bio/Biosetting.jpg) 配置项说明: -+ Start BIO Latency Record:配置项的总开关。 -+ Process:默认配置的是整个系统的,也可选择单进程抓取。 -+ Max Unwind Level:配置抓取调用栈的最大深度。 -再点击Record setting,在output file path输入文件名hiprofiler_data_bio.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 -![GitHub Logo](../../figures/Bio/Biorecord.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击Record抓取,抓取过程中会显示抓取时长。 -![GitHub Logo](../../figures/Bio/Bioexcuting.jpg) -### Bio展示说明 -抓取结束后Bio的trace会自动加载展示。 + +- Start BIO Latency Record:配置项的总开关。 +- Process:默认配置的是整个系统的,也可选择单进程抓取。 +- Max Unwind Level:配置抓取调用栈的最大深度。 + 再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_bio.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 + ![GitHub Logo](../../figures/Bio/Biorecord.jpg) + 点击 Trace command,就会根据上面的配置生成抓取命令,点击 Record 抓取,抓取过程中会显示抓取时长。 + ![GitHub Logo](../../figures/Bio/Bioexcuting.jpg) + +### Bio 展示说明 + +抓取结束后 Bio 的 trace 会自动加载展示。 ![GitHub Logo](../../figures/Bio/Biosummary.jpg) -界面布局介绍:页内存整体界面布局分为3个部分: -+ 红色区域:泳道图。 -+ 绿色区域:详细信息。 -+ 黄色区域:辅助信息(Callstack)。 +界面布局介绍:页内存整体界面布局分为 3 个部分: + +- 红色区域:泳道图。 +- 绿色区域:详细信息。 +- 黄色区域:辅助信息(Callstack)。 -### Bio泳道图展示 -Bio泳道图鼠标悬浮以10ms为区间展示该周期内最大的读或者写延迟。 +### Bio 泳道图展示 + +Bio 泳道图鼠标悬浮以 10ms 为区间展示该周期内最大的读或者写延迟。 ![GitHub Logo](../../figures/Bio/Biochart.jpg) -### Bio泳道图的框选功能 -可以对泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有三个tab页。 -Disk I/O Tier Statistics的Tab页如图: + +### Bio 泳道图的框选功能 + +可以对泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有三个 tab 页。 +Disk I/O Tier Statistics 的 Tab 页如图: ![GitHub Logo](../../figures/Bio/Biostatistics.jpg) -+ Tier/Process/Path:按照Tier,Process,Path的维度去展示。 -+ Count:事件数量。 -+ Total Latency:每种进程,事件的总延迟。 -+ Min Total Latency:最小延迟时间。 -+ Avg Total Latency:平均延迟时间。 -+ Max Total Latency:最大延迟时间。 -Disk I/O Latency Calltree的Tab页如图: -![GitHub Logo](../../figures/Bio/BioCalltree.jpg) -+ Call Stack:为经过符号解析后的Callstack,并且给出动态链接库或者进程名的信息。 -+ Local:为该调用方法自身占用的CPU时间。 -+ Weight:调用方法的执行占比。 -Trace Completion Times的Tab页如图: -![GitHub Logo](../../figures/Bio/Biotimes.jpg) -+ Start:事件的开始时间。 -+ Total Latency:事件的延迟时间。 -+ Process:进程名(pid)。 -+ Thread:线程名(tid)。 -+ Latency per 4KB:原始数据里没有,每4k数据的延迟时间,需要根据延迟的size跟延迟的时间去计算。 -+ Opration:事件类型。 -+ Bytes:延迟的数据量。 -+ Path:操作的文件路径。 -+ Block Number:块数量。 -+ Tier:层级。 -+ BackTrace:调用栈顶部函数,并显示调用栈深度。 -### Bio支持多种Options展示风格 -点击Disk I/O Latency Calltree的Tab页底部的Options,会有两个CheckBox复选框。 + +- Tier/Process/Path:按照Tier,Process,Path的维度去展示。 +- Count:事件数量。 +- Total Latency:每种进程,事件的总延迟。 +- Min Total Latency:最小延迟时间。 +- Avg Total Latency:平均延迟时间。 +- Max Total Latency:最大延迟时间。 + Disk I/O Latency Calltree 的 Tab 页如图: + ![GitHub Logo](../../figures/Bio/BioCalltree.jpg) +- Call Stack:为经过符号解析后的Callstack,并且给出动态链接库或者进程名的信息。 +- Local:为该调用方法自身占用的CPU时间。 +- Weight:调用方法的执行占比。 + Trace Completion Times 的 Tab 页如图: + ![GitHub Logo](../../figures/Bio/Biotimes.jpg) +- Start:事件的开始时间。 +- Total Latency:事件的延迟时间。 +- Process:进程名(pid)。 +- Thread:线程名(tid)。 +- Latency per 4KB:原始数据里没有,每4k数据的延迟时间,需要根据延迟的size跟延迟的时间去计算。 +- Opration:事件类型。 +- Bytes:延迟的数据量。 +- Path:操作的文件路径。 +- Block Number:块数量。 +- Tier:层级。 +- BackTrace:调用栈顶部函数,并显示调用栈深度。 + +### Bio 支持多种 Options 展示风格 + +点击 Disk I/O Latency Calltree 的 Tab 页底部的 Options,会有两个 CheckBox 复选框。 ![GitHub Logo](../../figures/Bio/BioOptions.jpg) -+ Invert:反向输出调用树。 -+ Hide System so:隐藏系统库文件 。 -### Bio支持过滤调用栈调用次数的展示风格 -点击Disk I/O Latency Calltree的Tab页底部的Sample Counter Filter,可以填上区间值。过滤出符合该区间值调用次数的调用栈信息。 + +- Invert:反向输出调用树。 +- Hide System so:隐藏系统库文件 。 + +### Bio 支持过滤调用栈调用次数的展示风格 + +点击 Disk I/O Latency Calltree 的 Tab 页底部的 Sample Counter Filter,可以填上区间值。过滤出符合该区间值调用次数的调用栈信息。 ![GitHub Logo](../../figures/Bio/Biocounter.jpg) -### Bio功能的调用栈Group展示-数据分析支持剪裁功能 +### Bio 功能的调用栈 Group 展示-数据分析支持剪裁功能 + ![GitHub Logo](../../figures/Bio/Biodatamining.jpg) -+ 裁剪Callstack,点击Callstack上一个节点符号,再点击底部Symbol Filter按钮,则该符号自动被裁剪掉,同时将该节点往下所有的Callstack内容裁剪掉。 - -+ 裁剪Library,点击Library Filter按钮,则该库文件符号下所有的子节点也被裁剪。 -+ 点击Reset按钮,将恢复选中的裁剪内容。 -### Bio功能的调用栈Group展示支持按条件过滤 -在Input Filter输入关键字,会显示出带有该关键字的展示信息。 - ![GitHub Logo](../../figures/Bio/Bioinputfilter.jpg) -### Bio辅助信息区展示调用栈 -当在详细信息区选择一个符号时,将展示与该符号相关的完整的调用栈。如下图的Heaviest Stack Trace: - ![GitHub Logo](../../figures/Bio/Bioheaviesttrace.jpg) -### Bio的Tier的过滤 - 通过选择根据Tier去过滤。 - ![GitHub Logo](../../figures/Bio/Biofilter.jpg) -### Bio的火焰图功能 -点击Disk I/O Latency Calltree左下角的柱状图的图标,会切换到火焰图页面。 + +- 裁剪 Callstack,点击 Callstack 上一个节点符号,再点击底部 Symbol Filter 按钮,则该符号自动被裁剪掉,同时将该节点往下所有的 Callstack 内容裁剪掉。 + +- 裁剪 Library,点击 Library Filter 按钮,则该库文件符号下所有的子节点也被裁剪。 +- 点击 Reset 按钮,将恢复选中的裁剪内容。 + +### Bio 功能的调用栈 Group 展示支持按条件过滤 + +在 Input Filter 输入关键字,会显示出带有该关键字的展示信息。 +![GitHub Logo](../../figures/Bio/Bioinputfilter.jpg) + +### Bio 辅助信息区展示调用栈 + +当在详细信息区选择一个符号时,将展示与该符号相关的完整的调用栈。如下图的 Heaviest Stack Trace: +![GitHub Logo](../../figures/Bio/Bioheaviesttrace.jpg) + +### Bio 的 Tier 的过滤 + +通过选择根据 Tier 去过滤。 +![GitHub Logo](../../figures/Bio/Biofilter.jpg) + +### Bio 的火焰图功能 + +点击 Disk I/O Latency Calltree 左下角的柱状图的图标,会切换到火焰图页面。 ![GitHub Logo](../../figures/Bio/Bioflame.jpg) -进入到火焰图页面,火焰图的展示跟Callinfo的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和Duration时长。 +进入到火焰图页面,火焰图的展示跟 Callinfo 的 tab 页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和 Duration 时长。 ![GitHub Logo](../../figures/Bio/Bioflameshow.jpg) 鼠标左键火焰图,会进入下一级界面,右键回到上一级。 ![GitHub Logo](../../figures/Bio/Bioflamelevel.jpg) - diff --git a/ide/src/doc/md/quickstart_device_record.md b/ide/src/doc/md/quickstart_device_record.md index 37598543904bfd6f396ef7656419fa8e969e5725..f072110f8f66c8481235e3d3b23e3b63e3d72070 100644 --- a/ide/src/doc/md/quickstart_device_record.md +++ b/ide/src/doc/md/quickstart_device_record.md @@ -1,37 +1,44 @@ -# 设备端抓取trace说明 -从设备端抓取trace文件的配置和方法。 +# 设备端抓取 trace 说明 + +从设备端抓取 trace 文件的配置和方法。 + ## 界面配置说明 + ![GitHub Logo](../../figures/hiprofilercmd/systraceconfig.jpg) 说明: -* Record setting:设置trace的抓取模式,buffer size大小,抓取时长。 -* Trace command:生成的抓取命令行。 -* Probes config:trace的抓取参数配置。 -* Native Memory:NativeMemory数据的抓取参数配置。 -* Hiperf:Hiperf数据的抓取参数配置。 -* eBPF Config:ebpf数据的抓取参数配置。 -* VM Tracker:smaps数据的抓取参数配置。 -* HiSystemEvent:HiSystemEvent数据抓取参数配置。 -* SDK Config:SDK数据抓取参数配置。 -## 命令行的生成和trace文件的抓取 -点击Probes config,如选择抓取Scheduling details。 + +- Record setting:设置 trace 的抓取模式,buffer size 大小,抓取时长。 +- Trace command:生成的抓取命令行。 +- Probes config:trace 的抓取参数配置。 +- Native Memory:NativeMemory 数据的抓取参数配置。 +- Hiperf:Hiperf 数据的抓取参数配置。 +- eBPF Config:ebpf 数据的抓取参数配置。 +- VM Tracker:smaps 数据的抓取参数配置。 +- HiSystemEvent:HiSystemEvent 数据抓取参数配置。 +- SDK Config:SDK 数据抓取参数配置。 + +## 命令行的生成和 trace 文件的抓取 + +点击 Probes config,如选择抓取 Scheduling details。 ![GitHub Logo](../../figures/hiprofilercmd/Scheduling.jpg) -再点击Record setting,在output file path输入文件名hiprofiler_data_example.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 +再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_example.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 ![GitHub Logo](../../figures/hiprofilercmd/tracesetting.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 +点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 ![GitHub Logo](../../figures/hiprofilercmd/command.jpg) 命令参数说明: -* -o:文件的输入路径和名称。 -* -t:抓取的时长。 -* buffer pages:buffer size大小。 -* sample_duration:数据采集的时间。 -* sample_interval:主动获取插件数据的间隔时间(ms,只针对轮询插件,例如memory插件,cpu插件,dikio插件等,对流式插件和独立插件无效)。 -* trace_period_ms:ftrace插件读取内核缓冲区数据的间隔时间(ms)。 -* hitrace_time:hitrace命令行抓取时间,与hiprofiler_cmd下发的-t配置联动。 - -输入hdc_std shell,进入设备,执行命令。 + +- -o:文件的输入路径和名称。 +- -t:抓取的时长。 +- buffer pages:buffer size 大小。 +- sample_duration:数据采集的时间。 +- sample_interval:主动获取插件数据的间隔时间(ms,只针对轮询插件,例如 memory 插件,cpu 插件,dikio 插件等,对流式插件和独立插件无效)。 +- trace_period_ms:ftrace 插件读取内核缓冲区数据的间隔时间(ms)。 +- hitrace_time:hitrace 命令行抓取时间,与 hiprofiler_cmd 下发的-t 配置联动。 + +输入 hdc_std shell,进入设备,执行命令。 ![GitHub Logo](../../figures/hiprofilercmd/excutecommand.jpg) 执行完成后,命令行会给出提示。 ![GitHub Logo](../../figures/hiprofilercmd/commandend.jpg) -进入指定目录,cd /data/local/tmp 进入到目录,会看到生成的trace文件。 -![GitHub Logo](../../figures/hiprofilercmd/htrace.jpg) \ No newline at end of file +进入指定目录,cd /data/local/tmp 进入到目录,会看到生成的 trace 文件。 +![GitHub Logo](../../figures/hiprofilercmd/htrace.jpg) diff --git a/ide/src/doc/md/quickstart_filesystem.md b/ide/src/doc/md/quickstart_filesystem.md index 838175afd5f7cb22931ea1ef762740d16c1736c0..131281592e7eabbfa89920c69bf146feb8e6372d 100644 --- a/ide/src/doc/md/quickstart_filesystem.md +++ b/ide/src/doc/md/quickstart_filesystem.md @@ -1,110 +1,136 @@ -# FileSystem的抓取和展示说明 -FileSystem分析文件系统的信息和活动,比如读和写操作等。 -## FileSystem的抓取 -### FileSystem抓取配置参数 +# FileSystem 的抓取和展示说明 + +FileSystem 分析文件系统的信息和活动,比如读和写操作等。 + +## FileSystem 的抓取 + +### FileSystem 抓取配置参数 + ![GitHub Logo](../../figures/FileSystem/filesystemsetting.jpg) 配置项说明: -+ Start FileSystem Record:配置项的总开关。 -+ Process:默认配置的是整个系统的,也可选择单进程抓取。 -+ Max Unwind Level:配置抓取调用栈的最大深度。 -再点击Record setting,在output file path输入文件名hiprofiler_data_filesystem.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 +- Start FileSystem Record:配置项的总开关。 +- Process:默认配置的是整个系统的,也可选择单进程抓取。 +- Max Unwind Level:配置抓取调用栈的最大深度。 + +再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_filesystem.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 ![GitHub Logo](../../figures/FileSystem/filesystemrecord.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 +点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 ![GitHub Logo](../../figures/FileSystem/FileSystemcommand.jpg) -输入hdc_std shell,进入设备,执行命令。 +输入 hdc_std shell,进入设备,执行命令。 ![GitHub Logo](../../figures/FileSystem/FileSystemexcutecommand.jpg) -执行完成后,进入指定目录查看,在/data/local/tmp下就会生成trace文件。 +执行完成后,进入指定目录查看,在/data/local/tmp 下就会生成 trace 文件。 ![GitHub Logo](../../figures/FileSystem/FileSystemfile.jpg) -### FileSystem展示说明 -将抓取的trace文件导入smartperf界面查看。 + +### FileSystem 展示说明 + +将抓取的 trace 文件导入 smartperf 界面查看。 ![GitHub Logo](../../figures/FileSystem/FileSystemsummary.jpg) -界面布局介绍:FileSystem整体界面布局分为3个部分: -+ 红色区域:泳道图。 -+ 绿色区域:详细信息。 -+ 黄色区域:辅助信息(Callstack)。 +界面布局介绍:FileSystem 整体界面布局分为 3 个部分: + +- 红色区域:泳道图。 +- 绿色区域:详细信息。 +- 黄色区域:辅助信息(Callstack)。 -### FileSystem泳道图展示 -FileSystem泳道图按照读操作和写操作展示,鼠标移动都泳道图上,悬浮框会以10ms为周期展示读,写类型系统调用的次数。 +### FileSystem 泳道图展示 + +FileSystem 泳道图按照读操作和写操作展示,鼠标移动都泳道图上,悬浮框会以 10ms 为周期展示读,写类型系统调用的次数。 ![GitHub Logo](../../figures/FileSystem/FileSystemchart.jpg) -按住w键放大界面,悬浮框会显示当前时刻的文件读写次数。 +按住 w 键放大界面,悬浮框会显示当前时刻的文件读写次数。 ![GitHub Logo](../../figures/FileSystem/FileSystemcount.jpg) -### FileSystem泳道图的框选功能 -可以对读写操作泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有五个tab页。 -FileSystem statistics的Tab页如图: + +### FileSystem 泳道图的框选功能 + +可以对读写操作泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有五个 tab 页。 +FileSystem statistics 的 Tab 页如图: ![GitHub Logo](../../figures/FileSystem/FileSystemstatistics.jpg) -+ Syscall/Process: 按照数据类型,进程分类显示。 -+ Count: 系统调用的数量。 -+ Logical Writes:写数据统计。 -+ Logical Reads:读数据统计。 -+ Other Filesystem Bytes:其他数据量。 -+ Duration:总时长。 -+ Min Duration:最小时长。 -+ Avg Duration: 平均时长。 -+ Max Duration:最大时长。 -FileSystem Calltree的Tab页如图: -![GitHub Logo](../../figures/FileSystem/FileSystemCalltree.jpg) -+ Call Stack:为经过符号解析后的Callstack,并且给出动态链接库或者进程名的信息。 -+ Local:为该调用方法自身占用的CPU时间。 -+ Weight:调用方法的执行占比。 -FileSystem Events的Tab页如图: -![GitHub Logo](../../figures/FileSystem/FileSystemevents.jpg) -+ Start: 起始时间。 -+ Duration:时长。 -+ Process:进程名。 -+ Thread:线程名。 -+ Firsr Argument:系统调用的第一个参数。 -+ Second Argument:系统调用的第二个参数。 -+ Third Argument:系统调用的第三个参数。 -+ Fourth Argument:系统调用的第四个参数。 -+ Retrun:系统调用的返回值。 -+ Error:错误码。 -+ Backtrace:调用栈顶部函数,并显示调用栈深度。 -File Descriptor History的Tab页如图: -![GitHub Logo](../../figures/FileSystem/FileSystemhistory.jpg) -+ Start: 起始时间。 -+ Duration:时长。 -+ Process:进程名。 -+ Type:操作类型。 -+ File Descriptor:fd。 -+ Backtrace:调用栈顶部函数,并显示调用栈深度。 -File Descriptor Time Slice的Tab页如图: -![GitHub Logo](../../figures/FileSystem/FileSystemtimeslice.jpg) -+ Open Time: 打开的起始时间。 -+ Open Duration:打开的时长。 -+ Process:进程名。 -+ File Descriptor:fd。 -+ Backtrace:调用栈顶部函数,并显示调用栈深度。 -### FileSystem支持多种Options展示风格 -点击FileSystem Calltree的Tab页底部的Options,会有两个CheckBox复选框。 + +- Syscall/Process: 按照数据类型,进程分类显示。 +- Count: 系统调用的数量。 +- Logical Writes:写数据统计。 +- Logical Reads:读数据统计。 +- Other Filesystem Bytes:其他数据量。 +- Duration:总时长。 +- Min Duration:最小时长。 +- Avg Duration: 平均时长。 +- Max Duration:最大时长。 + FileSystem Calltree 的 Tab 页如图: + ![GitHub Logo](../../figures/FileSystem/FileSystemCalltree.jpg) +- Call Stack:为经过符号解析后的Callstack,并且给出动态链接库或者进程名的信息。 +- Local:为该调用方法自身占用的CPU时间。 +- Weight:调用方法的执行占比。 + FileSystem Events 的 Tab 页如图: + ![GitHub Logo](../../figures/FileSystem/FileSystemevents.jpg) +- Start: 起始时间。 +- Duration:时长。 +- Process:进程名。 +- Thread:线程名。 +- Firsr Argument:系统调用的第一个参数。 +- Second Argument:系统调用的第二个参数。 +- Third Argument:系统调用的第三个参数。 +- Fourth Argument:系统调用的第四个参数。 +- Retrun:系统调用的返回值。 +- Error:错误码。 +- Backtrace:调用栈顶部函数,并显示调用栈深度。 + File Descriptor History 的 Tab 页如图: + ![GitHub Logo](../../figures/FileSystem/FileSystemhistory.jpg) +- Start: 起始时间。 +- Duration:时长。 +- Process:进程名。 +- Type:操作类型。 +- File Descriptor:fd。 +- Backtrace:调用栈顶部函数,并显示调用栈深度。 + File Descriptor Time Slice 的 Tab 页如图: + ![GitHub Logo](../../figures/FileSystem/FileSystemtimeslice.jpg) +- Open Time: 打开的起始时间。 +- Open Duration:打开的时长。 +- Process:进程名。 +- File Descriptor:fd。 +- Backtrace:调用栈顶部函数,并显示调用栈深度。 + +### FileSystem 支持多种 Options 展示风格 + +点击 FileSystem Calltree 的 Tab 页底部的 Options,会有两个 CheckBox 复选框。 ![GitHub Logo](../../figures/FileSystem/FileSystemOptions.jpg) -+ Invert:反向输出调用树。 -+ Hide System so:隐藏系统库文件。 -### FileSystem支持过滤调用栈调用次数的展示风格 -点击FileSystem Calltree的Tab页底部的Sample Counter Filter,可以填上区间值。过滤出符合该区间值调用次数的调用栈信息。 + +- Invert:反向输出调用树。 +- Hide System so:隐藏系统库文件。 + +### FileSystem 支持过滤调用栈调用次数的展示风格 + +点击 FileSystem Calltree 的 Tab 页底部的 Sample Counter Filter,可以填上区间值。过滤出符合该区间值调用次数的调用栈信息。 ![GitHub Logo](../../figures/FileSystem/FileSystemsamplecounter.jpg) -### FileSystem功能的调用栈Group展示-数据分析支持剪裁功能 +### FileSystem 功能的调用栈 Group 展示-数据分析支持剪裁功能 + ![GitHub Logo](../../figures/FileSystem/FileSystemdatamining.jpg) -+ 裁剪Callstack,点击Callstack上一个节点符号,再点击底部Symbol Filter按钮,则该符号自动被裁剪掉,同时将该节点往下所有的Callstack内容裁剪掉。 - -+ 裁剪Library,点击Library Filter按钮,则该库文件符号下所有的子节点也被裁剪。 -+ 点击Reset按钮,将恢复选中的裁剪内容。 -### FileSystem功能的调用栈Group展示支持按条件过滤 -在Input Filter输入关键字,会显示出带有该关键字的展示信息。 - ![GitHub Logo](../../figures/FileSystem/FileSysteminputfilter.jpg) -### FileSystem辅助信息区展示调用栈 -当在详细信息区选择一个符号时,将展示与该符号相关的完整的调用栈。如下图的Heaviest Stack Trace: - ![GitHub Logo](../../figures/FileSystem/FileSystemheaviesttrace.jpg) -### FileSystem的事件类型的过滤 - 通过选择可以过滤是Open类型,还是Close类型事件。 - ![GitHub Logo](../../figures/FileSystem/filesystemfilter.jpg) -### FileSystem的火焰图功能 -点击FileSystem Calltre左下角的柱状图的图标,会切换到火焰图页面。 + +- 裁剪 Callstack,点击 Callstack 上一个节点符号,再点击底部 Symbol Filter 按钮,则该符号自动被裁剪掉,同时将该节点往下所有的 Callstack 内容裁剪掉。 + +- 裁剪 Library,点击 Library Filter 按钮,则该库文件符号下所有的子节点也被裁剪。 +- 点击 Reset 按钮,将恢复选中的裁剪内容。 + +### FileSystem 功能的调用栈 Group 展示支持按条件过滤 + +在 Input Filter 输入关键字,会显示出带有该关键字的展示信息。 +![GitHub Logo](../../figures/FileSystem/FileSysteminputfilter.jpg) + +### FileSystem 辅助信息区展示调用栈 + +当在详细信息区选择一个符号时,将展示与该符号相关的完整的调用栈。如下图的 Heaviest Stack Trace: +![GitHub Logo](../../figures/FileSystem/FileSystemheaviesttrace.jpg) + +### FileSystem 的事件类型的过滤 + +通过选择可以过滤是 Open 类型,还是 Close 类型事件。 +![GitHub Logo](../../figures/FileSystem/filesystemfilter.jpg) + +### FileSystem 的火焰图功能 + +点击 FileSystem Calltre 左下角的柱状图的图标,会切换到火焰图页面。 ![GitHub Logo](../../figures/FileSystem/FileSystemflame.jpg) -进入到火焰图页面,火焰图的展示跟Callinfo的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和Duration时长。 +进入到火焰图页面,火焰图的展示跟 Callinfo 的 tab 页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和 Duration 时长。 ![GitHub Logo](../../figures/FileSystem/FileSystemflameshow.jpg) 鼠标左键火焰图,会进入下一级界面,右键回到上一级。 ![GitHub Logo](../../figures/FileSystem/FileSystemflamelevel.jpg) - diff --git a/ide/src/doc/md/quickstart_hilog.md b/ide/src/doc/md/quickstart_hilog.md new file mode 100644 index 0000000000000000000000000000000000000000..622beb5d693b24474fc4005dcd70ab1e514daace --- /dev/null +++ b/ide/src/doc/md/quickstart_hilog.md @@ -0,0 +1,22 @@ +# Hilog抓取和展示说明 +Hilog分析模块主要展示系统日志信息。 +## Hilog的抓取 +#### Hilog的抓取配置参数 +打开Hilog开关抓取taskpool数据。 +![GitHub Logo](../../figures/Hilog/hilogconfig.jpg) +### Hilog展示说明 +将抓取的hilog文件导入到smartperf中,查看日志信息。 +![GitHub Logo](../../figures/Hilog/hilogrow.jpg) +### Hilog泳道图的框选功能 +框选Hilog的泳道图,展示Hilog的tab页,Log Level可以选择日志级别,也能根据Tag,Process name,Message去搜索。 +![GitHub Logo](../../figures/Hilog/hilogtab.jpg) ++ Timestamp: 时间戳信息。 ++ Time: 日志的显示时间。 ++ Level:日志级别。 ++ Tag:日志的tag。 ++ Process name:进程名。 ++ Message:日志具体信息。 +框选Hilog的泳道图,展示Summary的tab页。 +![GitHub Logo](../../figures/Hilog/hilogsummarytab.jpg) ++ Level/Process/Tag/Message: 根据类别显示日志。 ++ Count: 各级别日志的条数。 \ No newline at end of file diff --git a/ide/src/doc/md/quickstart_hiperf.md b/ide/src/doc/md/quickstart_hiperf.md index 2f3c80bfc25ec28a17e81f5a275a9b49365317fd..467a02e55bef2b29a2733cf75de9efe87130a36a 100644 --- a/ide/src/doc/md/quickstart_hiperf.md +++ b/ide/src/doc/md/quickstart_hiperf.md @@ -1,79 +1,102 @@ -# HiPerf的抓取和展示说明 -HiPerf工具是对系统性能数据进行采样记录,并将采样数据保存为文件,进行读取,展示分析。 -## HiPerf的抓取 -### HiPerf抓取配置参数 +# HiPerf 的抓取和展示说明 + +HiPerf 工具是对系统性能数据进行采样记录,并将采样数据保存为文件,进行读取,展示分析。 + +## HiPerf 的抓取 + +### HiPerf 抓取配置参数 + ![GitHub Logo](../../figures/perf/perfsetting.jpg) 配置项说明: -+ Start Hiperf Sampling:配置项的总开关。 -+ Process:离线模式下配置的是整个系统的。 -+ Frequency:配置抓取的频率。 -+ Call Stack:配置抓取的堆栈类型。 -+ Advance Options:更多的抓取配置项。 -再点击Record setting,在output file path输入文件名hiprofiler_data_perf.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 -![GitHub Logo](../../figures/perf/perfset.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 -![GitHub Logo](../../figures/perf/perfcommand.jpg) -输入hdc_shell,进入设备,执行命令。 -![GitHub Logo](../../figures/perf/perfexcutecommand.jpg) -执行完成后,进入指定目录查看,在/data/local/tmp下就会生成trace文件。 -![GitHub Logo](../../figures/perf/perffile.jpg) -### HiPerf展示说明 -将抓取的trace文件导入smartperf界面查看。 + +- Start Hiperf Sampling:配置项的总开关。 +- Process:离线模式下配置的是整个系统的。 +- Frequency:配置抓取的频率。 +- Call Stack:配置抓取的堆栈类型。 +- Advance Options:更多的抓取配置项。 + 再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_perf.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 + ![GitHub Logo](../../figures/perf/perfset.jpg) + 点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 + ![GitHub Logo](../../figures/perf/perfcommand.jpg) + 输入 hdc_shell,进入设备,执行命令。 + ![GitHub Logo](../../figures/perf/perfexcutecommand.jpg) + 执行完成后,进入指定目录查看,在/data/local/tmp 下就会生成 trace 文件。 + ![GitHub Logo](../../figures/perf/perffile.jpg) + +### HiPerf 展示说明 + +将抓取的 trace 文件导入 smartperf 界面查看。 ![GitHub Logo](../../figures/perf/summary.jpg) -界面布局介绍:Perf整体界面布局分为3个部分: -+ 红色区域:泳道图。 -+ 绿色区域:详细信息(Perf Profile和Sample List)。 -+ 黄色区域:辅助信息(Callstack)。 +界面布局介绍:Perf 整体界面布局分为 3 个部分: -### HiPerf泳道图展示 -Perf泳道图展示按照CPU使用量和线程和进程展示,鼠标移动到泳道图上,悬浮框会显示CPU的使用量。 +- 红色区域:泳道图。 +- 绿色区域:详细信息(Perf Profile和Sample List)。 +- 黄色区域:辅助信息(Callstack)。 + +### HiPerf 泳道图展示 + +Perf 泳道图展示按照 CPU 使用量和线程和进程展示,鼠标移动到泳道图上,悬浮框会显示 CPU 的使用量。 ![GitHub Logo](../../figures/perf/chart.jpg) -按住w键放大界面,泳道图会出现P的标志,鼠标移动到P图标上,悬浮框会显示每个callstack和调用的深度如下图。 +按住 w 键放大界面,泳道图会出现 P 的标志,鼠标移动到 P 图标上,悬浮框会显示每个 callstack 和调用的深度如下图。 ![GitHub Logo](../../figures/perf/callstack.jpg) -### HiPerf泳道图的框选功能 -可以对CPU使用量区,线程和进程区数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有两个tab页。 -Perf Profile的Tab页如图: + +### HiPerf 泳道图的框选功能 + +可以对 CPU 使用量区,线程和进程区数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有两个 tab 页。 +Perf Profile 的 Tab 页如图: ![GitHub Logo](../../figures/perf/PerfProfile.jpg) -+ Call Stack:为经过符号解析后的Callstack,并且给出动态链接库或者进程名的信息。 -+ Local:为该调用方法自身占用的CPU时间。 -+ Weight:调用方法的执行次数和占比。 -Sample List的Tab页如图: -![GitHub Logo](../../figures/perf/Samplelist.jpg) -+ Sample Time:采样的时间戳信息。 -+ Core:当前的CPU核信息。 -+ Process:进程名。 -+ Thread:线程名。 -+ State:运行状态。 -+ Backtrace:栈顶的调用栈名称。 - -### HiPerf支持多种Options展示风格 -点击Perf Profile的Tab页底部的Options,会有两个CheckBox复选框。 + +- Call Stack:为经过符号解析后的Callstack,并且给出动态链接库或者进程名的信息。 +- Local:为该调用方法自身占用的CPU时间。 +- Weight:调用方法的执行次数和占比。 + Sample List 的 Tab 页如图: + ![GitHub Logo](../../figures/perf/Samplelist.jpg) +- Sample Time:采样的时间戳信息。 +- Core:当前的CPU核信息。 +- Process:进程名。 +- Thread:线程名。 +- State:运行状态。 +- Backtrace:栈顶的调用栈名称。 + +### HiPerf 支持多种 Options 展示风格 + +点击 Perf Profile 的 Tab 页底部的 Options,会有两个 CheckBox 复选框。 ![GitHub Logo](../../figures/perf/Options.jpg) -+ Invert:反向输出调用树。 -+ Hide System so:隐藏系统库文件。 -### HiPerf支持过滤调用栈调用次数的展示风格 -点击Perf Profile的Tab页底部的Sample Counter Filter,可以填上区间值。过滤出符合该区间值调用次数的调用栈信息。 + +- Invert:反向输出调用树。 +- Hide System so:隐藏系统库文件。 + +### HiPerf 支持过滤调用栈调用次数的展示风格 + +点击 Perf Profile 的 Tab 页底部的 Sample Counter Filter,可以填上区间值。过滤出符合该区间值调用次数的调用栈信息。 ![GitHub Logo](../../figures/perf/samplecounter.jpg) -### HiPerf功能的调用栈Group展示-数据分析支持剪裁功能 +### HiPerf 功能的调用栈 Group 展示-数据分析支持剪裁功能 + ![GitHub Logo](../../figures/perf/datamining.jpg) -+ 裁剪Callstack,点击Callstack上一个节点符号,再点击底部Symbol Filter按钮,则该符号自动被裁剪掉,同时将该节点往下所有的Callstack内容裁剪掉。 - -+ 裁剪Library,点击Library Filter按钮,则该库文件符号下所有的子节点也被裁剪。 -+ 点击Reset按钮,将恢复选中的裁剪内容。 -### HiPerf功能的调用栈Group展示支持按条件过滤 -在Input Filter输入关键字,会显示出带有该关键字的展示信息。 - ![GitHub Logo](../../figures/perf/inputfilter.jpg) -### HiPerf辅助信息区展示调用栈 -当在详细信息区选择一个符号时,将展示与该符号相关的完整的调用栈。对上展示到根节点,对下则展示CPU占用率最大的调用栈。调用栈右侧有Sliding bar可以滚动。 -如下图的Heaviest Stack Trace: - ![GitHub Logo](../../figures/perf/heaviesttrace1.jpg) -### HiPerf的火焰图功能 -点击Perf Profile左下角的柱状图的图标,会切换到火焰图页面。 + +- 裁剪 Callstack,点击 Callstack 上一个节点符号,再点击底部 Symbol Filter 按钮,则该符号自动被裁剪掉,同时将该节点往下所有的 Callstack 内容裁剪掉。 + +- 裁剪 Library,点击 Library Filter 按钮,则该库文件符号下所有的子节点也被裁剪。 +- 点击 Reset 按钮,将恢复选中的裁剪内容。 + +### HiPerf 功能的调用栈 Group 展示支持按条件过滤 + +在 Input Filter 输入关键字,会显示出带有该关键字的展示信息。 +![GitHub Logo](../../figures/perf/inputfilter.jpg) + +### HiPerf 辅助信息区展示调用栈 + +当在详细信息区选择一个符号时,将展示与该符号相关的完整的调用栈。对上展示到根节点,对下则展示 CPU 占用率最大的调用栈。调用栈右侧有 Sliding bar 可以滚动。 +如下图的 Heaviest Stack Trace: +![GitHub Logo](../../figures/perf/heaviesttrace1.jpg) + +### HiPerf 的火焰图功能 + +点击 Perf Profile 左下角的柱状图的图标,会切换到火焰图页面。 ![GitHub Logo](../../figures/perf/flame.jpg) -进入到火焰图页面,火焰图的展示跟Callinfo的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和count大小。 +进入到火焰图页面,火焰图的展示跟 Callinfo 的 tab 页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和 count 大小。 ![GitHub Logo](../../figures/perf/flameshow.jpg) 鼠标左键火焰图,会进入下一级界面,右键回到上一级。 ![GitHub Logo](../../figures/perf/flamelevel2.jpg) - diff --git a/ide/src/doc/md/quickstart_hisystemevent.md b/ide/src/doc/md/quickstart_hisystemevent.md index 618941ffcbde7f1d077135ca4bf29da71258b947..d182575fa0bbe4f09e86fa09fe849a1c928f2b7c 100644 --- a/ide/src/doc/md/quickstart_hisystemevent.md +++ b/ide/src/doc/md/quickstart_hisystemevent.md @@ -1,81 +1,92 @@ -# HiSystemEvent的抓取和展示说明 - HiSystemEvent应用功耗模块主要是展示应用的各个子类别功耗占比信息、应用的资源申请使用记录信息、应用功耗异常事件信息、功耗关联系统状态信息。 -## HiSystemEvent的抓取 -### HiSystemEvent抓取配置参数 -打开Start Hisystem Event Tracker Record开关抓取HiSystemEvent数据。 +# HiSystemEvent 的抓取和展示说明 + +HiSystemEvent 应用功耗模块主要是展示应用的各个子类别功耗占比信息、应用的资源申请使用记录信息、应用功耗异常事件信息、功耗关联系统状态信息。 + +## HiSystemEvent 的抓取 + +### HiSystemEvent 抓取配置参数 + +打开 Start Hisystem Event Tracker Record 开关抓取 HiSystemEvent 数据。 ![GitHub Logo](../../figures/HiSystemEvent/hisyseventsetting.jpg) -再点击Record setting,在output file path输入文件名hiprofiler_data_hisystemevent.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 +再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_hisystemevent.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 ![GitHub Logo](../../figures/HiSystemEvent/hisystemeventrecord.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 +点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 ![GitHub Logo](../../figures/HiSystemEvent/hisystemcommand.jpg) -输入hdc_std shell,进入设备,执行上述生成的命令。 +输入 hdc_std shell,进入设备,执行上述生成的命令。 ![GitHub Logo](../../figures/HiSystemEvent/hisystemeventemexcute.jpg) -执行完成后,进入指定目录查看,在/data/local/tmp下就会生成trace文件。 +执行完成后,进入指定目录查看,在/data/local/tmp 下就会生成 trace 文件。 ![GitHub Logo](../../figures/HiSystemEvent/hisystemeventfile.jpg) -### HiSystemEvent展示说明 -### HiSystemEvent泳道图展示 -将抓取的trace文件导入smartperf界面查看。 + +### HiSystemEvent 展示说明 + +### HiSystemEvent 泳道图展示 + +将抓取的 trace 文件导入 smartperf 界面查看。 ![GitHub Logo](../../figures/HiSystemEvent/hisystemeventsummary.jpg) 泳道图说明: -+ Anomaly Event泳道: 显示系统异常和应用异常的ToolTip。 -+ System Event泳道: 以条状图显示,红色代表后台任务(WORKSCHEDULER),黄色代表应用锁(POWER),蓝色代表GPS定位(LOCATION)。 -+ Power泳道:应用各个子类的功耗柱状图、折现图以及应用各个子类绘制的图例,鼠标的悬浮可以显示出各个子类功耗的具体值。 -+ Brightness Nit泳道:鼠标悬浮可以显示屏幕亮度值。 -+ Wifi Event Received泳道:鼠标悬浮可以显示WiFi信号强度值。 -+ Audio Stream Change泳道:鼠标悬浮可以显示Audio状态(AUDIO_STREAM_CHANGE事件)。 -+ Audio Volume Change泳道:鼠标悬浮可以显示Audio状态(AUDIO_VOLUME_CHANGE事件)。 -+ Wifi State泳道:鼠标悬浮可以显示wifi开关状态(enable:开,disable:关)。 -+ Bluetooth Br Switch State泳道:鼠标悬浮可以显示蓝牙开关状态(enable:开, disable:关)。 -+ Location Switch State泳道:鼠标悬浮可以显示GPS开关状态(enable:开,disable:关)。 -### HiSystemEvent泳道图的框选功能 -可以对Energy各泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格。 -System Details的Tab页如图: + +- Anomaly Event泳道: 显示系统异常和应用异常的ToolTip。 +- System Event泳道: 以条状图显示,红色代表后台任务(WORKSCHEDULER),黄色代表应用锁(POWER),蓝色代表GPS定位(LOCATION)。 +- Power泳道:应用各个子类的功耗柱状图、折现图以及应用各个子类绘制的图例,鼠标的悬浮可以显示出各个子类功耗的具体值。 +- Brightness Nit泳道:鼠标悬浮可以显示屏幕亮度值。 +- Wifi Event Received泳道:鼠标悬浮可以显示WiFi信号强度值。 +- Audio Stream Change泳道:鼠标悬浮可以显示Audio状态(AUDIO_STREAM_CHANGE事件)。 +- Audio Volume Change泳道:鼠标悬浮可以显示Audio状态(AUDIO_VOLUME_CHANGE事件)。 +- Wifi State泳道:鼠标悬浮可以显示wifi开关状态(enable:开,disable:关)。 +- Bluetooth Br Switch State泳道:鼠标悬浮可以显示蓝牙开关状态(enable:开, disable:关)。 +- Location Switch State泳道:鼠标悬浮可以显示GPS开关状态(enable:开,disable:关)。 + +### HiSystemEvent 泳道图的框选功能 + +可以对 Energy 各泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格。 +System Details 的 Tab 页如图: ![GitHub Logo](../../figures/HiSystemEvent/hisystemdetails.jpg) -+ Event Name: 事件名称,事件包括后台任务,应用锁,GPS定位。 -+ Time: 时间戳信息。 -点击事件名会显示该事件的详细信息的Tab页。 -![GitHub Logo](../../figures/HiSystemEvent/systemselectdetals.jpg) -+ EVENT_NAME:事件名称。 -+ PID:应用PID。 -+ UID:应用UID。 -+ TYPE:类型。 -+ STATE:状态值。 -+ LOG_LEVEL:日志级别。 -+ NAME:NAME信息。 -+ MESSAGE:MESSAGE信息。 -+ TAG:锁名。 -Power Battery的Tab页如图: -![GitHub Logo](../../figures/HiSystemEvent/hisyseventPowerBattery.jpg) -+ Gas Gauge: 电池电量。 -+ Charge:充电状态。 -+ Screen:屏幕状态。 -+ Level:电池百分比。 -+ Current:电池电流。 -+ Capacity:电池容量。 -+ APP Name:应用包名。 -Power Details的Tab页如图: -![GitHub Logo](../../figures/HiSystemEvent/hisyseventPowerdetails.jpg) -+ UID: 应用UID。 -+ Charge:充电状态。 -+ Foreground Duration(ms):前台使用时长。 -+ Foreground Energy(mAs):前台使用功耗值。 -+ Background Duration(ms):后台使用时长。 -+ Background Energy(mAs):后台使用功耗值。 -+ Screen On Duration(ms):亮屏使用时长。 -+ Screen On Energy(mAs):亮屏使用功耗值。 -+ Screen Off Duration(ms):灭屏使用时长。 -+ Screen Off Energy(mAs):灭屏使用功耗值。 -+ Foreground Count:应用前台扫描次数。 -+ Background Count:应用后台扫描次数。 -+ Screen On Count:应用亮屏扫描次数。 -+ Screen Off Count:应用灭屏扫描次数。 -+ Background Time(ms):灭屏使用功耗值。 -+ Screen On Time(ms):应用亮屏使用时长。 -+ Screen Off Time(ms):应用灭屏使用时长。 -+ Energy(mAs):功耗值。 -+ Load(%):占用率。 -+ Usage(ms):应用使用时长。 -+ Duration(ms):持续时长。 -+ Camera Id:Camera类型,0:后置,1:前置。 -+ Count:应用个数。 -+ Energy Percent(%):功耗占比。 \ No newline at end of file + +- Event Name: 事件名称,事件包括后台任务,应用锁,GPS定位。 +- Time: 时间戳信息。 + 点击事件名会显示该事件的详细信息的 Tab 页。 + ![GitHub Logo](../../figures/HiSystemEvent/systemselectdetals.jpg) +- EVENT_NAME:事件名称。 +- PID:应用PID。 +- UID:应用UID。 +- TYPE:类型。 +- STATE:状态值。 +- LOG_LEVEL:日志级别。 +- NAME:NAME信息。 +- MESSAGE:MESSAGE信息。 +- TAG:锁名。 + Power Battery 的 Tab 页如图: + ![GitHub Logo](../../figures/HiSystemEvent/hisyseventPowerBattery.jpg) +- Gas Gauge: 电池电量。 +- Charge:充电状态。 +- Screen:屏幕状态。 +- Level:电池百分比。 +- Current:电池电流。 +- Capacity:电池容量。 +- APP Name:应用包名。 + Power Details 的 Tab 页如图: + ![GitHub Logo](../../figures/HiSystemEvent/hisyseventPowerdetails.jpg) +- UID: 应用UID。 +- Charge:充电状态。 +- Foreground Duration(ms):前台使用时长。 +- Foreground Energy(mAs):前台使用功耗值。 +- Background Duration(ms):后台使用时长。 +- Background Energy(mAs):后台使用功耗值。 +- Screen On Duration(ms):亮屏使用时长。 +- Screen On Energy(mAs):亮屏使用功耗值。 +- Screen Off Duration(ms):灭屏使用时长。 +- Screen Off Energy(mAs):灭屏使用功耗值。 +- Foreground Count:应用前台扫描次数。 +- Background Count:应用后台扫描次数。 +- Screen On Count:应用亮屏扫描次数。 +- Screen Off Count:应用灭屏扫描次数。 +- Background Time(ms):灭屏使用功耗值。 +- Screen On Time(ms):应用亮屏使用时长。 +- Screen Off Time(ms):应用灭屏使用时长。 +- Energy(mAs):功耗值。 +- Load(%):占用率。 +- Usage(ms):应用使用时长。 +- Duration(ms):持续时长。 +- Camera Id:Camera类型,0:后置,1:前置。 +- Count:应用个数。 +- Energy Percent(%):功耗占比。 diff --git a/ide/src/doc/md/quickstart_memory_template.md b/ide/src/doc/md/quickstart_memory_template.md index d994f5a0c738ea70496106a5aa4f8f18079c5055..ed0c12baad7677df8d167ec3461482b6267278d1 100644 --- a/ide/src/doc/md/quickstart_memory_template.md +++ b/ide/src/doc/md/quickstart_memory_template.md @@ -1,148 +1,167 @@ # 系统内存抓取和展示说明 + 系统内存分析模板帮助系统内存调优人员进行进程内存拆解。 + ## 系统内存的抓取 + #### 系统内存的抓取配置参数 -打开VM Tracker开关抓取内存数据。 + +打开 VM Tracker 开关抓取内存数据。 ![GitHub Logo](../../figures/Allmemory/allmemorycofig.jpg) + ### 系统内存展示说明 -将抓取的内存文件导入到smartperf中,查看进程内存的情况。 + +将抓取的内存文件导入到 smartperf 中,查看进程内存的情况。 ![GitHub Logo](../../figures/Allmemory/allmemoryrow.jpg) -### 系统内存中Ability Monitor泳道图显示 -Ability Monitor泳道图分为MemoryTotal,Cached,SwapTotal,System Purgeable Total,System Purgeable Pin,DMA,Skia Gpu Memory泳道。 + +### 系统内存中 Ability Monitor 泳道图显示 + +Ability Monitor 泳道图分为 MemoryTotal,Cached,SwapTotal,System Purgeable Total,System Purgeable Pin,DMA,Skia Gpu Memory 泳道。 ![GitHub Logo](../../figures/Allmemory/abrow.jpg) -### 系统内存中Ability Monitor泳道图点选功能 -System Purgeable Total泳道图点选功能。 + +### 系统内存中 Ability Monitor 泳道图点选功能 + +System Purgeable Total 泳道图点选功能。 ![GitHub Logo](../../figures/Allmemory/purtotalselect.jpg) -+ TimeStamp:时间戳。 -+ ActivePurg:当前时间点的ActivePurg内存。 -+ InActivePurg:当前时间点的InActivePurg内存。 -+ ShmPurg:当前时间点的ShmPurg内存。 -System Purgeable Total泳道图框选功能。 -![GitHub Logo](../../figures/Allmemory/purtotaldrag.jpg) -+ Type:内存的类别。 -+ AvgSize:当前内存的平均值。 -+ MaxSize:当前内存的最大值。 -+ MinSize:当前内存的最小值。 -System Purgeable Pin泳道图点选功能。 -![GitHub Logo](../../figures/Allmemory/purpinselect.jpg) -+ TimeStamp:时间戳。 -+ PinedPurg:当前时间点的PinedPurg内存。 -+ ShmPurg:当前时间点的ShmPurg内存。 -System Purgeable Pin泳道图框选功能。 -![GitHub Logo](../../figures/Allmemory/purpindrag.jpg) -+ Type:内存的类别。 -+ AvgSize:当前内存的平均值。 -+ MaxSize:当前内存的最大值。 -+ MinSize:当前内存的最小值。 -DMA泳道图点选功能。 -![GitHub Logo](../../figures/Allmemory/dmaselect.jpg) -+ TimeStamp:时间戳。 -+ Process(pid):进程名(进程ID)。 -+ Fd:DMA内存文件描述符。 -+ Size:DMA内存大小。 -+ Ino:Ino值。 -+ ExpPid:申请者的进程号。 -+ ExpTaskComm:ExpTaskComm的值。 -+ BufName:DMA内存名。 -+ ExpName:申请者的进程名。 -+ Flag:去重标记,0表示正常,1表示进程内部重复数据,2表示进程间重复数据。 -DMA泳道图框选功能。 -![GitHub Logo](../../figures/Allmemory/dmadrag.jpg) -+ Process(pid):进程名(进程ID)。 -+ SumSize:DMA内存总量。 -+ AvgSize:DMA内存的平均值。 -+ MaxSize:DMA内存的最大值。 -+ MinSize:DMA内存的最小值。 -Skia Gpu Memory泳道图点选功能。 -![GitHub Logo](../../figures/Allmemory/sgpumemselect.jpg) -+ TimeStamp:时间戳。 -+ GpuName:Gpu名称。 -+ Process(pid):进程名(进程ID)。。 -+ Size:对应进程的Gpu的使用size。 -Skia Gpu Memory泳道图框选功能。 -![GitHub Logo](../../figures/Allmemory/sgpumemdrag.jpg) -+ GpuName:Gpu名称。 -+ Process(pid):进程名(进程ID)。 -+ SumSize:Gpu内存总量。 -+ AvgSize:Gpu内存的平均值。 -+ MaxSize:Gpu内存的最大值。 -+ MinSize:Gpu内存的最小值。 -### VM Tracker下的smaps泳道图展示 -smaps泳道图分为Dirty,Swapped,RSS,PSS,USS泳道图。 + +- TimeStamp:时间戳。 +- ActivePurg:当前时间点的ActivePurg内存。 +- InActivePurg:当前时间点的InActivePurg内存。 +- ShmPurg:当前时间点的ShmPurg内存。 + System Purgeable Total 泳道图框选功能。 + ![GitHub Logo](../../figures/Allmemory/purtotaldrag.jpg) +- Type:内存的类别。 +- AvgSize:当前内存的平均值。 +- MaxSize:当前内存的最大值。 +- MinSize:当前内存的最小值。 + System Purgeable Pin 泳道图点选功能。 + ![GitHub Logo](../../figures/Allmemory/purpinselect.jpg) +- TimeStamp:时间戳。 +- PinedPurg:当前时间点的PinedPurg内存。 +- ShmPurg:当前时间点的ShmPurg内存。 + System Purgeable Pin 泳道图框选功能。 + ![GitHub Logo](../../figures/Allmemory/purpindrag.jpg) +- Type:内存的类别。 +- AvgSize:当前内存的平均值。 +- MaxSize:当前内存的最大值。 +- MinSize:当前内存的最小值。 + DMA 泳道图点选功能。 + ![GitHub Logo](../../figures/Allmemory/dmaselect.jpg) +- TimeStamp:时间戳。 +- Process(pid):进程名(进程ID)。 +- Fd:DMA内存文件描述符。 +- Size:DMA内存大小。 +- Ino:Ino值。 +- ExpPid:申请者的进程号。 +- ExpTaskComm:ExpTaskComm的值。 +- BufName:DMA内存名。 +- ExpName:申请者的进程名。 +- Flag:去重标记,0表示正常,1表示进程内部重复数据,2表示进程间重复数据。 + DMA 泳道图框选功能。 + ![GitHub Logo](../../figures/Allmemory/dmadrag.jpg) +- Process(pid):进程名(进程ID)。 +- SumSize:DMA内存总量。 +- AvgSize:DMA内存的平均值。 +- MaxSize:DMA内存的最大值。 +- MinSize:DMA内存的最小值。 + Skia Gpu Memory 泳道图点选功能。 + ![GitHub Logo](../../figures/Allmemory/sgpumemselect.jpg) +- TimeStamp:时间戳。 +- GpuName:Gpu名称。 +- Process(pid):进程名(进程ID)。。 +- Size:对应进程的Gpu的使用size。 + Skia Gpu Memory 泳道图框选功能。 + ![GitHub Logo](../../figures/Allmemory/sgpumemdrag.jpg) +- GpuName:Gpu名称。 +- Process(pid):进程名(进程ID)。 +- SumSize:Gpu内存总量。 +- AvgSize:Gpu内存的平均值。 +- MaxSize:Gpu内存的最大值。 +- MinSize:Gpu内存的最小值。 + +### VM Tracker 下的 smaps 泳道图展示 + +smaps 泳道图分为 Dirty,Swapped,RSS,PSS,USS 泳道图。 ![GitHub Logo](../../figures/Allmemory/smapsallrow.jpg) -### VM Tracker下的smaps泳道图的点选和框选功能 -点选和框选Dirty,Swapped,RSS,PSS,USS的5个泳道图中任一个显示的都是一样的内容,会显示Smaps Statistic和Smaps sample的tab页。 -Smaps Statistic的tab页展示。 + +### VM Tracker 下的 smaps 泳道图的点选和框选功能 + +点选和框选 Dirty,Swapped,RSS,PSS,USS 的 5 个泳道图中任一个显示的都是一样的内容,会显示 Smaps Statistic 和 Smaps sample 的 tab 页。 +Smaps Statistic 的 tab 页展示。 ![GitHub Logo](../../figures/Allmemory/sstaaticstab.jpg) -+ Type: 将抓取到的信息根据Type归类。 -+ Path:虚拟内存块路径,类型中有多个则显示multiple。 -+ Size:在该虚拟内存块路径下内存的size总和。 -+ % of Res: 每行的Resident Size 占总Ressident Size的比例。 -+ Count:统计的类型个数。 -+ Rss: smaps节点中Rss。 -+ Pss: smaps节点中Pss。 -+ SharedClean: smaps节点中SharedClean。 -+ SharedDirty:smaps节点中Shared_Dirty。 -+ PrivateClean: smaps节点中PrivateClean。 -+ PrivateDirty:smaps节点中PrivateDirty。 -+ Swap:smaps节点中Swap。 -+ SwapPss:smaps节点中SwapPss。 -Smaps sample的tab页展示。 -![GitHub Logo](../../figures/Allmemory/ssampletab.jpg) -+ TimeStamp: 时间戳信息。 -+ Type: 将抓取到的信息根据Type归类。 -+ Path:虚拟内存块路径,类型中有多个则显示multiple。 -+ Address Range:每段虚拟内存段的开始和结束位置。 -+ Rss: smaps节点中Rss。 -+ Pss: smaps节点中Pss。 -+ SharedClean: smaps节点中SharedClean。 -+ SharedDirty:smaps节点中Shared_Dirty。 -+ PrivateClean: smaps节点中PrivateClean。 -+ PrivateDirty:smaps节点中PrivateDirty。 -+ Swap:smaps节点中Swap。 -+ SwapPss:smaps节点中SwapPss。 -+ Reside: Rss / Size 比值。 -+ Protection: 内存块的权限(读写执行执行)。 -### VM Tracker下的GPU泳道图展示 -smaps泳道图分为GL,Skia Gpu Dump Toal,Skia Gpu Dump Window,Skia Gpu Memory泳道图。 + +- Type: 将抓取到的信息根据Type归类。 +- Path:虚拟内存块路径,类型中有多个则显示multiple。 +- Size:在该虚拟内存块路径下内存的size总和。 +- % of Res: 每行的Resident Size 占总Ressident Size的比例。 +- Count:统计的类型个数。 +- Rss: smaps节点中Rss。 +- Pss: smaps节点中Pss。 +- SharedClean: smaps节点中SharedClean。 +- SharedDirty:smaps节点中Shared_Dirty。 +- PrivateClean: smaps节点中PrivateClean。 +- PrivateDirty:smaps节点中PrivateDirty。 +- Swap:smaps节点中Swap。 +- SwapPss:smaps节点中SwapPss。 + Smaps sample 的 tab 页展示。 + ![GitHub Logo](../../figures/Allmemory/ssampletab.jpg) +- TimeStamp: 时间戳信息。 +- Type: 将抓取到的信息根据Type归类。 +- Path:虚拟内存块路径,类型中有多个则显示multiple。 +- Address Range:每段虚拟内存段的开始和结束位置。 +- Rss: smaps节点中Rss。 +- Pss: smaps节点中Pss。 +- SharedClean: smaps节点中SharedClean。 +- SharedDirty:smaps节点中Shared_Dirty。 +- PrivateClean: smaps节点中PrivateClean。 +- PrivateDirty:smaps节点中PrivateDirty。 +- Swap:smaps节点中Swap。 +- SwapPss:smaps节点中SwapPss。 +- Reside: Rss / Size 比值。 +- Protection: 内存块的权限(读写执行执行)。 + +### VM Tracker 下的 GPU 泳道图展示 + +smaps 泳道图分为 GL,Skia Gpu Dump Toal,Skia Gpu Dump Window,Skia Gpu Memory 泳道图。 ![GitHub Logo](../../figures/Allmemory/gpurow.jpg) -Skia Gpu Memory泳道图点选功能。 +Skia Gpu Memory 泳道图点选功能。 ![GitHub Logo](../../figures/Allmemory/vgpumemselect.jpg) -+ TimeStamp:时间戳。 -+ GpuName:Gpu名称。 -+ Thread(tid):线程名(线程ID)。 -+ Size:对应线程的Gpu的使用size。 -Skia Gpu Memory泳道图框选功能。 -![GitHub Logo](../../figures/Allmemory/vgpumemdrag.jpg) -+ GpuName:Gpu名称。 -+ Thread(tid):线程名(线程ID)。 -+ SumSize:Gpu内存总量。 -+ AvgSize:Gpu内存的平均值。 -+ MaxSize:Gpu内存的最大值。 -+ MinSize:Gpu内存的最小值。 -Gl泳道图框选功能。 -![GitHub Logo](../../figures/Allmemory/vglrag.jpg) -+ TimeStamp:时间戳。 -+ GL_PSS:GL_PSS的大小。 -Skia Gpu Dump Toal泳道图点选功能。 -![GitHub Logo](../../figures/Allmemory/vgputotalselect.jpg) -+ Module / Category:模块/目录。 -+ Size:按照模块/目录显示size大小。 -Skia Gpu Dump Toal泳道图框选功能。 -![GitHub Logo](../../figures/Allmemory/vgputotaldrag.jpg) -+ TimeStamp:时间戳。 -+ Module / Category:模块/目录。 -+ AvgSize:对应模块/目录下size的平均值。 -+ MaxSize:对应模块/目录下size的最大值。 -+ MinSize:对应模块/目录下size的最小值。 -Skia Gpu Dump Window泳道图点选功能。 -![GitHub Logo](../../figures/Allmemory/vgpuwindowselect.jpg) -+ Window / Module / Category:窗口/模块/目录。 -+ Size:按照窗口/模块/目录显示size大小。 -Skia Gpu Dump Window泳道图框选功能。 -![GitHub Logo](../../figures/Allmemory/vgpuwindowdrag.jpg) -+ TimeStamp:时间戳。 -+ Window / Module / Category:窗口/模块/目录。 -+ AvgSize:对应窗口/模块/目录下size的平均值。 -+ MaxSize:对应窗口/模块/目录下size的最大值。 -+ MinSize:对应窗口/模块/目录下size的最小值。 \ No newline at end of file + +- TimeStamp:时间戳。 +- GpuName:Gpu名称。 +- Thread(tid):线程名(线程ID)。 +- Size:对应线程的Gpu的使用size。 + Skia Gpu Memory 泳道图框选功能。 + ![GitHub Logo](../../figures/Allmemory/vgpumemdrag.jpg) +- GpuName:Gpu名称。 +- Thread(tid):线程名(线程ID)。 +- SumSize:Gpu内存总量。 +- AvgSize:Gpu内存的平均值。 +- MaxSize:Gpu内存的最大值。 +- MinSize:Gpu内存的最小值。 + Gl 泳道图框选功能。 + ![GitHub Logo](../../figures/Allmemory/vglrag.jpg) +- TimeStamp:时间戳。 +- GL_PSS:GL_PSS的大小。 + Skia Gpu Dump Toal 泳道图点选功能。 + ![GitHub Logo](../../figures/Allmemory/vgputotalselect.jpg) +- Module / Category:模块/目录。 +- Size:按照模块/目录显示size大小。 + Skia Gpu Dump Toal 泳道图框选功能。 + ![GitHub Logo](../../figures/Allmemory/vgputotaldrag.jpg) +- TimeStamp:时间戳。 +- Module / Category:模块/目录。 +- AvgSize:对应模块/目录下size的平均值。 +- MaxSize:对应模块/目录下size的最大值。 +- MinSize:对应模块/目录下size的最小值。 + Skia Gpu Dump Window 泳道图点选功能。 + ![GitHub Logo](../../figures/Allmemory/vgpuwindowselect.jpg) +- Window / Module / Category:窗口/模块/目录。 +- Size:按照窗口/模块/目录显示size大小。 + Skia Gpu Dump Window 泳道图框选功能。 + ![GitHub Logo](../../figures/Allmemory/vgpuwindowdrag.jpg) +- TimeStamp:时间戳。 +- Window / Module / Category:窗口/模块/目录。 +- AvgSize:对应窗口/模块/目录下size的平均值。 +- MaxSize:对应窗口/模块/目录下size的最大值。 +- MinSize:对应窗口/模块/目录下size的最小值。 diff --git a/ide/src/doc/md/quickstart_native_memory.md b/ide/src/doc/md/quickstart_native_memory.md index 497f5a36cdbf852b782bb03015f1a08056b1927c..b95b8d77f7ec92ce2752f01d35c830dc3f13c8e5 100644 --- a/ide/src/doc/md/quickstart_native_memory.md +++ b/ide/src/doc/md/quickstart_native_memory.md @@ -1,108 +1,131 @@ -# Native Memory抓取和展示说明 -Native Memory是查看内存的分配和释放等情况。 -## Native Memory的抓取 -### Native Memory抓取配置参数 +# Native Memory 抓取和展示说明 + +Native Memory 是查看内存的分配和释放等情况。 + +## Native Memory 的抓取 + +### Native Memory 抓取配置参数 + ![GitHub Logo](../../figures/NativeMemory/nativememorysetting.jpg) 配置参数说明: -* ProcessId or ProcessName:设置抓取的进程ID或者进程名,此处以输入com.ohos.mms进程名为例。 -* Max unwind level:抓取的栈的最大深度。 -* Shared Memory Size:native_daemon和native_hook进程之间存储数据的共享内存大小。 -* Filter Memory Size:只抓取大于该size的malloc数据(free不受影响)。 -* Use Fp Unwind:Fp回栈。 -* Use Record Accurately:不过滤数据,上报全量的。 -* Use Offline Symbolization:离线符号化。 -* Use Record Statistics:统计数据上报。 -* statistics interval:统计数据上报周期。 - -再点击Record setting,在output file path输入文件名hiprofiler_data_nativememory.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 + +- ProcessId or ProcessName:设置抓取的进程 ID 或者进程名,此处以输入 com.ohos.mms 进程名为例。 +- Max unwind level:抓取的栈的最大深度。 +- Shared Memory Size:native_daemon 和 native_hook 进程之间存储数据的共享内存大小。 +- Filter Memory Size:只抓取大于该 size 的 malloc 数据(free 不受影响)。 +- Use Fp Unwind:Fp 回栈。 +- Use Record Accurately:不过滤数据,上报全量的。 +- Use Offline Symbolization:离线符号化。 +- Use Record Statistics:统计数据上报。 +- statistics interval:统计数据上报周期。 + +再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_nativememory.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 ![GitHub Logo](../../figures/NativeMemory/nativememoryset.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 +点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 ![GitHub Logo](../../figures/NativeMemory/nativememorycommand.jpg) 命令行参数说明: -* save_file:是否将hook数据保存成文件,不上报protobuf形式数据给hiprofilerd。 -* filter_size:过滤malloc的大小,最小值是0,默认值是4096Byte。 -* smb_pages:nativedeamon与libnativehook间的共享内存大小。 -* max_stack_depth:最多回栈的层数,也就是抓取的栈的最大深度。 -* fp_unwind:是否进行fp回栈。 -* malloc_free_matching_interval:native_daemon从nativehook so的共享内存里取数据的间隔时间。 -* string_compressed:是否进行字符串压缩。 -* fp_unwind:fp回栈。 - -输入hdc_std shell,进入设备,执行命令。 + +- save_file:是否将 hook 数据保存成文件,不上报 protobuf 形式数据给 hiprofilerd。 +- filter_size:过滤 malloc 的大小,最小值是 0,默认值是 4096Byte。 +- smb_pages:nativedeamon 与 libnativehook 间的共享内存大小。 +- max_stack_depth:最多回栈的层数,也就是抓取的栈的最大深度。 +- fp_unwind:是否进行 fp 回栈。 +- malloc_free_matching_interval:native_daemon 从 nativehook so 的共享内存里取数据的间隔时间。 +- string_compressed:是否进行字符串压缩。 +- fp_unwind:fp 回栈。 + +输入 hdc_std shell,进入设备,执行命令。 ![GitHub Logo](../../figures/NativeMemory/nativeexcutecommand.jpg) -执行完成后,进入指定目录查看,在/data/local/tmp下就会生成trace文件。 +执行完成后,进入指定目录查看,在/data/local/tmp 下就会生成 trace 文件。 ![GitHub Logo](../../figures/NativeMemory/naitvememoryfile.jpg) -## Native Memory展示说明 -将抓取的nativememory文件导入到smartperf工具中查看,查看内存的分配和释放等情况。 -### Native Memory泳道图展示类型 + +## Native Memory 展示说明 + +将抓取的 nativememory 文件导入到 smartperf 工具中查看,查看内存的分配和释放等情况。 + +### Native Memory 泳道图展示类型 + 点击齿轮状的图标可以设置内存的展示单位。 ![GitHub Logo](../../figures/NativeMemory/NativeChart.jpg) -+ Current Bytes:以申请内存的size绘制泳道图。 -+ Native Memory Density:以申请内存的数量绘制泳道图。 -+ All Heap&AnonuymousVM:malloc分配和mmap分配的总量。 -+ All Heap:malloc分配的内存。 -+ All Anonymous VM:mmap分配的内存。 -### Native Memory泳道图的框选功能 -可以对内存的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有四个tab页。 -Statistics的Tab页,主要显示了统计明细类型。 + +- Current Bytes:以申请内存的size绘制泳道图。 +- Native Memory Density:以申请内存的数量绘制泳道图。 +- All Heap&AnonuymousVM:malloc分配和mmap分配的总量。 +- All Heap:malloc分配的内存。 +- All Anonymous VM:mmap分配的内存。 + +### Native Memory 泳道图的框选功能 + +可以对内存的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有四个 tab 页。 +Statistics 的 Tab 页,主要显示了统计明细类型。 ![GitHub Logo](../../figures/NativeMemory/Statistics.jpg) -+ Memory Type:内存的类型。 -+ Exsiting:框选区域内申请没有释放的大小。 -+ #Exsiting:框选区域内申请没有释放的次数。 -+ Transient:框选区域内释放的大小。 -+ #Transient:框选区域内释放的次数。 -+ Total Bytes:框选区间内申请的大小。 -+ #Total: 框选区间内申请的次数。 -+ Peak Value: 框选区间内内存申请的峰值。 -+ Exsiting/Total:框选区间内剩余的内存比上申请的内存,其中浅紫色是框选区间内申请的大小/整个时间轴(申请+释放的总大小),深紫色是框选区间内(申请+释放)的大小/整个时间轴(申请+释放的总大小)。 - -Call Info的Tab页,主要显示了调用树详细类型。 + +- Memory Type:内存的类型。 +- Exsiting:框选区域内申请没有释放的大小。 +- #Exsiting:框选区域内申请没有释放的次数。 +- Transient:框选区域内释放的大小。 +- #Transient:框选区域内释放的次数。 +- Total Bytes:框选区间内申请的大小。 +- #Total: 框选区间内申请的次数。 +- Peak Value: 框选区间内内存申请的峰值。 +- Exsiting/Total:框选区间内剩余的内存比上申请的内存,其中浅紫色是框选区间内申请的大小/整个时间轴(申请+释放的总大小),深紫色是框选区间内(申请+释放)的大小/整个时间轴(申请+释放的总大小)。 + +Call Info 的 Tab 页,主要显示了调用树详细类型。 ![GitHub Logo](../../figures/NativeMemory/CallInfo.jpg) -+ Symble Name:每个内存分配的调用栈。 -+ Size:分配的总大小。 -+ Count:相同调用栈出现的次数。 -Native Memory的Tab页,主要显示了单次分配信息列表。 -![GitHub Logo](../../figures/NativeMemory/NativeMemory.jpg) -+ Address:内存块的地址。 -+ Memory Type:内存分配的类型。 -+ Timestamp:时间戳信息。 -+ State:内存地址当前状态Existed 表示框选范围内未释放,Freed表示已释放。 -+ Size:该次申请分配内存的大小。 -+ Responsible Library :调用该函数的库。 -+ Responsible Caller :调用该函数的方法。 -Snapshot List的Tab页,主要显示了各时刻内存的增长的差值。 -![GitHub Logo](../../figures/NativeMemory/Snapshotlist.jpg) -+ Snapshot:标记的打点说明。 -+ Timestamp :时间戳信息。 -+ Net Growth :自从上次Snapshot的增长量,是计算的分配和释放的。 -+ Total Growth :自从上次Snapshot的增长量,是计算的每一次分配的。 -+ #Exsiting :仍然存在的内存数。 -### Native Memory的辅助信息功能 -在Call Info和Native Memory的Tab页,点击选中某一行,右边画红线处会显示出该行调用栈的树结构信息。 + +- Symble Name:每个内存分配的调用栈。 +- Size:分配的总大小。 +- Count:相同调用栈出现的次数。 + Native Memory 的 Tab 页,主要显示了单次分配信息列表。 + ![GitHub Logo](../../figures/NativeMemory/NativeMemory.jpg) +- Address:内存块的地址。 +- Memory Type:内存分配的类型。 +- Timestamp:时间戳信息。 +- State:内存地址当前状态Existed 表示框选范围内未释放,Freed表示已释放。 +- Size:该次申请分配内存的大小。 +- Responsible Library :调用该函数的库。 +- Responsible Caller :调用该函数的方法。 + Snapshot List 的 Tab 页,主要显示了各时刻内存的增长的差值。 + ![GitHub Logo](../../figures/NativeMemory/Snapshotlist.jpg) +- Snapshot:标记的打点说明。 +- Timestamp :时间戳信息。 +- Net Growth :自从上次Snapshot的增长量,是计算的分配和释放的。 +- Total Growth :自从上次Snapshot的增长量,是计算的每一次分配的。 +- #Exsiting :仍然存在的内存数。 + +### Native Memory 的辅助信息功能 + +在 Call Info 和 Native Memory 的 Tab 页,点击选中某一行,右边画红线处会显示出该行调用栈的树结构信息。 ![GitHub Logo](../../figures/NativeMemory/nativecallstack.jpg) -### Native Memory详细显示的过滤功能 -点击下方的All Allocations可以对Allocation的lifeSpan进行过滤,有三个选择:All Allocatios,Create & Exsiting,Create & Destroyed。 + +### Native Memory 详细显示的过滤功能 + +点击下方的 All Allocations 可以对 Allocation 的 lifeSpan 进行过滤,有三个选择:All Allocatios,Create & Exsiting,Create & Destroyed。 ![GitHub Logo](../../figures/NativeMemory/lifespan.jpg) -+ All Allocations:所有的内存。 -+ Created & Exsiting:创建且被存活的内存。 -+ Created & Destroyed: 创建且被销毁的内存。 -点击下方的All Heap&Anonymous可以对内存类型进行过滤。 -![GitHub Logo](../../figures/NativeMemory/AllocationType.jpg) -+ All Heap&AnonuymousVM:Heap和AnonuymousVM的总量。 -+ All Heap:malloc分配的内存。 -+ All Anonymous VM:mmap的匿名页。 -点击下方的Mark Snapshot可以在时间轴上打标签。出现小旗的标志,通过标注多个时间点。点击到Snapshot List标签页可以看到各个时间点的内存的增长值。 -![GitHub Logo](../../figures/NativeMemory/Generation.jpg) -### Native Memory的火焰图功能 -点击callinfo左下角的柱状图的图标,会切换到火焰图页面。 + +- All Allocations:所有的内存。 +- Created & Exsiting:创建且被存活的内存。 +- Created & Destroyed: 创建且被销毁的内存。 + 点击下方的 All Heap&Anonymous 可以对内存类型进行过滤。 + ![GitHub Logo](../../figures/NativeMemory/AllocationType.jpg) +- All Heap&AnonuymousVM:Heap和AnonuymousVM的总量。 +- All Heap:malloc分配的内存。 +- All Anonymous VM:mmap的匿名页。 + 点击下方的 Mark Snapshot 可以在时间轴上打标签。出现小旗的标志,通过标注多个时间点。点击到 Snapshot List 标签页可以看到各个时间点的内存的增长值。 + ![GitHub Logo](../../figures/NativeMemory/Generation.jpg) + +### Native Memory 的火焰图功能 + +点击 callinfo 左下角的柱状图的图标,会切换到火焰图页面。 ![GitHub Logo](../../figures/NativeMemory/nativeflame.jpg) -进入到火焰图页面,火焰图的展示跟Callinfo的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和size大小。 +进入到火焰图页面,火焰图的展示跟 Callinfo 的 tab 页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和 size 大小。 ![GitHub Logo](../../figures/NativeMemory/nativeflameshow.jpg) 鼠标左键火焰图,会进入下一级界面,右键回到上一级。 ![GitHub Logo](../../figures/NativeMemory/nativeflamelevel2.jpg) -### Native Memory数据统计功能 -选择Use Record Statistics和statistics interval配置项抓取的数据,只会显示Call Info的Tab页,Call Info相关功能同上。 -![GitHub Logo](../../figures/NativeMemory/statiscsCallInfo.jpg) +### Native Memory 数据统计功能 + +选择 Use Record Statistics 和 statistics interval 配置项抓取的数据,只会显示 Call Info 的 Tab 页,Call Info 相关功能同上。 +![GitHub Logo](../../figures/NativeMemory/statiscsCallInfo.jpg) diff --git a/ide/src/doc/md/quickstart_page_fault.md b/ide/src/doc/md/quickstart_page_fault.md index c4461c35bad8266d897a173f2dc84f5104b6095f..b3968ce99df1f1928053d3f49e0631b87e249a6c 100644 --- a/ide/src/doc/md/quickstart_page_fault.md +++ b/ide/src/doc/md/quickstart_page_fault.md @@ -1,84 +1,110 @@ # 页内存的抓取和展示说明 -页内存从page层面更深层次剖析应用程序的虚拟内存操作。 + +页内存从 page 层面更深层次剖析应用程序的虚拟内存操作。 + ## 页内存的抓取 + ### 页内存抓取配置参数 + ![GitHub Logo](../../figures/EBPF/ebpfsetting.jpg) 配置项说明: -+ Start Page Fault Record:配置项的总开关。 -+ Process:默认配置的是整个系统的,也可选择单进程抓取。 -+ Max Unwind Level:配置抓取调用栈的最大深度。 -再点击Record setting,在output file path输入文件名hiprofiler_data_ebpf.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 +- Start Page Fault Record:配置项的总开关。 +- Process:默认配置的是整个系统的,也可选择单进程抓取。 +- Max Unwind Level:配置抓取调用栈的最大深度。 + +再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_ebpf.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 ![GitHub Logo](../../figures/EBPF/ebpfrecord.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击Record抓取,抓取过程中会显示抓取时长。 +点击 Trace command,就会根据上面的配置生成抓取命令,点击 Record 抓取,抓取过程中会显示抓取时长。 ![GitHub Logo](../../figures/EBPF/ebpfexcuting.jpg) + ### 页内存展示说明 -抓取结束后页内存的trace会自动加载展示。 + +抓取结束后页内存的 trace 会自动加载展示。 ![GitHub Logo](../../figures/EBPF/ebpfsummary.jpg) -界面布局介绍:页内存整体界面布局分为3个部分: -+ 红色区域:泳道图。 -+ 绿色区域:详细信息。 -+ 黄色区域:辅助信息(Callstack)。 +界面布局介绍:页内存整体界面布局分为 3 个部分: + +- 红色区域:泳道图。 +- 绿色区域:详细信息。 +- 黄色区域:辅助信息(Callstack)。 ### 页内存泳道图展示 -页内存泳道图展示事件(Operation)发生的次数,每个事件都有持续时间,鼠标悬浮以10ms为区间进行次数统计。 + +页内存泳道图展示事件(Operation)发生的次数,每个事件都有持续时间,鼠标悬浮以 10ms 为区间进行次数统计。 ![GitHub Logo](../../figures/EBPF/EBPFchart.jpg) -按住w键放大界面,悬浮框会显示当前时刻的事件发生次数。 +按住 w 键放大界面,悬浮框会显示当前时刻的事件发生次数。 ![GitHub Logo](../../figures/EBPF/EBPFcount.jpg) + ### 页内存泳道图的框选功能 -可以对泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有三个tab页。 -Page Fault Statistics的Tab页如图: + +可以对泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有三个 tab 页。 +Page Fault Statistics 的 Tab 页如图: ![GitHub Logo](../../figures/EBPF/vmstatistics.jpg) -+ Operation/Process/Thread: 按照Operation为基点显示。 -+ Count: 事件数量。 -+ Duration:总时长。 -+ Min Duration:最小时长。 -+ Avg Duration: 平均时长。 -+ Max Duration:最大时长。 -点击下方的Statistics by Thread,可以切换到按照Thread为基点显示数据。 -![GitHub Logo](../../figures/EBPF/ebpf_bythread.jpg) -Page Fault Calltree的Tab页如图: -![GitHub Logo](../../figures/EBPF/VMCalltree.jpg) -+ Call Stack:为经过符号解析后的Callstack,并且给出动态链接库或者进程名的信息。 -+ Local:为该调用方法自身占用的CPU时间。 -+ Weight:调用方法的执行占比。 -Page Fault Events的Tab页如图: -![GitHub Logo](../../figures/EBPF/VMEvents.jpg) -+ Start Time:起始时间。 -+ Duration:时长。 -+ Thread:线程名。 -+ Operation:事件类型。 -+ Address:内存地址。 -+ Size:内存大小。 -### 页内存支持多种Options展示风格 -点击Page Fault Calltree的Tab页底部的Options,会有两个CheckBox复选框。 + +- Operation/Process/Thread: 按照Operation为基点显示。 +- Count: 事件数量。 +- Duration:总时长。 +- Min Duration:最小时长。 +- Avg Duration: 平均时长。 +- Max Duration:最大时长。 + 点击下方的 Statistics by Thread,可以切换到按照 Thread 为基点显示数据。 + ![GitHub Logo](../../figures/EBPF/ebpf_bythread.jpg) + Page Fault Calltree 的 Tab 页如图: + ![GitHub Logo](../../figures/EBPF/VMCalltree.jpg) +- Call Stack:为经过符号解析后的Callstack,并且给出动态链接库或者进程名的信息。 +- Local:为该调用方法自身占用的CPU时间。 +- Weight:调用方法的执行占比。 + Page Fault Events 的 Tab 页如图: + ![GitHub Logo](../../figures/EBPF/VMEvents.jpg) +- Start Time:起始时间。 +- Duration:时长。 +- Thread:线程名。 +- Operation:事件类型。 +- Address:内存地址。 +- Size:内存大小。 + +### 页内存支持多种 Options 展示风格 + +点击 Page Fault Calltree 的 Tab 页底部的 Options,会有两个 CheckBox 复选框。 ![GitHub Logo](../../figures/EBPF/vmOptions.jpg) -+ Invert:反向输出调用树。 -+ Hide System so:隐藏系统库文件。 + +- Invert:反向输出调用树。 +- Hide System so:隐藏系统库文件。 + ### 页内存支持过滤调用栈调用次数的展示风格 -点击Page Fault Calltree的Tab页底部的Sample Counter Filter,可以填上区间值。过滤出符合该区间值调用次数的调用栈信息。 + +点击 Page Fault Calltree 的 Tab 页底部的 Sample Counter Filter,可以填上区间值。过滤出符合该区间值调用次数的调用栈信息。 ![GitHub Logo](../../figures/EBPF/vmcounter.jpg) -### 页内存功能的调用栈Group展示-数据分析支持剪裁功能 +### 页内存功能的调用栈 Group 展示-数据分析支持剪裁功能 + ![GitHub Logo](../../figures/EBPF/vmdatamining.jpg) -+ 裁剪Callstack,点击Callstack上一个节点符号,再点击底部Symbol Filter按钮,则该符号自动被裁剪掉,同时将该节点往下所有的Callstack内容裁剪掉。 -+ 裁剪Library,点击Library Filter按钮,则该库文件符号下所有的子节点也被裁剪。 -+ 点击Reset按钮,将恢复选中的裁剪内容。 -### 页内存功能的调用栈Group展示支持按条件过滤 -在Input Filter输入关键字,会显示出带有该关键字的展示信息。 - ![GitHub Logo](../../figures/EBPF/vminputfilter.jpg) + +- 裁剪 Callstack,点击 Callstack 上一个节点符号,再点击底部 Symbol Filter 按钮,则该符号自动被裁剪掉,同时将该节点往下所有的 Callstack 内容裁剪掉。 +- 裁剪 Library,点击 Library Filter 按钮,则该库文件符号下所有的子节点也被裁剪。 +- 点击 Reset 按钮,将恢复选中的裁剪内容。 + +### 页内存功能的调用栈 Group 展示支持按条件过滤 + +在 Input Filter 输入关键字,会显示出带有该关键字的展示信息。 +![GitHub Logo](../../figures/EBPF/vminputfilter.jpg) + ### 页内存辅助信息区展示调用栈 -当在详细信息区选择一个符号时,将展示与该符号相关的完整的调用栈。如下图的Heaviest Stack Trace: - ![GitHub Logo](../../figures/EBPF/vmheaviesttrace.jpg) + +当在详细信息区选择一个符号时,将展示与该符号相关的完整的调用栈。如下图的 Heaviest Stack Trace: +![GitHub Logo](../../figures/EBPF/vmheaviesttrace.jpg) + ### 页内存的事件类型的过滤 - 通过选择可以过滤是File Backed In类型,还是Copy On Write类型事件。 - ![GitHub Logo](../../figures/EBPF/VMfilter.jpg) + +通过选择可以过滤是 File Backed In 类型,还是 Copy On Write 类型事件。 +![GitHub Logo](../../figures/EBPF/VMfilter.jpg) + ### 页内存的火焰图功能 -点击Page Fault Calltree左下角的柱状图的图标,会切换到火焰图页面。 + +点击 Page Fault Calltree 左下角的柱状图的图标,会切换到火焰图页面。 ![GitHub Logo](../../figures/EBPF/vmflame.jpg) -进入到火焰图页面,火焰图的展示跟Callinfo的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和Duration时长。 +进入到火焰图页面,火焰图的展示跟 Callinfo 的 tab 页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和 Duration 时长。 ![GitHub Logo](../../figures/EBPF/vmflameshow.jpg) 鼠标左键火焰图,会进入下一级界面,右键回到上一级。 ![GitHub Logo](../../figures/EBPF/vmflamelevel.jpg) - diff --git a/ide/src/doc/md/quickstart_schedulinganalysis.md b/ide/src/doc/md/quickstart_schedulinganalysis.md index 45750d5fb1862ffcbfe50e30ae2bce22eb5ec650..bb66e4a2b8f044897296ad483af3aec469b4c1d6 100644 --- a/ide/src/doc/md/quickstart_schedulinganalysis.md +++ b/ide/src/doc/md/quickstart_schedulinganalysis.md @@ -1,123 +1,143 @@ -# Scheduling analysis抓取和展示说明 -抓取和展示CPU调度分析,线程调度分析相关数据。 -## Scheduling analysis的抓取 -### Scheduling analysis抓取界面配置说明 -打开Scheduling analysis开关抓取调度分析数据。 -![GitHub Logo]( ../../figures/Schedulinganalysis/scheduset.jpg) -### Scheduling analysis文件的抓取 -点击Record setting,在output file path输入文件名hiprofiler_dataScheduling.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 -![GitHub Logo]( ../../figures/Schedulinganalysis/schedusetting.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击Record抓取,抓取过程中会显示抓取时长。 -![GitHub Logo]( ../../figures/Schedulinganalysis/scheduexcuting.jpg) -## Scheduling analysis功能介绍 -将抓取的文件导入到smartperf工具查看。 -### CPU频点分析 -点击下拉列表框选择CPU Frequency,可以看到各核CPU的各频点持续时长的占比图,以颜色区分各频点。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUFrequencychart.jpg) -点击CPU Frequency饼图,可以跳转到详细信息界面,用饼图和表格来展示某个CPU下各频点持续时长的的相关数据。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUFrequencydetailinfo.jpg) -+ No:编号。 -+ frequency:频率。 -+ min:最小时长。 -+ max:最大时长。 -+ average:平均时长。 -+ duration:运行总时长。 -点击详细页的CPU Frequency饼图,可以跳转某个CPU下某个频点的运行的线程信息。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUFrequencythreaddetail.jpg) -+ No:编号。 -+ t_name:线程名。 -+ tid:线程id。 -+ p_name:进程名。 -+ p_pid:进程id。 -+ duration:运行总时长。 -### CPU Idle分析 -点击下拉列表框选择CPU Idle,可以看到各CPU的Idle的时长占比饼图,以颜色区分各Idle。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUidlechart.jpg) -点击CPU Idle饼图,可以跳转到某CPU的idle分析的详细数据,以饼图和表格的形式展示。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUidledetailinfo.jpg) -+ No:编号。 -+ idle:idle值。 -+ min:最小时长。 -+ max:最大时长。 -+ average:平均时长。 -+ duration:运行总时长。 -### CPU Irq分析 -点击下拉列表框选择CPU Irq,可以看到各CPU的Irq的时长占比饼图,以颜色区分。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUirqchart.jpg) -点击CPU Irq饼图,可以跳转到某CPU的Irq分析的详细数据,以饼图和表格的形式展示。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUirqdetailinfo.jpg) -+ No:编号。 -+ block:irq的类型。 -+ name:irp名称。 -+ min:最小时长。 -+ max:最大时长。 -+ average:平均时长。 -+ duration:运行总时长。 -### CPU占用率显示 -以表格显示各CPU的占用率。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUusagechart.jpg) -### Top20线程大中小核占用率 -选择Thread Analysis标签页,各个CPU通过勾选big或者middle或者small来设置CPU的分类。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUsetting.jpg) -各CPU勾选好大中小核,点击Upload可以跳转到各个线程CPU占用率情况的展示页面。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUdetailsetting.jpg) -如上图所示: -+ 三色柱状图:各个线程CPU的占用率情况,其中以颜色区分占用的大中小核的占用率情况,并以表格的形式展示各个线程的基本信息和大中小核占用率。 -+ 单色柱状图:分别统计线程在某一个类别(大、中、小)的CPU的占用率,并显示出线程的基本信息和占用率。 -表格的字段说明: -+ tid:线程号。 -+ t_name:线程名。 -+ pid:进程号。 -+ p_name:进程名。 -+ big core:大核占用时长。 -+ middle core:中核占用时长。 -+ small core:小核占用时长。 -+ cpu..(us):运行总时长(..代表cpu号)。 -### 单个线程频点分布 -点击单个线程频点分布的标签,通过在Thread Search选择线程,来展示单个线程的频点分布情况。 -![GitHub Logo]( ../../figures/Schedulinganalysis/CPUfrequencybythread.jpg) -+ NO:编号。 -+ cpu:cpu编号。 -+ frequency:频点。 -+ duration:运行时长。 -+ %:频点占用率。 -### Top20单次运行超长线程 -通过点击Top20单次运行超长线程标签,显示线程的单次运行时长来统计出单次运行时长最大的20个线程。 -![GitHub Logo]( ../../figures/Schedulinganalysis/Top20Threadduration.jpg) -+ NO:编号。 -+ tid:线程号。 -+ t_name:线程名。 -+ pid:进程号。 -+ p_name:进程名。 -+ max duration:最大运行时长。 -+ timestamp:时间戳信息。 -### Top20进程线程数 -通过点击Top20进程线程数标签,显示线程数量最多的20个进程,以饼图和表格方式显示。 -![GitHub Logo]( ../../figures/Schedulinganalysis/Top20Threadnum.jpg) -+ NO:编号。 -+ pid:进程号。 -+ p_name:进程名。 -+ thread count:线程数量。 -### Top20切换次数线程 -通过点击Top20切换次数线程标签,显示切换次数最多的20个进程,以饼图和表格方式显示。 -![GitHub Logo]( ../../figures/Schedulinganalysis/Top20swtichcount.jpg) -+ NO:编号。 -+ tid:线程号。 -+ t_name:线程名。 -+ pid:进程号。 -+ p_name:进程名。 -+ sched_switch count:切换次数。 +# Scheduling analysis 抓取和展示说明 + +抓取和展示 CPU 调度分析,线程调度分析相关数据。 + +## Scheduling analysis 的抓取 + +### Scheduling analysis 抓取界面配置说明 + +打开 Scheduling analysis 开关抓取调度分析数据。 +![GitHub Logo](../../figures/Schedulinganalysis/scheduset.jpg) + +### Scheduling analysis 文件的抓取 + +点击 Record setting,在 output file path 输入文件名 hiprofiler_dataScheduling.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 +![GitHub Logo](../../figures/Schedulinganalysis/schedusetting.jpg) +点击 Trace command,就会根据上面的配置生成抓取命令,点击 Record 抓取,抓取过程中会显示抓取时长。 +![GitHub Logo](../../figures/Schedulinganalysis/scheduexcuting.jpg) + +## Scheduling analysis 功能介绍 + +将抓取的文件导入到 smartperf 工具查看。 + +### CPU 频点分析 + +点击下拉列表框选择 CPU Frequency,可以看到各核 CPU 的各频点持续时长的占比图,以颜色区分各频点。 +![GitHub Logo](../../figures/Schedulinganalysis/CPUFrequencychart.jpg) +点击 CPU Frequency 饼图,可以跳转到详细信息界面,用饼图和表格来展示某个 CPU 下各频点持续时长的的相关数据。 +![GitHub Logo](../../figures/Schedulinganalysis/CPUFrequencydetailinfo.jpg) +- No:编号。 +- frequency:频率。 +- min:最小时长。 +- max:最大时长。 +- average:平均时长。 +- duration:运行总时长。 + 点击详细页的 CPU Frequency 饼图,可以跳转某个 CPU 下某个频点的运行的线程信息。 + ![GitHub Logo](../../figures/Schedulinganalysis/CPUFrequencythreaddetail.jpg) +- No:编号。 +- t_name:线程名。 +- tid:线程id。 +- p_name:进程名。 +- p_pid:进程id。 +- duration:运行总时长。 +### CPU Idle 分析 +点击下拉列表框选择 CPU Idle,可以看到各 CPU 的 Idle 的时长占比饼图,以颜色区分各 Idle。 +![GitHub Logo](../../figures/Schedulinganalysis/CPUidlechart.jpg) +点击 CPU Idle 饼图,可以跳转到某 CPU 的 idle 分析的详细数据,以饼图和表格的形式展示。 +![GitHub Logo](../../figures/Schedulinganalysis/CPUidledetailinfo.jpg) + +- No:编号。 +- idle:idle值。 +- min:最小时长。 +- max:最大时长。 +- average:平均时长。 +- duration:运行总时长。 + +### CPU Irq 分析 + +点击下拉列表框选择 CPU Irq,可以看到各 CPU 的 Irq 的时长占比饼图,以颜色区分。 +![GitHub Logo](../../figures/Schedulinganalysis/CPUirqchart.jpg) +点击 CPU Irq 饼图,可以跳转到某 CPU 的 Irq 分析的详细数据,以饼图和表格的形式展示。 +![GitHub Logo](../../figures/Schedulinganalysis/CPUirqdetailinfo.jpg) + +- No:编号。 +- block:irq的类型。 +- name:irp名称。 +- min:最小时长。 +- max:最大时长。 +- average:平均时长。 +- duration:运行总时长。 + +### CPU 占用率显示 + +以表格显示各 CPU 的占用率。 +![GitHub Logo](../../figures/Schedulinganalysis/CPUusagechart.jpg) + +### Top20 线程大中小核占用率 + +选择 Thread Analysis 标签页,各个 CPU 通过勾选 big 或者 middle 或者 small 来设置 CPU 的分类。 +![GitHub Logo](../../figures/Schedulinganalysis/CPUsetting.jpg) +各 CPU 勾选好大中小核,点击 Upload 可以跳转到各个线程 CPU 占用率情况的展示页面。 +![GitHub Logo](../../figures/Schedulinganalysis/CPUdetailsetting.jpg) +如上图所示: + +- 三色柱状图:各个线程CPU的占用率情况,其中以颜色区分占用的大中小核的占用率情况,并以表格的形式展示各个线程的基本信息和大中小核占用率。 +- 单色柱状图:分别统计线程在某一个类别(大、中、小)的CPU的占用率,并显示出线程的基本信息和占用率。 + 表格的字段说明: +- tid:线程号。 +- t_name:线程名。 +- pid:进程号。 +- p_name:进程名。 +- big core:大核占用时长。 +- middle core:中核占用时长。 +- small core:小核占用时长。 +- cpu..(us):运行总时长(..代表cpu号)。 + +### 单个线程频点分布 +点击单个线程频点分布的标签,通过在 Thread Search 选择线程,来展示单个线程的频点分布情况。 +![GitHub Logo](../../figures/Schedulinganalysis/CPUfrequencybythread.jpg) +- NO:编号。 +- cpu:cpu编号。 +- frequency:频点。 +- duration:运行时长。 +- %:频点占用率。 +### Top20 单次运行超长线程 +通过点击 Top20 单次运行超长线程标签,显示线程的单次运行时长来统计出单次运行时长最大的 20 个线程。 +![GitHub Logo](../../figures/Schedulinganalysis/Top20Threadduration.jpg) +- NO:编号。 +- tid:线程号。 +- t_name:线程名。 +- pid:进程号。 +- p_name:进程名。 +- max duration:最大运行时长。 +- timestamp:时间戳信息。 +### Top20 进程线程数 +通过点击 Top20 进程线程数标签,显示线程数量最多的 20 个进程,以饼图和表格方式显示。 +![GitHub Logo](../../figures/Schedulinganalysis/Top20Threadnum.jpg) +- NO:编号。 +- pid:进程号。 +- p_name:进程名。 +- thread count:线程数量。 +### Top20 切换次数线程 +通过点击 Top20 切换次数线程标签,显示切换次数最多的 20 个进程,以饼图和表格方式显示。 +![GitHub Logo](../../figures/Schedulinganalysis/Top20swtichcount.jpg) +- NO:编号。 +- tid:线程号。 +- t_name:线程名。 +- pid:进程号。 +- p_name:进程名。 +- sched_switch count:切换次数。 diff --git a/ide/src/doc/md/quickstart_sdk.md b/ide/src/doc/md/quickstart_sdk.md index 4be2355c80b79a387c795eb389fb1db809a67ff7..a34aafe8e80374b39b2f9ee5184416f8aa557c83 100644 --- a/ide/src/doc/md/quickstart_sdk.md +++ b/ide/src/doc/md/quickstart_sdk.md @@ -1,6 +1,10 @@ -# Sdk抓取 -抓取Sdk数据。 -## Sdk的抓取 -### Sdk抓取配置参数 -打开Start Custom Config开关抓取Sdk数据。 +# Sdk 抓取 + +抓取 Sdk 数据。 + +## Sdk 的抓取 + +### Sdk 抓取配置参数 + +打开 Start Custom Config 开关抓取 Sdk 数据。 ![GitHub Logo](../../figures/sdk/sdk.jpg) diff --git a/ide/src/doc/md/quickstart_smaps.md b/ide/src/doc/md/quickstart_smaps.md index c94216dc0498d436f73e23b68f0cb2810bb7adf6..b0117a5db3a10284932e3a1d1439b24bcd2fb844 100644 --- a/ide/src/doc/md/quickstart_smaps.md +++ b/ide/src/doc/md/quickstart_smaps.md @@ -1,50 +1,62 @@ -# 进程smaps的抓取和展示说明 -smaps展示了一个进程的内存消耗。 -## smaps的抓取 -### smaps抓取配置参数 +# 进程 smaps 的抓取和展示说明 + +smaps 展示了一个进程的内存消耗。 + +## smaps 的抓取 + +### smaps 抓取配置参数 + ![GitHub Logo](../../figures/smaps/smapssetting.jpg) 配置项说明: -+ Start VM Tracker Record:配置项的总开关。 -+ Process:smaps的抓取只能选择单进程抓取。 -再点击Record setting,在output file path输入文件名hiprofiler_data_smaps.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 +- Start VM Tracker Record:配置项的总开关。 +- Process:smaps的抓取只能选择单进程抓取。 + +再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_smaps.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 ![GitHub Logo](../../figures/smaps/smapsrecord.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击Record抓取,抓取过程中会显示抓取时长。 +点击 Trace command,就会根据上面的配置生成抓取命令,点击 Record 抓取,抓取过程中会显示抓取时长。 ![GitHub Logo](../../figures/smaps/smapsexcuting.jpg) -### smaps展示说明 -抓取结束后smaps的trace会自动加载展示。 + +### smaps 展示说明 + +抓取结束后 smaps 的 trace 会自动加载展示。 ![GitHub Logo](../../figures/smaps/smapssummary.jpg) -界面布局介绍:smaps整体界面布局分为3个部分: -+ 红色区域:泳道图。 -+ 绿色区域:详细信息。 +界面布局介绍:smaps 整体界面布局分为 3 个部分: + +- 红色区域:泳道图。 +- 绿色区域:详细信息。 + +### smaps 泳道图展示 -### smaps泳道图展示 -smaps泳道图展示当前时刻该进程的内存消耗。 +smaps 泳道图展示当前时刻该进程的内存消耗。 ![GitHub Logo](../../figures/smaps/smapschart.jpg) -### smaps泳道图的框选功能 -可以对泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有两个个tab页。 -VM Tracker Statistics的Tab页如图: + +### smaps 泳道图的框选功能 + +可以对泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有两个个 tab 页。 +VM Tracker Statistics 的 Tab 页如图: ![GitHub Logo](../../figures/smaps/smapsstatistics.jpg) -+ Type: 将抓取到的信息根据Type归类,分四类,Data,Text,Const,Other。 -+ % of Res: 每行的Resident Size 占总Ressident Size的比例。 -+ #Reg:统计的类型个数。 -+ Path:虚拟内存块路径,类型中有多个则显示multiple。 -+ Resident Size: smaps节点中Rss(Shared_Clean+Shared_Dirty+Private_Clean+Private_Dirty)。 -+ Dirty Size:smaps节点中Shared_Dirty + Private_Dirty。 -+ Swapped: smaps节点中Swap + SwapPss。 -+ Virtual Size:smaps节点中Size。 -+ Pss: smaps节点中Pss。 -+ Res. %:Resident Size / Virtual Size 比值。 -VM Tracker Record List的Tab页如图: -![GitHub Logo](../../figures/smaps/smapslist.jpg) -+ Type: 将抓取到的信息根据Type归类,Data,Text,Const,Other。 -+ Address Range: 每段虚拟内存段的开始和结束位置。 -+ Dirty Size:smaps节点中Shared_Dirty + Private_Dirty。 -+ Swapper: smaps节点中Swap + SwapPss。 -+ Resident Size:smaps节点中Rss(Shared_Clean+Shared_Dirty+Private_Clean+Private_Dirty)。 -+ Virtual Size:smaps节点中Size。 -+ Pss:smaps节点中Pss。 -+ Reside: Rss / Size 比值。 -+ Protection: 内存块的权限(读写执行执行)。 -+ Path: 内存段路径。 \ No newline at end of file + +- Type: 将抓取到的信息根据Type归类,分四类,Data,Text,Const,Other。 +- % of Res: 每行的Resident Size 占总Ressident Size的比例。 +- #Reg:统计的类型个数。 +- Path:虚拟内存块路径,类型中有多个则显示multiple。 +- Resident Size: smaps节点中Rss(Shared_Clean+Shared_Dirty+Private_Clean+Private_Dirty)。 +- Dirty Size:smaps节点中Shared_Dirty + Private_Dirty。 +- Swapped: smaps节点中Swap + SwapPss。 +- Virtual Size:smaps节点中Size。 +- Pss: smaps节点中Pss。 +- Res. %:Resident Size / Virtual Size 比值。 + VM Tracker Record List 的 Tab 页如图: + ![GitHub Logo](../../figures/smaps/smapslist.jpg) +- Type: 将抓取到的信息根据Type归类,Data,Text,Const,Other。 +- Address Range: 每段虚拟内存段的开始和结束位置。 +- Dirty Size:smaps节点中Shared_Dirty + Private_Dirty。 +- Swapper: smaps节点中Swap + SwapPss。 +- Resident Size:smaps节点中Rss(Shared_Clean+Shared_Dirty+Private_Clean+Private_Dirty)。 +- Virtual Size:smaps节点中Size。 +- Pss:smaps节点中Pss。 +- Reside: Rss / Size 比值。 +- Protection: 内存块的权限(读写执行执行)。 +- Path: 内存段路径。 diff --git a/ide/src/doc/md/quickstart_sql_metrics.md b/ide/src/doc/md/quickstart_sql_metrics.md index 8e771ad81271b5088e715574506e528377445d50..f06ba59ce47e773f347f99af9dc6c3ff674b62d7 100644 --- a/ide/src/doc/md/quickstart_sql_metrics.md +++ b/ide/src/doc/md/quickstart_sql_metrics.md @@ -1,16 +1,27 @@ -# Sql分析和Metrics说明 -Sql功能是方便使用者查询sql语句查看相关业务,Metrics是更高级别的查询接口,无需手动键入任何SQL语句,只需要选择定制好的查询接口,就能获得想要跟踪的结果。 -## Sql分析功能介绍 -点击Query(SQL),输入需要查询的sql语句,如select * from process,可以看到进程表数据。 +# Sql 分析和 Metrics 说明 + +Sql 功能是方便使用者查询 sql 语句查看相关业务,Metrics 是更高级别的查询接口,无需手动键入任何 SQL 语句,只需要选择定制好的查询接口,就能获得想要跟踪的结果。 + +## Sql 分析功能介绍 + +点击 Query(SQL),输入需要查询的 sql 语句,如 select \* from process,可以看到进程表数据。 ![GitHub Logo](../../figures/Metrics/Sql.jpg) -## Metrics功能介绍 -Metrics是更高级别的查询接口,无需手动键入任何SQL语句,只需要选择定制好的查询接口,就能获得想要跟踪的结果。 -### Metrics查询接口展示 -如下图,查询接口在下拉框中,如选择trace_task_names,点击run,就能展示线程和进程相关数据。 + +## Metrics 功能介绍 + +Metrics 是更高级别的查询接口,无需手动键入任何 SQL 语句,只需要选择定制好的查询接口,就能获得想要跟踪的结果。 + +### Metrics 查询接口展示 + +如下图,查询接口在下拉框中,如选择 trace_task_names,点击 run,就能展示线程和进程相关数据。 ![GitHub Logo](../../figures/Metrics/metrics.jpg) -## Info和stats功能 -点击Info and stats,能查看到meta表和stats表信息。 + +## Info 和 stats 功能 + +点击 Info and stats,能查看到 meta 表和 stats 表信息。 ![GitHub Logo](../../figures/Metrics/infoandstats.jpg) -## Download功能 -点击DownLoad按钮,会将在线抓取的文件下载到本地。 -![GitHub Logo](../../figures/Metrics/download.jpg) \ No newline at end of file + +## Download 功能 + +点击 DownLoad 按钮,会将在线抓取的文件下载到本地。 +![GitHub Logo](../../figures/Metrics/download.jpg) diff --git a/ide/src/doc/md/quickstart_systemtrace.md b/ide/src/doc/md/quickstart_systemtrace.md index caaee7c16764ce54d2138875389d289ce1097852..b79afd6e6b21fa67ebdf98103ee9e0e3946798ae 100644 --- a/ide/src/doc/md/quickstart_systemtrace.md +++ b/ide/src/doc/md/quickstart_systemtrace.md @@ -1,89 +1,124 @@ -# web端加载trace说明 -从web端查看trace文件,进行性能检测的分析。 +# web 端加载 trace 说明 + +从 web 端查看 trace 文件,进行性能检测的分析。 + ## 文件加载入口 -将抓取的trace导入查看。 + +将抓取的 trace 导入查看。 ![GitHub Logo](../../figures/Web/opentrace.jpg) 说明: -+ Open trace file:导入离线trace文件入口。 -+ Record new trace:抓取新的trace文件入口。 -## 导入trace文件后显示页面 +- Open trace file:导入离线 trace 文件入口。 +- Record new trace:抓取新的 trace 文件入口。 + +## 导入 trace 文件后显示页面 + ![GitHub Logo](../../figures/Web/trace.jpg) 说明: -+ 操作说明:在当前页面可以通过键盘上的wasd四个键位操纵当前的时间轴进行缩放,w为放大,s为缩小,a为左移,d为右移。 -## trace功能介绍 -trace模块从上往下主要展示时间轴、cpu使用率、cpu使用情况、进程间通讯数据的方法调用情况、进程、线程和方法调用情况。 -### 时间轴和cpu使用率 + +- 操作说明:在当前页面可以通过键盘上的 wasd 四个键位操纵当前的时间轴进行缩放,w 为放大,s 为缩小,a 为左移,d 为右移。 + +## trace 功能介绍 + +trace 模块从上往下主要展示时间轴、cpu 使用率、cpu 使用情况、进程间通讯数据的方法调用情况、进程、线程和方法调用情况。 + +### 时间轴和 cpu 使用率 + ![GitHub Logo](../../figures/Web/time.jpg) 最上方带刻度的为时间轴,主要展示当前抓取数据的总时长和时间刻度的分布情况,如上图所示,左下角展示总时长。 -中间区域展示的是抓取数据时间段内的cpu使用率,颜色越深代表cpu使用率越高,颜色越浅代表cpu使用率越低。 +中间区域展示的是抓取数据时间段内的 cpu 使用率,颜色越深代表 cpu 使用率越高,颜色越浅代表 cpu 使用率越低。 ![GitHub Logo](../../figures/Web/highlit.jpg) 在白色背景时间轴区域内可以点击后拖拽鼠标,可以对从鼠标按下到拖拽完成鼠标松开的区域内的数据进行筛选,高亮显示的部分为当前所选区域,如上图所示。 -### cpu使用情况 + +### cpu 使用情况 + ![GitHub Logo](../../figures/Web/cpu.jpg) - -如上图所示,当前抓取数据有4个cpu工作,前四组数据对应的是当前调用cpu的线程和对应的进程情况,以颜色作为区分。后四组数据则为cpu的使用频率信息。鼠标移动到相应的线程上还会将当前选中的进程信息全部置为高亮,其他的进程会置灰,如下图所示。 + +如上图所示,当前抓取数据有 4 个 cpu 工作,前四组数据对应的是当前调用 cpu 的线程和对应的进程情况,以颜色作为区分。后四组数据则为 cpu 的使用频率信息。鼠标移动到相应的线程上还会将当前选中的进程信息全部置为高亮,其他的进程会置灰,如下图所示。 ![GitHub Logo](../../figures/Web/gray.jpg) -#### cpu使用情况的框选功能 -可以对cpu的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有七个tab页。 -CPU by thread的Tab页,主要显示了在框选时间区间内的进程名、进程号、线程名、线程号、总运行时长、平均运行时长和调度次数信息。 + +#### cpu 使用情况的框选功能 + +可以对 cpu 的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有七个 tab 页。 +CPU by thread 的 Tab 页,主要显示了在框选时间区间内的进程名、进程号、线程名、线程号、总运行时长、平均运行时长和调度次数信息。 ![GitHub Logo](../../figures/Web/cpubythread.jpg) -CPU by process的Tab页,主要显示了在框选时间区间内的进程名、进程号、总运行时长、平均运行时长和调度次数信息。 +CPU by process 的 Tab 页,主要显示了在框选时间区间内的进程名、进程号、总运行时长、平均运行时长和调度次数信息。 ![GitHub Logo](../../figures/Web/cpubyprocess.jpg) -CPU Usage的Tab页,主要显示了在框选时间区间内,该频率时间占比前三的信息。 +CPU Usage 的 Tab 页,主要显示了在框选时间区间内,该频率时间占比前三的信息。 ![GitHub Logo](../../figures/Web/cpusage.jpg) -States List的Tab页,按状态>进程>线程的维度去统计,需要呈现该状态的线程名、该状态次数、该状态下时长、最大最小时长、平均时长、最大时长。 +States List 的 Tab 页,按状态>进程>线程的维度去统计,需要呈现该状态的线程名、该状态次数、该状态下时长、最大最小时长、平均时长、最大时长。 ![GitHub Logo](../../figures/Web/StatesList.jpg) -Switches List的Tab页,按照进程>线程>状态,统计对应状态下的次数。 +Switches List 的 Tab 页,按照进程>线程>状态,统计对应状态下的次数。 ![GitHub Logo](../../figures/Web/Switchlist.jpg) -Thread States的Tab页,按进程>线程>状态的维度去统计,需要呈现该状态的线程名、进入该状态次数、该状态下时长、最小时长、平均时长、最大时长。 +Thread States 的 Tab 页,按进程>线程>状态的维度去统计,需要呈现该状态的线程名、进入该状态次数、该状态下时长、最小时长、平均时长、最大时长。 ![GitHub Logo](../../figures/Web/threadstates.jpg) -Thread Switches的Tab页,按照状态>进程>线程,统计对应状态下的次数。 +Thread Switches 的 Tab 页,按照状态>进程>线程,统计对应状态下的次数。 ![GitHub Logo](../../figures/Web/threadswitches.jpg) -States List、Switches List、Thread States、Thread Switches的4个Tab页,点击移动到某一行,鼠标会变成一个小手的标志,点击一下,就会进入辅助信息界面,会将选中行的辅助信息展示出来,包括开始时间、进程、线程、线程状态、对应的CPU、优先级等信息如下图。 +States List、Switches List、Thread States、Thread Switches 的 4 个 Tab 页,点击移动到某一行,鼠标会变成一个小手的标志,点击一下,就会进入辅助信息界面,会将选中行的辅助信息展示出来,包括开始时间、进程、线程、线程状态、对应的 CPU、优先级等信息如下图。 ![GitHub Logo](../../figures/Web/details.jpg) -#### cpu使用情况的单选功能 -单选CPU使用情况数据会在选中的色块外层加上深色边框,能够突出当前选中色块,弹出层中会展示当前CPU上的进程名,线程名,开始时间和运行时长,线程运行状态等信息。 + +#### cpu 使用情况的单选功能 + +单选 CPU 使用情况数据会在选中的色块外层加上深色边框,能够突出当前选中色块,弹出层中会展示当前 CPU 上的进程名,线程名,开始时间和运行时长,线程运行状态等信息。 ![GitHub Logo](../../figures/Web/cpuclick.jpg) + ### 进程、线程和方法数据 -下图是进程数据,左边部分展示进程名称和id,右边显示线程切换关系,线程的调用方法,进程间内存信息等。 + +下图是进程数据,左边部分展示进程名称和 id,右边显示线程切换关系,线程的调用方法,进程间内存信息等。 ![GitHub Logo](../../figures/Web/process.jpg) -点击进程名前面向下箭头可以展开对应的线程进行查看,展开后的线程如下图,如果存在堆内存占用情况,就会显示在第一行,如果出现两个名字和id一样的线程,则第一个为线程的使用情况,第二为线程内的方法栈调用情况。 +点击进程名前面向下箭头可以展开对应的线程进行查看,展开后的线程如下图,如果存在堆内存占用情况,就会显示在第一行,如果出现两个名字和 id 一样的线程,则第一个为线程的使用情况,第二为线程内的方法栈调用情况。 ![GitHub Logo](../../figures/Web/threadinfo.jpg) + #### 进程、线程和方法数据的框选功能 -可以对线程的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,包含线程运行状态,线程调用栈的统计情况。当框选的数据中同时存在线程运行状态和线程调用栈数据,下方的弹出层中就会出现多个tab选项,可以进行切换。 + +可以对线程的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,包含线程运行状态,线程调用栈的统计情况。当框选的数据中同时存在线程运行状态和线程调用栈数据,下方的弹出层中就会出现多个 tab 选项,可以进行切换。 下图是线程运行状态框选统计信息,包括进程名、进程号、线程名、线程号、线程状态、状态持续时间、平均持续时间、该线程状态发生的次数。 ![GitHub Logo](../../figures/Web/threadselect.jpg) 下图是线程调用栈框选统计信息,包括方法名、持续时间、平均持续时间、调用的次数。 ![GitHub Logo](../../figures/Web/callstackselect.jpg) + #### 进程、线程和方法数据的单选功能 -单选线程的state数据时,会展示当前选中线程的状态数据,开始时间和持续时长,线程状态,所在进程名称。 + +单选线程的 state 数据时,会展示当前选中线程的状态数据,开始时间和持续时长,线程状态,所在进程名称。 ![GitHub Logo](../../figures/Web/threadclick.jpg) 单选调用栈数据,单击方法会在选中的方法外层加上黑色边框,能够突出当前选中的方法,弹出层中会展示当前方法的名称、开始时间和运行时长信息。 ![GitHub Logo](../../figures/Web/callstackclick.jpg) + #### 线程的跳转功能 -点击画红框处的带箭头的标志,会从CPU的线程概览视图跳转到线程的详情视图,同时从线程的详情视图也能跳转到CPU的线程概览视图。 + +点击画红框处的带箭头的标志,会从 CPU 的线程概览视图跳转到线程的详情视图,同时从线程的详情视图也能跳转到 CPU 的线程概览视图。 ![GitHub Logo](../../figures/Web/jumpthread.jpg) -### trace的其他功能 + +### trace 的其他功能 + #### 小旗标志的功能 + 将选中数据的时间点通过小旗的方式在时间轴上展示,直观的展示选中数据的时间。 ![GitHub Logo](../../figures/Web/flag.jpg) -在下方输入空输入文字:我是trace,可以给小旗打备注。 +在下方输入空输入文字:我是 trace,可以给小旗打备注。 ![GitHub Logo](../../figures/Web/flaginput.jpg) + #### 收藏置顶功能 + 鼠标移动到某个页签,会出现星形的标志,点击该星形,可以将该行收藏置顶。 ![GitHub Logo](../../figures/Web/stars.jpg) + #### 勾选功能 -框选某一区域,该区域左边会出现CheckBox的复选框,选中的区域的复选框会出现打勾的状态,可以取消勾选,也可以重新勾选。 + +框选某一区域,该区域左边会出现 CheckBox 的复选框,选中的区域的复选框会出现打勾的状态,可以取消勾选,也可以重新勾选。 ![GitHub Logo](../../figures/Web/checkbox.jpg) + #### 搜索功能 + 在搜索框中,可以输入线程,线程号等搜索自己想要的信息,搜索完成会高亮显示。 ![GitHub Logo](../../figures/Web/search.jpg) 在搜索框中输入调用栈的方法名,会跳转到对应的调用栈。 ![GitHub Logo](../../figures/Web/searchcallstack.jpg) -#### M键测量功能 -放大trace中的色块,选中色块,键盘按下M,会出现像尺子一样的形状。 -![GitHub Logo](../../figures/Web/M.jpg) \ No newline at end of file + +#### M 键测量功能 + +放大 trace 中的色块,选中色块,键盘按下 M,会出现像尺子一样的形状。 +![GitHub Logo](../../figures/Web/M.jpg) diff --git a/ide/src/doc/md/quickstart_web_record.md b/ide/src/doc/md/quickstart_web_record.md index f2b3493b3ece12ae72af66746f2a4c9b40aa2cb8..efcf14b6d7d95497fcf8e62ef92bc1da3452a125 100644 --- a/ide/src/doc/md/quickstart_web_record.md +++ b/ide/src/doc/md/quickstart_web_record.md @@ -1,30 +1,37 @@ -# web端抓取trace说明 -从web端抓取trace文件的配置和方法。 +# web 端抓取 trace 说明 + +从 web 端抓取 trace 文件的配置和方法。 + ## 界面配置说明 + ![GitHub Logo](../../figures/hdc/hdc.jpg) 说明: -* Record:trace抓取按钮。 -* Add HDC Device:连接设备。 -## trace文件的在线抓取 -点击Add HDC Device在弹出的框里选择HDC-配对,点击连接,连接设备。 + +- Record:trace 抓取按钮。 +- Add HDC Device:连接设备。 + +## trace 文件的在线抓取 + +点击 Add HDC Device 在弹出的框里选择 HDC-配对,点击连接,连接设备。 ![GitHub Logo](../../figures/hdc/Device.jpg) -点击Probes config,如选择抓取Scheduling details。 +点击 Probes config,如选择抓取 Scheduling details。 ![GitHub Logo](../../figures/hdc/Schedulingdetails.jpg) 抓取项说明: - * Scheduling details:线程切换事件,暂停恢复方法,线程唤醒事件,进程退出和销毁处理,新建线程处理方法,线程重命名处理方法。 - * CPU Frequency and idle states:CPU频率信息和CPU空闲状态。 - * Advanced ftrace config:线程切换事件,暂停恢复方法,线程唤醒事件,进程退出和销毁处理,新建线程处理方法,线程重命名处理方法,IRQ事件,时钟频率处理方法,Binder事件,线程调用堆栈开始和结束的处理。 - * AbilityMonitor:进程的CPU,内存,磁盘,网络使用情况。 - * Kernel meminfo:内核内存。 - * Virtual memory stats:系统虚拟内存。 - * Hitrace categories:Bytrace的抓取项,各解释项说明如下图: -![GitHub Logo](../../figures/hdc/bytacedescription.jpg) - -再点击Record setting,在output file path输入文件名hiprofiler_data_example.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 + +- Scheduling details:线程切换事件,暂停恢复方法,线程唤醒事件,进程退出和销毁处理,新建线程处理方法,线程重命名处理方法。 +- CPU Frequency and idle states:CPU 频率信息和 CPU 空闲状态。 +- Advanced ftrace config:线程切换事件,暂停恢复方法,线程唤醒事件,进程退出和销毁处理,新建线程处理方法,线程重命名处理方法,IRQ 事件,时钟频率处理方法,Binder 事件,线程调用堆栈开始和结束的处理。 +- AbilityMonitor:进程的 CPU,内存,磁盘,网络使用情况。 +- Kernel meminfo:内核内存。 +- Virtual memory stats:系统虚拟内存。 +- Hitrace categories:Bytrace 的抓取项,各解释项说明如下图: + ![GitHub Logo](../../figures/hdc/bytacedescription.jpg) + +再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_example.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 ![GitHub Logo](../../figures/hdc/examplerecord.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击Record。 +点击 Trace command,就会根据上面的配置生成抓取命令,点击 Record。 ![GitHub Logo](../../figures/hdc/record.jpg) 抓取过程中,上方会给出提示正在抓取,并显示出抓取时长。 ![GitHub Logo](../../figures/hdc/hdctracing.jpg) -抓取完成后,界面会自动加载展示trace文件。 -![GitHub Logo](../../figures/hdc/hdcfile.jpg) \ No newline at end of file +抓取完成后,界面会自动加载展示 trace 文件。 +![GitHub Logo](../../figures/hdc/hdcfile.jpg) diff --git a/ide/src/doc/quickstart_Application_operation_skills.html b/ide/src/doc/quickstart_Application_operation_skills.html index b57f6b1fb99e2e88e4bbf34419d08298676e74cc..255e9c0fe8e5a8cdc3e7a7460b006e9444c8c9ea 100644 --- a/ide/src/doc/quickstart_Application_operation_skills.html +++ b/ide/src/doc/quickstart_Application_operation_skills.html @@ -799,9 +799,13 @@ GitHub Logo
以NativeMemory举例,导入NativeMemory文件,点击Call info的Tab页,在搜索框中输入libnative_hook.z.so,会发现该so下的调用栈没有符号化完全。
- GitHub Logo
+ GitHub Logo
将本地编译的so通过导入按钮导入,本地导入路径是import/system/lib64/libnative_hook.z.so,红框处是导入按钮
- GitHub Logo
+ GitHub Logo
导入so以后,在搜索框中输入libnative_hook.z.so,会发现符号化数据已经更新
GitHub Logo

@@ -816,8 +820,7 @@
  •  蓝色框:是Smartperf工具的url(https://localhost:9000/application/)。
    -
    +
  • @@ -825,19 +828,155 @@
                   第一部分是?trace=(固定格式)。
                   第二部分是trace文件的url(https://iot.itocm.com:9001/upload/ftrace_small.txt),此处根据文件的url实际地址填写。
                   第三部分,&link=true(固定格式)。
    -
    +
  • +

    Tab页信息和泳道图可跳转(点击和框选场景,框选类似搜索)

    + +

    + 泳道图高亮场景:框选Cpu Frequency 或者Cpu State泳道图后,弹出Cpu Frequency或Cpu State + Tab页,在点击Tab页表格的行时,框选范围泳道图的当前行的Value值一样的部分上方会出现一条以圆点开头颜色比趋势图颜色同色但稍深的粗线条,如下图:
    + GitHub Logo
    + 搜索场景:框选函数调用栈的泳道图,弹出Slices + Tab页,点击表格行,会跳转到框选范围内的第一条调用栈的位置,点击下图Slices Tab页的H:FlushVsync调用栈。
    + GitHub Logo
    + 会跳转到H:FlushVsync调用栈的位置。
    + GitHub Logo +

    +

    Tab页中start time支持绝对时间

    + +

    + 在有startTime的点选Tab页(目前有PurgeTotal、PurgePin、Current + Selection三个)中添加绝对时间,startTime是以抓取时间为参考,开始抓取时间为0,取当前点选数据的startTs属性即可,绝对时间是数据上报的时间显示,如下图:
    + GitHub Logo +

    +

    支持基于优先级的线程状态展示

    + +

    + Sched Priority + Tab页,按优先级显示调度,显示框选范围内所有Running以及Running之前的Runnable线程的最小,最大,平均耗时。
    + GitHub Logo +

    +

    内容支持宽度可伸缩

    + +

    + 原来表格的单元格宽度是设置好的,有些单元格里的内容比较长,看不到全部,现在每行的表头添加一个灰色竖线,拖动时单元格宽度随之改变。
    + GitHub Logo +

    +

    一键展开和收起,逐级展开和收起

    + +

    + 将树形表格全部改为默认收起,在表头左上角添加双尖箭头图标,默认箭头朝外,点击图标,表格的每一层都展开,图标上的箭头改为朝里面,再次点击表格每一层都收起,图标上的箭头改为朝外面
    + GitHub Logo +

    +

    + 支持shift+m多次框选,框选列表显示和操作(跳转,取消),快捷键跳转ctrl+[/]和一键取消 +

    + +

    + 每次框选泳道图后,按下shift+m键,在当前框选的开始和结束位置出现卡尺,如果只按下m键,会将上一次按m键出现的卡尺清除,在当前框选位置画卡尺,页面上每个卡尺都放进tab页中,在tab页中可以给卡尺改变颜色和移除旗子。用快捷键改变当前选中的卡尺。按下快捷键“ctrl+[”或“ctrl+]”的时候,会跳转到当前选中卡尺的上\下一个卡尺上,也就是上\下一个卡尺两侧变为实心,对应表格中的那行背景颜色变浅蓝色。 +

    +

    + 旗子标记可快速跳转,框选列表显示和操作(跳转,取消),快捷跳转ctrl+;/’和一键取消 +

    + +

    + 在时间刻度下方点击会出现旗子和tab页,每次点击都将旗子都放进tab页中,在tab页中可以给旗子改变颜色和移除旗子。用快捷键改变当前选中的旗子。按下快捷键“ctrl+,”或“ctrl+.”的时候,会跳转到当前选中旗子的上\下一个旗子上,也就是上\下一个旗子变为实心有旗杆,对应表格中的那行背景颜色变浅蓝色。
    + GitHub Logo +

    +

    泳道图支持一键收起和展开(收起前的状态)

    + +

    + 点击时间刻度的最左边的双箭头,可以对已展开的泳道图进行一键收起和展开
    + GitHub Logo +

    +

    单个泳道图显示为多行时可折叠为1行(收藏和非收藏)

    + +

    + 单个泳道图点击会将泳道图折叠为一行,折腾后的字体是蓝色。
    + GitHub Logo +

    +

    已支持的泳道图按照模板分类显示,NaitveMemory,Hisysevent,应用内存等

    + +

    + 导入trace文件后,页面右上角的出现漏斗图标,点击会出现Display Template页面,Template + Select区域显示已经添加到显示模板中的泳道图,每类泳道图后面会有一个多选框,默认不勾选,如果勾选页面上就只保留勾选的泳道图。
    + GitHub Logo +

    +

    所有进程的用户输入事件归一显示,观察操作事件和对象

    + +

    + 对于用户InputEvent会绘制到固定的泳道图。
    + GitHub Logo +

    +

    支持收藏的泳道图整体画布可伸缩

    + +

    + 收藏以后的泳道图可以在红线位置处上下伸缩拖动。
    + GitHub Logo +

    +

    用户自定义分组化收藏(2组),及一键取消所有收藏

    + +

    + 选择界面上的G1和G2,可以根据自己的需求将泳道图收藏到对应G1或者G2中,点击G1和G2旁边的星号可以一键取消所有收藏。
    + GitHub Logo +

    +

    trace顶部的cpu负载预览颜色随着负载降低,亮度降低的能力对比度提升

    + +

    + 原来表示负载的颜色利用了透明度,对比不够明显,此次修改利用颜色的亮度,负载越大颜色更深,最深的接近黑色,负载越小颜色越浅,最浅的的为白色。
    + GitHub Logo +

    +

    + 导航栏/泳道图背景颜色支持颜色可选,字体颜色可感知slice的颜色而进行变化,颜色动态可配 +

    + +

    + 给用户提供两种模式,浅色模式(导航栏白底黑字,泳道图颜色偏淡)和深色模式(导航栏黑底白字,泳道图颜色偏深),点击最左下方的小桶标志用户可以按需选择,并且用户可以自定义systemTrace页面的颜色,给用户更多自由,自己动手设置自己喜欢的颜色,提升用户体验。
    + GitHub Logo +

    +

    高阶debug sql指导:Sample queries,比如CPU,线程,内存,io的等

    + +

    + 用户根据需要了解的trace数据,可以点击预置好的sql查询出对应的数据。
    + GitHub Logo +

    +

    鼠标滚轮放大、缩小(已支持),ctrl+滚轮左右拖动跟手性优化

    + +

    用户可以利用鼠标滚轮对界面进行放大和缩小,ctrl+滚轮左右拖动。

    +

    历史搜索关键字可显示/可选择查找

    + +

    + 在搜索框里的关键字可以保留显示,用户可以直接选择对应的关键字进行搜索,点击删除也可以将关键字删除。
    + GitHub Logo +

    +

    线程唤醒关系树

    + +

    + 线程唤醒关系树功能是指在系统打开trace文件解析完成之后,在CPU泳道图上点选,可以查看该线程Slice的唤醒关系树,点击GetWakeupList会以链式结构和表格分别在泳道图和tab上展示线程的唤醒关系树信息,点击GetWakeupList按钮旁边的星号按钮可以对唤醒树对应的泳道图一键收藏。
    + GitHub Logo +

    +

    Trace抓取动态可停

    + +

    + 在抓取trace过程中,点击StopRecord按钮会对抓取命令进行启停,等待抓取停止命令返回后,将生成的文件拉取下来进行文件的解析。
    + GitHub Logo +

    +

    Smartperf web端集成hdc命令能力

    + +

    + 在现有的配置界面上,新增一个Web版本的shell界面,可以支持shell命令
    + GitHub Logo +

    - + + + + + + + diff --git a/ide/src/doc/quickstart_app_startup.html b/ide/src/doc/quickstart_app_startup.html index ad983ba732d10c848150320c49494a264233b110..ce0107c86155c73cef5234249762191940d95568 100644 --- a/ide/src/doc/quickstart_app_startup.html +++ b/ide/src/doc/quickstart_app_startup.html @@ -1,539 +1,253 @@ - - - quickstart_app_startup - - - - - -
    -

    App startup的抓取和展示说明

    - -

    - 应用启动分析功能主要是提供应用启动分析模板帮助系统调优人员做应用启动慢场景问题分析,快速查找系统侧启动慢阶段和耗时长调用栈信息。 -

    -

    App startup抓取参数的配置

    - -

    - GitHub Logo
    - 配置项说明: -

    -
      -
    • + + + +
      +

      App startup的抓取和展示说明

      +

      + 应用启动分析功能主要是提供应用启动分析模板帮助系统调优人员做应用启动慢场景问题分析,快速查找系统侧启动慢阶段和耗时长调用栈信息。 +

      +

      App startup抓取参数的配置

      + +

      + GitHub Logo
      + 配置项说明: +

      +
        +
      •  App startup:配置项的总开关。
        -
        -
      • -
      -

      App startup展示说明

      - -

      将抓取的App startup文件导入到smartperf工具中,查看应用启动各阶段耗时的情况。

      -

      App startup泳道图展示

      - -

      - App startup的泳道图展示:
      - GitHub Logo
      - 应用启动包括六个阶段,分别是Process Creating(应用进程创建阶段)、Application Launching(加载应用阶段)、UI Ability - Launching(加载UI Ability)、UI Ability OnForeground(应用进入前台)、First Frame - APP - Phase(首帧渲染提交-应用)、First Frame - Render Phase(首帧渲染提交-Render - Service)。每个阶段的Slice上都会显示出该阶段的时延。 -

      -

      App startup泳道图点选功能

      - -

      - 可以对启动各个阶段的Slice进行点选,点选后在最下方的弹出层中会展示点选数据的统计的tab页。
      - 以Process Creating的Slice点选为例:
      - GitHub Logo -

      -
        -
      • + +
      • +
      +

      App startup展示说明

      + +

      将抓取的App startup文件导入到smartperf工具中,查看应用启动各阶段耗时的情况。

      +

      App startup泳道图展示

      + +

      + App startup的泳道图展示:
      + GitHub Logo
      + 应用启动包括六个阶段,分别是Process Creating(应用进程创建阶段)、Application Launching(加载应用阶段)、UI Ability + Launching(加载UI Ability)、UI Ability OnForeground(应用进入前台)、First Frame - APP + Phase(首帧渲染提交-应用)、First Frame - Render Phase(首帧渲染提交-Render + Service)。每个阶段的Slice上都会显示出该阶段的时延。 +

      +

      App startup泳道图点选功能

      + +

      + 可以对启动各个阶段的Slice进行点选,点选后在最下方的弹出层中会展示点选数据的统计的tab页。
      + 以Process Creating的Slice点选为例:
      + GitHub Logo +

      +
        +
      •  StartTime(Relative): 应用启动开始时间(相对时间)。
        -
        -
      • -
      • + +
      • +
      •  StartTime(Absolute): 应用启动开始时间(绝对时间)。
        -
        -
      • -
      • + +
      • +
      •  EndTime(Relative):应用启动的结束时间(相对时间)。
        -
        -
      • -
      • + +
      • +
      •  EndTime(Absolute):应用启动的结束时间(绝对时间)。
        -
        -
      • -
      • + +
      • +
      •  Duration:应用启动的持续时间。
        -
        -
      • -
      -

      App startup泳道图Tab页跳转功能

      - -

      - 点击各阶段的起始或者结束时间后面的跳转图标,跳转至关联Slice,并显示该Slice的详细信息。
      - 以Process Creating的跳转为例:
      - GitHub Logo
      - 跳转说明: -

      -
        -
      • + +
      • +
      +

      App startup泳道图Tab页跳转功能

      + +

      + 点击各阶段的起始或者结束时间后面的跳转图标,跳转至关联Slice,并显示该Slice的详细信息。
      + 以Process Creating的跳转为例:
      + GitHub Logo
      + 跳转说明: +

      +
        +
      •  StartTime(Relative)的跳转: 跳转到H:virtual int OHOS::AAFwk::AbilityManagerService::StartAbility关键字函数。
        -
        -
      • -
      • + +
      • +
      •  EndTime(Relative)的跳转: 跳转到H:virtual void OHOS::AppExecFwk::AppMgrServiceInner::AttachApplication关键字函数,并且调用栈要带##应用名,如##com.ohos.smartperf。
        -
        -
      • -
      -

      App startup泳道图的框选功能

      - -

      - 应用启动阶段泳道图框选功能主要是框选启动分析泳道图之后,统计应用各个启动阶段的耗费时长信息。
      - GitHub Logo -

      -
        -
      • + +
      • +
      +

      App startup泳道图的框选功能

      + +

      + 应用启动阶段泳道图框选功能主要是框选启动分析泳道图之后,统计应用各个启动阶段的耗费时长信息。
      + GitHub Logo +

      +
        +
      •  Process / Startup: 应用名称和启动阶段名称。
        -
        -
      • -
      • + +
      • +
      •  Duration:应用各阶段启动时长。
        -
        -
      • -
      • + +
      • +
      •  %:应用各阶段启动时长的占比。
        -
        -
      • -
      -

      So初始化泳道图展示

      - -

      - So初始化的泳道图展示:
      - GitHub Logo -

      -

      So初始化泳道图的点选功能

      - -

      - 点选So初始化的Slice,展示该so初始化信息的tab页。
      - GitHub Logo -

      -
        -
      • + +
      • +
      +

      So初始化泳道图展示

      + +

      + So初始化的泳道图展示:
      + GitHub Logo +

      +

      So初始化泳道图的点选功能

      + +

      + 点选So初始化的Slice,展示该so初始化信息的tab页。
      + GitHub Logo +

      +
        +
      •  Name:So的名称。
        -
        -
      • -
      • + +
      • +
      •  StartTime(Relative):So初始化开始时间(相对时间)。
        -
        -
      • -
      • + +
      • +
      •  StartTime(Absolute):So初始化开始时间(绝对时间)。
        -
        -
      • -
      • + +
      • +
      •  Duration:So初始化耗时。
        -
        -
      • -
      -

      So初始化泳道图Tab页跳转功能

      - -

      - 点击So初始化开始时间后面的跳转图标,跳转至关联Slice,并显示该Slice的详细信息。
      - GitHub Logo
      - 跳转说明: -

      -
        -
      • + +
      • +
      +

      So初始化泳道图Tab页跳转功能

      + +

      + 点击So初始化开始时间后面的跳转图标,跳转至关联Slice,并显示该Slice的详细信息。
      + GitHub Logo
      + 跳转说明: +

      +
        +
      •  StartTime(Relative)的跳转: 跳转到dlopen:  system/lib64/extensionability/libinputmethod_extension_module.z.so。
        -
        -
      • -
      -

      So初始化泳道图的框选功能

      - -

      - So初始化泳道图框选功能主要是框选So初始化泳道图之后,统计各个进程下各个So的初始化耗费时长信息。
      - GitHub Logo -

      -
        -
      • + +
      • +
      +

      So初始化泳道图的框选功能

      + +

      + So初始化泳道图框选功能主要是框选So初始化泳道图之后,统计各个进程下各个So的初始化耗费时长信息。
      + GitHub Logo +

      +
        +
      •  Process / Lib: 应用名称和So名称。
        -
        -
      • -
      • + +
      • +
      •  Duration:So的耗费时长。
        -
        -
      • -
      -
      - - - + +
    • +
    +
    + + + diff --git a/ide/src/doc/quickstart_arkts.html b/ide/src/doc/quickstart_arkts.html index 0fa3d112bc2438d447956e844c02eba5b19e23e0..9edcb0f5e1f61fec02dcce4d1e0cb680d20b9a73 100644 --- a/ide/src/doc/quickstart_arkts.html +++ b/ide/src/doc/quickstart_arkts.html @@ -1,538 +1,252 @@ - - - quickstart_arkts - - - - -
    -

    Cpuprofiler抓取和展示说明

    - -

    Cpuprofiler模板帮助ArkTs开发和测试分析虚拟机层执行开销大问题,提供Ts层耗时长函数和阶段。

    -

    Cpuprofiler的抓取

    - -

    Cpuprofiler的抓取配置参数

    - -

    - 打开Start Ark Ts Record总开关下面的Start cpu profiler开关抓取cpuprofiler数据。
    - GitHub Logo -

    -

    Cpuprofiler展示说明

    - -

    - 将抓取的cpuprofiler文件导入到smartperf中,查看Ts层耗时长的函数和阶段。
    - GitHub Logo -

    -

    Cpuprofiler的泳道图悬浮显示

    - -

    - 鼠标放到泳道图的Slice上会有悬浮框显示。
    - GitHub Logo -

    -
      -
    • + + + +
      +

      Cpuprofiler抓取和展示说明

      + +

      Cpuprofiler模板帮助ArkTs开发和测试分析虚拟机层执行开销大问题,提供Ts层耗时长函数和阶段。

      +

      Cpuprofiler的抓取

      + +

      Cpuprofiler的抓取配置参数

      + +

      + 打开Start Ark Ts Record总开关下面的Start cpu profiler开关抓取cpuprofiler数据。 +
      + GitHub Logo +

      +

      Cpuprofiler展示说明

      + +

      + 将抓取的cpuprofiler文件导入到smartperf中,查看Ts层耗时长的函数和阶段。 +
      + GitHub Logo +

      +

      Cpuprofiler的泳道图悬浮显示

      + +

      + 鼠标放到泳道图的Slice上会有悬浮框显示。 +
      + GitHub Logo +

      +
        +
      •  Name : 函数名。
         
        -
      • -
      • + > +
      • +
      •  Self Time: 函数自身执行时间(不包含其调用者)。
         
        -
      • -
      • + > +
      • +
      •  Total Time : 函数自身及调用者的调用时间总和。
         
        -
      • -
      • + > +
      • +
      •  Url : 函数所在的文件名称。
         
        -
      • -
      -

      Cpuprofiler泳道图的点选和框选功能

      - -

      - 点选或者框选泳道图上函数名的Slice,会显示Js Profiler Statistics,Js Profiler CallTree,Js Profiler - BottomUp的Tab页信息。
      - Js Profiler Statistics的Tab页显示数据的维度信息,以饼图和Table表的方式展示,如下图:
      - GitHub Logo
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      Cpuprofiler泳道图的点选和框选功能

      + +

      + 点选或者框选泳道图上函数名的Slice,会显示Js Profiler Statistics,Js Profiler CallTree,Js Profiler + BottomUp的Tab页信息。 +
      + Js Profiler Statistics的Tab页显示数据的维度信息,以饼图和Table表的方式展示,如下图: +
      + GitHub Logo +
      + GitHub Logo +

      +
        +
      •  Type : 维度名称,有九大维度(NAPI、ARKUI_ENGINE、BUTLTIN、GC、AINT、CINT、AOT、RUNTIME、OTHER)。
         
        -
      • -
      • + > +
      • +
      •  Total : 时间。
         
        -
      • -
      • + > +
      • +
      •  % : 时间占比。
         
        -
      • -
      -

      - Js Profiler CallTree的Tab页把name,url,depth,parent相同的函数合并,构建成一个top - down的树结构,以树形表格的形式显示,表格中显示函数调用关系,如下图:
      - GitHub Logo
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Js Profiler CallTree的Tab页把name,url,depth,parent相同的函数合并,构建成一个top + down的树结构,以树形表格的形式显示,表格中显示函数调用关系,如下图: +
      + GitHub Logo +
      + GitHub Logo +

      +
        +
      •  Symbol : 函数名。
         
        -
      • -
      • + > +
      • +
      •  Self Time: 函数自身执行时间(不包含其调用者)。
         
        -
      • -
      • + > +
      • +
      •  Total Time : 函数自身及调用者的调用时间总和。
         
        -
      • -
      -

      - Js Profiler BottomUp的Tab页把name,url,depth,parent相同的函数合并,构建成一个bottom - up的树结构,以树形表格的形式显示,只不过作为根节点的是被调用者,表格中显示函数被调用关系,如下图:
      - GitHub Logo
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Js Profiler BottomUp的Tab页把name,url,depth,parent相同的函数合并,构建成一个bottom + up的树结构,以树形表格的形式显示,只不过作为根节点的是被调用者,表格中显示函数被调用关系,如下图: +
      + GitHub Logo +
      + GitHub Logo +

      +
        +
      •  Symbol : 函数名。
         
        -
      • -
      • + > +
      • +
      •  Self Time: 函数自身执行时间(不包含其调用者)。
         
        -
      • -
      • + > +
      • +
      •  Total Time : 函数自身及调用者的调用时间总和。
         
        -
      • -
      -

      Cpuprofiler的Heaviest Stack功能

      - -

      - Js Profiler CallTree的Tab页的Heaviest Stack表格显示的是选中的函数的完整的调用栈。
      - GitHub Logo
      - Js Profiler BottomUp的Tab页的Heaviest Stack表格显示的是选中的函数的完整的逆序调用栈。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      Cpuprofiler的Heaviest Stack功能

      + +

      + Js Profiler CallTree的Tab页的Heaviest Stack表格显示的是选中的函数的完整的调用栈。 +
      + GitHub Logo +
      + Js Profiler BottomUp的Tab页的Heaviest Stack表格显示的是选中的函数的完整的逆序调用栈。 +
      + GitHub Logo +

      +
        +
      •  Symbol : 函数名。
         
        -
      • -
      • + > +
      • +
      •  Total Time : 函数自身及调用者的调用时间总和。
         
        -
      • -
      • + > +
      • +
      •  % : 总时间占比。
         
        -
      • -
      -
      - - - + > +
    • +
    +
    + + + diff --git a/ide/src/doc/quickstart_hilog.html b/ide/src/doc/quickstart_hilog.html new file mode 100644 index 0000000000000000000000000000000000000000..7c9528d1abab9262086d52aad15b5a181cbd46f2 --- /dev/null +++ b/ide/src/doc/quickstart_hilog.html @@ -0,0 +1,887 @@ + + + + + quickstart_hilog + + + + + + +
    +

    Hilog抓取和展示说明

    + +

    Hilog分析模块主要展示系统日志信息。

    +

    Hilog的抓取

    + +

    Hilog的抓取配置参数

    + +

    + 打开Hilog开关抓取taskpool数据。
    + GitHub Logo +

    +

    Hilog展示说明

    + +

    + 将抓取的hilog文件导入到smartperf中,查看日志信息。
    + GitHub Logo +

    +

    Hilog泳道图的框选功能

    + +

    + 框选Hilog的泳道图,展示Hilog的tab页,Log Level可以选择日志级别,也能根据Tag,Process name,Message去搜索。
    + GitHub Logo +

    +
      +
    • +
      +Timestamp: 时间戳信息。
      +
      +
    • +
    • +
      +Time: 日志的显示时间。
      +
      +
    • +
    • +
      +Level:日志级别。
      +
      +
    • +
    • +
      +Tag:日志的tag。
      +
      +
    • +
    • +
      +Process name:进程名。
      +
      +
    • +
    • +
      +Message:日志具体信息。
      +
      +
    • +
    +

    + 框选Hilog的泳道图,展示Summary的tab页。
    + GitHub Logo +

    +
      +
    • +
      +Level/Process/Tag/Message: 根据类别显示日志。
      +
      +
    • +
    • +
      +Count: 各级别日志的条数。
      +
      +
    • +
    +
    + + + + diff --git a/ide/src/doc/quickstart_memory_template.html b/ide/src/doc/quickstart_memory_template.html index 1a30ce5e413f8b5cf8b089f5155f45e7aba9f679..ebbe64ce5bac8b7757a54204afdd80dcbb24c158 100644 --- a/ide/src/doc/quickstart_memory_template.html +++ b/ide/src/doc/quickstart_memory_template.html @@ -1,540 +1,254 @@ - - - quickstart_memory_template - - - - - - -
    -

    系统内存抓取和展示说明

    - -

    系统内存分析模板帮助系统内存调优人员进行进程内存拆解。

    -

    系统内存的抓取

    - -

    系统内存的抓取配置参数

    - -

    - 打开VM Tracker开关抓取内存数据。
    - GitHub Logo -

    -

    系统内存展示说明

    - -

    - 将抓取的内存文件导入到smartperf中,查看进程内存的情况。
    - GitHub Logo -

    -

    系统内存中Ability Monitor泳道图显示

    - -

    - Ability Monitor泳道图分为MemoryTotal,Cached,SwapTotal,System Purgeable Total,System Purgeable Pin,DMA,Skia - Gpu Memory泳道。
    - GitHub Logo -

    -

    系统内存中Ability Monitor泳道图点选功能

    - -

    - System Purgeable Total泳道图点选功能。
    - GitHub Logo -

    -
      -
    • + + @media screen and (max-width: 450px) { + html body[for='html-export']:not([dpm])[hsst] .smartperf-preview { + width: 99%; + } + } + + html body[for='html-export']:not([dpm]):not([hsst]) .smartperf-preview { + left: 50%; + transform: translateX(-50%); + } + + html body[for='html-export']:not([dpm]):not([hsst]) .md-sidebar-toc { + display: none; + } + + + +
      +

      系统内存抓取和展示说明

      + +

      系统内存分析模板帮助系统内存调优人员进行进程内存拆解。

      +

      系统内存的抓取

      + +

      系统内存的抓取配置参数

      + +

      + 打开VM Tracker开关抓取内存数据。 +
      + GitHub Logo +

      +

      系统内存展示说明

      + +

      + 将抓取的内存文件导入到smartperf中,查看进程内存的情况。 +
      + GitHub Logo +

      +

      系统内存中Ability Monitor泳道图显示

      + +

      + Ability Monitor泳道图分为MemoryTotal,Cached,SwapTotal,System Purgeable Total,System Purgeable Pin,DMA,Skia + Gpu Memory泳道。 +
      + GitHub Logo +

      +

      系统内存中Ability Monitor泳道图点选功能

      + +

      + System Purgeable Total泳道图点选功能。 +
      + GitHub Logo +

      +
        +
      •  TimeStamp:时间戳。
         
        -
      • -
      • + > +
      • +
      •  ActivePurg:当前时间点的ActivePurg内存。
         
        -
      • -
      • + > +
      • +
      •  InActivePurg:当前时间点的InActivePurg内存。
         
        -
      • -
      • + > +
      • +
      •  ShmPurg:当前时间点的ShmPurg内存。
         
        -
      • -
      -

      - System Purgeable Total泳道图框选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + System Purgeable Total泳道图框选功能。 +
      + GitHub Logo +

      +
        +
      •  Type:内存的类别。
         
        -
      • -
      • + > +
      • +
      •  AvgSize:当前内存的平均值。
         
        -
      • -
      • + > +
      • +
      •  MaxSize:当前内存的最大值。
         
        -
      • -
      • + > +
      • +
      •  MinSize:当前内存的最小值。
         
        -
      • -
      -

      - System Purgeable Pin泳道图点选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + System Purgeable Pin泳道图点选功能。 +
      + GitHub Logo +

      +
        +
      •  TimeStamp:时间戳。
         
        -
      • -
      • + > +
      • +
      •  PinedPurg:当前时间点的PinedPurg内存。
         
        -
      • -
      • + > +
      • +
      •  ShmPurg:当前时间点的ShmPurg内存。
         
        -
      • -
      -

      - System Purgeable Pin泳道图框选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + System Purgeable Pin泳道图框选功能。 +
      + GitHub Logo +

      +
        +
      •  Type:内存的类别。
         
        -
      • -
      • + > +
      • +
      •  AvgSize:当前内存的平均值。
         
        -
      • -
      • + > +
      • +
      •  MaxSize:当前内存的最大值。
         
        -
      • -
      • + > +
      • +
      •  MinSize:当前内存的最小值。
         
        -
      • -
      -

      - DMA泳道图点选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + DMA泳道图点选功能。 +
      + GitHub Logo +

      +
        +
      •  TimeStamp:时间戳。
         
        -
      • -
      • + > +
      • +
      •  Process(pid):进程名(进程ID)。
         
        -
      • -
      • + > +
      • +
      •  Fd:DMA内存文件描述符。
         
        -
      • -
      • + > +
      • +
      •  Size:DMA内存大小。
         
        -
      • -
      • + > +
      • +
      •  Ino:Ino值。
         
        -
      • -
      • + > +
      • +
      •  ExpPid:申请者的进程号。
         
        -
      • -
      • + > +
      • +
      •  ExpTaskComm:ExpTaskComm的值。
         
        -
      • -
      • + > +
      • +
      •  BufName:DMA内存名。
         
        -
      • -
      • + > +
      • +
      •  ExpName:申请者的进程名。
         
        -
      • -
      • + > +
      • +
      •  Flag:去重标记,0表示正常,1表示进程内部重复数据,2表示进程间重复数据。
         
        -
      • -
      -

      - DMA泳道图框选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + DMA泳道图框选功能。 +
      + GitHub Logo +

      +
        +
      •  Process(pid):进程名(进程ID)。
         
        -
      • -
      • + > +
      • +
      •  SumSize:DMA内存总量。
         
        -
      • -
      • + > +
      • +
      •  AvgSize:DMA内存的平均值。
         
        -
      • -
      • + > +
      • +
      •  MaxSize:DMA内存的最大值。
         
        -
      • -
      • + > +
      • +
      •  MinSize:DMA内存的最小值。
         
        -
      • -
      -

      - Skia Gpu Memory泳道图点选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Skia Gpu Memory泳道图点选功能。 +
      + GitHub Logo +

      +
        +
      •  TimeStamp:时间戳。
         
        -
      • -
      • + > +
      • +
      •  GpuName:Gpu名称。
         
        -
      • -
      • + > +
      • +
      •  Process(pid):进程名(进程ID)。。
         
        -
      • -
      • + > +
      • +
      •  Size:对应进程的Gpu的使用size。
         
        -
      • -
      -

      - Skia Gpu Memory泳道图框选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Skia Gpu Memory泳道图框选功能。 +
      + GitHub Logo +

      +
        +
      •  GpuName:Gpu名称。
         
        -
      • -
      • + > +
      • +
      •  Process(pid):进程名(进程ID)。
         
        -
      • -
      • + > +
      • +
      •  SumSize:Gpu内存总量。
         
        -
      • -
      • + > +
      • +
      •  AvgSize:Gpu内存的平均值。
         
        -
      • -
      • + > +
      • +
      •  MaxSize:Gpu内存的最大值。
         
        -
      • -
      • + > +
      • +
      •  MinSize:Gpu内存的最小值。
         
        -
      • -
      -

      VM Tracker下的smaps泳道图展示

      - -

      - smaps泳道图分为Dirty,Swapped,RSS,PSS,USS泳道图。
      - GitHub Logo -

      -

      VM Tracker下的smaps泳道图的点选和框选功能

      - -

      - 点选和框选Dirty,Swapped,RSS,PSS,USS的5个泳道图中任一个显示的都是一样的内容,会显示Smaps Statistic和Smaps - sample的tab页。
      - Smaps Statistic的tab页展示。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      VM Tracker下的smaps泳道图展示

      + +

      + smaps泳道图分为Dirty,Swapped,RSS,PSS,USS泳道图。 +
      + GitHub Logo +

      +

      VM Tracker下的smaps泳道图的点选和框选功能

      + +

      + 点选和框选Dirty,Swapped,RSS,PSS,USS的5个泳道图中任一个显示的都是一样的内容,会显示Smaps Statistic和Smaps + sample的tab页。 +
      + Smaps Statistic的tab页展示。 +
      + GitHub Logo +

      +
        +
      •  Type: 将抓取到的信息根据Type归类。
         
        -
      • -
      • + > +
      • +
      •  Path:虚拟内存块路径,类型中有多个则显示multiple。
         
        -
      • -
      • + > +
      • +
      •  Size:在该虚拟内存块路径下内存的size总和。
         
        -
      • -
      • + > +
      • +
      •  % of Res: 每行的Resident Size 占总Ressident Size的比例。
         
        -
      • -
      • + > +
      • +
      •  Count:统计的类型个数。
         
        -
      • -
      • + > +
      • +
      •  Rss: smaps节点中Rss。
         
        -
      • -
      • + > +
      • +
      •  Pss: smaps节点中Pss。
         
        -
      • -
      • + > +
      • +
      •  SharedClean: smaps节点中SharedClean。
         
        -
      • -
      • + > +
      • +
      •  SharedDirty:smaps节点中Shared_Dirty。
         
        -
      • -
      • + > +
      • +
      •  PrivateClean: smaps节点中PrivateClean。
         
        -
      • -
      • + > +
      • +
      •  PrivateDirty:smaps节点中PrivateDirty。
         
        -
      • -
      • + > +
      • +
      •  Swap:smaps节点中Swap。
         
        -
      • -
      • + > +
      • +
      •  SwapPss:smaps节点中SwapPss。
         
        -
      • -
      -

      - Smaps sample的tab页展示。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Smaps sample的tab页展示。 +
      + GitHub Logo +

      +
        +
      •  TimeStamp: 时间戳信息。
         
        -
      • -
      • + > +
      • +
      •  Type: 将抓取到的信息根据Type归类。
         
        -
      • -
      • + > +
      • +
      •  Path:虚拟内存块路径,类型中有多个则显示multiple。
         
        -
      • -
      • + > +
      • +
      •  Address Range:每段虚拟内存段的开始和结束位置。
         
        -
      • -
      • + > +
      • +
      •  Rss: smaps节点中Rss。
         
        -
      • -
      • + > +
      • +
      •  Pss: smaps节点中Pss。
         
        -
      • -
      • + > +
      • +
      •  SharedClean: smaps节点中SharedClean。
         
        -
      • -
      • + > +
      • +
      •  SharedDirty:smaps节点中Shared_Dirty。
         
        -
      • -
      • + > +
      • +
      •  PrivateClean: smaps节点中PrivateClean。
         
        -
      • -
      • + > +
      • +
      •  PrivateDirty:smaps节点中PrivateDirty。
         
        -
      • -
      • + > +
      • +
      •  Swap:smaps节点中Swap。
         
        -
      • -
      • + > +
      • +
      •  SwapPss:smaps节点中SwapPss。
         
        -
      • -
      • + > +
      • +
      •  Reside: Rss / Size 比值。
         
        -
      • -
      • + > +
      • +
      •  Protection: 内存块的权限(读写执行执行)。
         
        -
      • -
      -

      VM Tracker下的GPU泳道图展示

      - -

      - smaps泳道图分为GL,Skia Gpu Dump Toal,Skia Gpu Dump Window,Skia Gpu Memory泳道图。
      - GitHub Logo
      - Skia Gpu Memory泳道图点选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      VM Tracker下的GPU泳道图展示

      + +

      + smaps泳道图分为GL,Skia Gpu Dump Toal,Skia Gpu Dump Window,Skia Gpu Memory泳道图。 +
      + GitHub Logo +
      + Skia Gpu Memory泳道图点选功能。 +
      + GitHub Logo +

      +
        +
      •  TimeStamp:时间戳。
         
        -
      • -
      • + > +
      • +
      •  GpuName:Gpu名称。
         
        -
      • -
      • + > +
      • +
      •  Thread(tid):线程名(线程ID)。
         
        -
      • -
      • + > +
      • +
      •  Size:对应线程的Gpu的使用size。
         
        -
      • -
      -

      - Skia Gpu Memory泳道图框选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Skia Gpu Memory泳道图框选功能。 +
      + GitHub Logo +

      +
        +
      •  GpuName:Gpu名称。
         
        -
      • -
      • + > +
      • +
      •  Thread(tid):线程名(线程ID)。
         
        -
      • -
      • + > +
      • +
      •  SumSize:Gpu内存总量。
         
        -
      • -
      • + > +
      • +
      •  AvgSize:Gpu内存的平均值。
         
        -
      • -
      • + > +
      • +
      •  MaxSize:Gpu内存的最大值。
         
        -
      • -
      • + > +
      • +
      •  MinSize:Gpu内存的最小值。
         
        -
      • -
      -

      - Gl泳道图框选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Gl泳道图框选功能。 +
      + GitHub Logo +

      +
        +
      •  TimeStamp:时间戳。
         
        -
      • -
      • + > +
      • +
      •  GL_PSS:GL_PSS的大小。
         
        -
      • -
      -

      - Skia Gpu Dump Toal泳道图点选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Skia Gpu Dump Toal泳道图点选功能。 +
      + GitHub Logo +

      +
        +
      •  Module / Category:模块/目录。
         
        -
      • -
      • + > +
      • +
      •  Size:按照模块/目录显示size大小。
         
        -
      • -
      -

      - Skia Gpu Dump Toal泳道图框选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Skia Gpu Dump Toal泳道图框选功能。 +
      + GitHub Logo +

      +
        +
      •  TimeStamp:时间戳。
         
        -
      • -
      • + > +
      • +
      •  Module / Category:模块/目录。
         
        -
      • -
      • + > +
      • +
      •  AvgSize:对应模块/目录下size的平均值。
         
        -
      • -
      • + > +
      • +
      •  MaxSize:对应模块/目录下size的最大值。
         
        -
      • -
      • + > +
      • +
      •  MinSize:对应模块/目录下size的最小值。
         
        -
      • -
      -

      - Skia Gpu Dump Window泳道图点选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Skia Gpu Dump Window泳道图点选功能。 +
      + GitHub Logo +

      +
        +
      •  Window / Module / Category:窗口/模块/目录。
         
        -
      • -
      • + > +
      • +
      •  Size:按照窗口/模块/目录显示size大小。
         
        -
      • -
      -

      - Skia Gpu Dump Window泳道图框选功能。
      - GitHub Logo -

      -
        -
      • + > +
      • +
      +

      + Skia Gpu Dump Window泳道图框选功能。 +
      + GitHub Logo +

      +
        +
      •  TimeStamp:时间戳。
         
        -
      • -
      • + > +
      • +
      •  Window / Module / Category:窗口/模块/目录。
         
        -
      • -
      • + > +
      • +
      •  AvgSize:对应窗口/模块/目录下size的平均值。
         
        -
      • -
      • + > +
      • +
      •  MaxSize:对应窗口/模块/目录下size的最大值。
         
        -
      • -
      • + > +
      • +
      •  MinSize:对应窗口/模块/目录下size的最小值。
         
        -
      • -
      -
      - - - + > +
    • +
    +
    + + + diff --git a/ide/src/doc/quickstart_taskpool.html b/ide/src/doc/quickstart_taskpool.html index 3f8a298cc4e4d3b59e3fecc792a383ef3f97b734..a0152dfc543c38c3216054d95b3f3948afcb305e 100644 --- a/ide/src/doc/quickstart_taskpool.html +++ b/ide/src/doc/quickstart_taskpool.html @@ -1,539 +1,253 @@ - - - quickstart_taskpool - - - - - -
    -

    TaskPool抓取和展示说明

    - -

    - TaskPool分析模块主要展示应用程序使用taskpool时,任务的关联关系,任务调度开销和任务并发度分析情况,任务各阶段耗时情况,线程池的状态统计,队列任务数,任务是否超时。 -

    -

    TaskPool的抓取

    - -

    TaskPool的抓取配置参数

    - -

    - 打开Task pool开关抓取taskpool数据。
    - GitHub Logo -

    -

    TaskPool展示说明

    - -

    - 将抓取的taskpool文件导入到smartperf中,查看任务的关联关系等信息。
    - GitHub Logo -

    -

    TaskPool的任务关联关系跟踪

    - -

    - 任务关联关系就是根据任务的executeId,把一个taskpool任务的各个执行的函数调用栈连接起来,用于表示一个任务从开始分发到执行,再到最后任务结束的整个过程。
    - GitHub Logo
    - 如上图所示,点击H:Task Perform: taskId : 2, executeId : - 2的调用栈会出现红色连线,红色连线展示了executeId是2的任务的关联关系,连接的调用栈分别是: -

    -
      -
    • + + + +
      +

      TaskPool抓取和展示说明

      +

      + TaskPool分析模块主要展示应用程序使用taskpool时,任务的关联关系,任务调度开销和任务并发度分析情况,任务各阶段耗时情况,线程池的状态统计,队列任务数,任务是否超时。 +

      +

      TaskPool的抓取

      +

      TaskPool的抓取配置参数

      +

      + 打开Task pool开关抓取taskpool数据。
      + GitHub Logo +

      +

      TaskPool展示说明

      + +

      + 将抓取的taskpool文件导入到smartperf中,查看任务的关联关系等信息。
      + GitHub Logo +

      +

      TaskPool的任务关联关系跟踪

      + +

      + 任务关联关系就是根据任务的executeId,把一个taskpool任务的各个执行的函数调用栈连接起来,用于表示一个任务从开始分发到执行,再到最后任务结束的整个过程。
      + GitHub Logo
      + 如上图所示,点击H:Task Perform: taskId : 2, executeId : + 2的调用栈会出现红色连线,红色连线展示了executeId是2的任务的关联关系,连接的调用栈分别是: +

      +
        +
      •  H:Task Allocation: taskId : 2, executeId : 2, priority : 1, executeState : 1:任务分发。
        -
        -
      • -
      • + +
      • +
      •  H:Task Perform: taskId : 2, executeId : 2:任务执行。
        -
        -
      • -
      • + +
      • +
      •  H:Task PerformTask End: taskId : 2, executeId : 2, performResult : Successful:任务返回。
        -
        -
      • -
      -

      TaskPool的并发度

      - -

      - 点选或者框选任务状态为执行会进行任务并发度展示,如图所示并发度是3。
      - GitHub Logo -

      -

      TaskPool泳道图的点选功能

      - -

      - 点选taskpool的Slice,展示该taskpool信息的tab页。
      - GitHub Logo -

      -
        -
      • + +
      • +
      +

      TaskPool的并发度

      + +

      + 点选或者框选任务状态为执行会进行任务并发度展示,如图所示并发度是3。
      + GitHub Logo +

      +

      TaskPool泳道图的点选功能

      + +

      + 点选taskpool的Slice,展示该taskpool信息的tab页。
      + GitHub Logo +

      +
        +
      •  Name: 任务调用栈名称。
        -
        -
      • -
      • + +
      • +
      •  StartTime: 任务调用栈开始时间。
        -
        -
      • -
      • + +
      • +
      •  Duration:任务调用栈持续时间。
        -
        -
      • -
      • + +
      • +
      •  depth:调用栈层级。
        -
        -
      • -
      -

      TaskPool泳道图的框选功能

      - -

      - 框选taskpool的泳道图,展示Frames的tab页。
      - GitHub Logo -

      -
        -
      • + +
      • +
      +

      TaskPool泳道图的框选功能

      + +

      + 框选taskpool的泳道图,展示Frames的tab页。
      + GitHub Logo +

      +
        +
      •  Execute Id: 任务id。
        -
        -
      • -
      • + +
      • +
      •  Task Priority: 任务优先级(HIGH,MEDIUM,LOW)。
        -
        -
      • -
      • + +
      • +
      •  Scheduling Time(ms):调度耗时(任务执行起始时间 - 任务分发起始时间)。
        -
        -
      • -
      • + +
      • +
      •  Execution Time(ms):执行耗时(任务执行的duration)。
        -
        -
      • -
      • + +
      • +
      •  Return Time(ms):返回耗时(任务返回的结束时间 – 任务执行的结束时间)。
        -
        -
      • -
      -

      TaskPool的队列任务数和线程池里线程状态统计

      - -

      - GitHub Logo
      - 如上图,H:threadNum,H:runningThreadNum,H:idleThreadNum,H:timeoutThreadNum是线程池里线程状态统计,H:taskNum是队列任务数。 -

      -

      TaskPool的任务超时退出

      - -

      - 在带有H:Thread Timeout Exit的调用栈的泳道图会采用黄色圆圈,中间为白色反叹号标记,代表任务超时退出。
      - GitHub Logo -

      -
      - - - + +
    • +
    +

    TaskPool的队列任务数和线程池里线程状态统计

    + +

    + GitHub Logo
    + 如上图,H:threadNum,H:runningThreadNum,H:idleThreadNum,H:timeoutThreadNum是线程池里线程状态统计,H:taskNum是队列任务数。 +

    +

    TaskPool的任务超时退出

    + +

    + 在带有H:Thread Timeout Exit的调用栈的泳道图会采用黄色圆圈,中间为白色反叹号标记,代表任务超时退出。
    + GitHub Logo +

    +
    + + + diff --git a/ide/src/figures/Hilog/hilogconfig.jpg b/ide/src/figures/Hilog/hilogconfig.jpg new file mode 100644 index 0000000000000000000000000000000000000000..96a0a58606118aa2badd0169ead963b3ddb0c02d Binary files /dev/null and b/ide/src/figures/Hilog/hilogconfig.jpg differ diff --git a/ide/src/figures/Hilog/hilogrow.jpg b/ide/src/figures/Hilog/hilogrow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d85cdef85b21bdf21de40976d36058deec77584a Binary files /dev/null and b/ide/src/figures/Hilog/hilogrow.jpg differ diff --git a/ide/src/figures/Hilog/hilogsummarytab.jpg b/ide/src/figures/Hilog/hilogsummarytab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33c47043b3efd4138c59671d5664ab779ed27030 Binary files /dev/null and b/ide/src/figures/Hilog/hilogsummarytab.jpg differ diff --git a/ide/src/figures/Hilog/hilogtab.jpg b/ide/src/figures/Hilog/hilogtab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5505b3550651412d38cac988b6a25989041e840 Binary files /dev/null and b/ide/src/figures/Hilog/hilogtab.jpg differ diff --git a/ide/src/figures/OperationSkills/Tababsolutetime.jpg b/ide/src/figures/OperationSkills/Tababsolutetime.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b043990c9d77e2126f6e7f8b71a015549eb6b8f Binary files /dev/null and b/ide/src/figures/OperationSkills/Tababsolutetime.jpg differ diff --git a/ide/src/figures/OperationSkills/Tabcallstackskip.jpg b/ide/src/figures/OperationSkills/Tabcallstackskip.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d72f2452eba4dc5f583e48ad9fda1f44fb326f39 Binary files /dev/null and b/ide/src/figures/OperationSkills/Tabcallstackskip.jpg differ diff --git a/ide/src/figures/OperationSkills/Tabdrag.jpg b/ide/src/figures/OperationSkills/Tabdrag.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b3ce614241db915e32826a81f312440b1bbd558 Binary files /dev/null and b/ide/src/figures/OperationSkills/Tabdrag.jpg differ diff --git a/ide/src/figures/OperationSkills/Taboneclick.jpg b/ide/src/figures/OperationSkills/Taboneclick.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b664908616f080dd48688b6cf9de30e31ca88ba7 Binary files /dev/null and b/ide/src/figures/OperationSkills/Taboneclick.jpg differ diff --git a/ide/src/figures/OperationSkills/Tabskill.jpg b/ide/src/figures/OperationSkills/Tabskill.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2fa1182218179ac7f7505a35ccedcb936dc50605 Binary files /dev/null and b/ide/src/figures/OperationSkills/Tabskill.jpg differ diff --git a/ide/src/figures/OperationSkills/Tabskillcalltack.jpg b/ide/src/figures/OperationSkills/Tabskillcalltack.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19941721f7a1c5c573708bfe5da2ed7cf9454da2 Binary files /dev/null and b/ide/src/figures/OperationSkills/Tabskillcalltack.jpg differ diff --git a/ide/src/figures/OperationSkills/Tabskillfold.jpg b/ide/src/figures/OperationSkills/Tabskillfold.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89767781742c73dc52b4bac8371c8a6016b553c1 Binary files /dev/null and b/ide/src/figures/OperationSkills/Tabskillfold.jpg differ diff --git a/ide/src/figures/OperationSkills/Tabskilltemple.jpg b/ide/src/figures/OperationSkills/Tabskilltemple.jpg new file mode 100644 index 0000000000000000000000000000000000000000..184e1ff8e7fe3d91e0bcd86c028f22e96d52e130 Binary files /dev/null and b/ide/src/figures/OperationSkills/Tabskilltemple.jpg differ diff --git a/ide/src/figures/OperationSkills/collectskilldrag.jpg b/ide/src/figures/OperationSkills/collectskilldrag.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae18dce8807d32d9e1ceab75d2f2dcf58ff999bd Binary files /dev/null and b/ide/src/figures/OperationSkills/collectskilldrag.jpg differ diff --git a/ide/src/figures/OperationSkills/collectskillg.jpg b/ide/src/figures/OperationSkills/collectskillg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4bdf5183c7aa3aa6c24dea3ca46a863915a04f4 Binary files /dev/null and b/ide/src/figures/OperationSkills/collectskillg.jpg differ diff --git a/ide/src/figures/OperationSkills/colorchoose.jpg b/ide/src/figures/OperationSkills/colorchoose.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9bac0e4b57cb9fd87854e7e3aa225de10eda2140 Binary files /dev/null and b/ide/src/figures/OperationSkills/colorchoose.jpg differ diff --git a/ide/src/figures/OperationSkills/colorcontrast.jpg b/ide/src/figures/OperationSkills/colorcontrast.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ebda1ea80a014b216c002be379c8f43c3c59bd5 Binary files /dev/null and b/ide/src/figures/OperationSkills/colorcontrast.jpg differ diff --git a/ide/src/figures/OperationSkills/rowskillflag.jpg b/ide/src/figures/OperationSkills/rowskillflag.jpg new file mode 100644 index 0000000000000000000000000000000000000000..27ea1a7dea957889592978f2b3cbc43cf4c5c1e5 Binary files /dev/null and b/ide/src/figures/OperationSkills/rowskillflag.jpg differ diff --git a/ide/src/figures/OperationSkills/rowskillinput.jpg b/ide/src/figures/OperationSkills/rowskillinput.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3da0dc399acb21dc6981009a71ebe75d88aa93c Binary files /dev/null and b/ide/src/figures/OperationSkills/rowskillinput.jpg differ diff --git a/ide/src/figures/OperationSkills/rowskillm.jpg b/ide/src/figures/OperationSkills/rowskillm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4c1a0566d49d169a2950ff52bd0b2fb962b4a84 Binary files /dev/null and b/ide/src/figures/OperationSkills/rowskillm.jpg differ diff --git a/ide/src/figures/OperationSkills/rowskilon.jpg b/ide/src/figures/OperationSkills/rowskilon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93be0ca040f634f1663be73840a14c138c66b8ac Binary files /dev/null and b/ide/src/figures/OperationSkills/rowskilon.jpg differ diff --git a/ide/src/figures/OperationSkills/schedpritab.jpg b/ide/src/figures/OperationSkills/schedpritab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db671c470a3b2918ab79f410b315e9f1f0a4e6de Binary files /dev/null and b/ide/src/figures/OperationSkills/schedpritab.jpg differ diff --git a/ide/src/figures/OperationSkills/searchskill.jpg b/ide/src/figures/OperationSkills/searchskill.jpg new file mode 100644 index 0000000000000000000000000000000000000000..651dbf8a9da0694b63e34f78edb25bc2969451c6 Binary files /dev/null and b/ide/src/figures/OperationSkills/searchskill.jpg differ diff --git a/ide/src/figures/OperationSkills/shellconfig.jpg b/ide/src/figures/OperationSkills/shellconfig.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34ed6fffd537dc5dd712c288bba7d5ab30d6e5ce Binary files /dev/null and b/ide/src/figures/OperationSkills/shellconfig.jpg differ diff --git a/ide/src/figures/OperationSkills/sqlselect.jpg b/ide/src/figures/OperationSkills/sqlselect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e72d9de77434ec7371e37a6e4b0df8afa2800587 Binary files /dev/null and b/ide/src/figures/OperationSkills/sqlselect.jpg differ diff --git a/ide/src/figures/OperationSkills/threadtree.jpg b/ide/src/figures/OperationSkills/threadtree.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c5499d1218dca2d87697bed3b0f2863f66f441d4 Binary files /dev/null and b/ide/src/figures/OperationSkills/threadtree.jpg differ diff --git a/ide/src/figures/OperationSkills/tracestop.jpg b/ide/src/figures/OperationSkills/tracestop.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f95cbc47d9567f0ae6e8b799891b1c88ebdb832 Binary files /dev/null and b/ide/src/figures/OperationSkills/tracestop.jpg differ diff --git a/ide/src/figures/Taskpool/taskpoolconfig.jpg b/ide/src/figures/Taskpool/taskpoolconfig.jpg index c259b52a845c334b76521ed4eae91dc94e765c41..9fdd3d1febd908de20f5cd56860391413484be99 100644 Binary files a/ide/src/figures/Taskpool/taskpoolconfig.jpg and b/ide/src/figures/Taskpool/taskpoolconfig.jpg differ diff --git a/ide/src/figures/animation/anieffectcurv.jpg b/ide/src/figures/animation/anieffectcurv.jpg index 65e504c5f173b48ff8f5c6e62f181371cd9b49b0..9c766044fa18077f9953ce4e7974e7f615cb82d0 100644 Binary files a/ide/src/figures/animation/anieffectcurv.jpg and b/ide/src/figures/animation/anieffectcurv.jpg differ diff --git a/ide/src/figures/animation/anieffectcurvdrag.jpg b/ide/src/figures/animation/anieffectcurvdrag.jpg index e19958e7b472d73544d7929ecd4652f81512f091..1a502586d81778933c99a9f16e0c57794b39afdf 100644 Binary files a/ide/src/figures/animation/anieffectcurvdrag.jpg and b/ide/src/figures/animation/anieffectcurvdrag.jpg differ diff --git a/ide/src/figures/animation/anieffectcurvselect.jpg b/ide/src/figures/animation/anieffectcurvselect.jpg index 43c285a0da419477729b394e0c86e9466125e2b1..4c2723efaa07c74fd9c88a5ddf7ed012cc0b525f 100644 Binary files a/ide/src/figures/animation/anieffectcurvselect.jpg and b/ide/src/figures/animation/anieffectcurvselect.jpg differ diff --git a/ide/src/figures/animation/animationconfig.jpg b/ide/src/figures/animation/animationconfig.jpg index bd01d2b01f0196bf30c858b466bcb80c900e590b..47a4c81e1ab37b821e37ee929272b6ffaa5efcf7 100644 Binary files a/ide/src/figures/animation/animationconfig.jpg and b/ide/src/figures/animation/animationconfig.jpg differ diff --git a/ide/src/figures/animation/anispacingdrag.jpg b/ide/src/figures/animation/anispacingdrag.jpg index a8cba8008d11845cc89be83e7ac01d8979503b4d..ca0d5ebf532717b4ceebce5cc4d0ea77daf836bb 100644 Binary files a/ide/src/figures/animation/anispacingdrag.jpg and b/ide/src/figures/animation/anispacingdrag.jpg differ diff --git a/ide/src/figures/animation/anispacingselect.jpg b/ide/src/figures/animation/anispacingselect.jpg index 630ea2df4a05cd6113e207855aeedace67c7173f..eb3377d5e81b0ff8c5b689e5019b463a85a5634b 100644 Binary files a/ide/src/figures/animation/anispacingselect.jpg and b/ide/src/figures/animation/anispacingselect.jpg differ diff --git a/ide/src/figures/animation/anrsallrow.jpg b/ide/src/figures/animation/anrsallrow.jpg index ee6edbdf799cb21c61b1c1d66dd8b924c80435ee..d0ba1fbc2f8969d43576201881990b31d760a4e5 100644 Binary files a/ide/src/figures/animation/anrsallrow.jpg and b/ide/src/figures/animation/anrsallrow.jpg differ diff --git a/ide/src/figures/animation/anrsdelayrow.jpg b/ide/src/figures/animation/anrsdelayrow.jpg index 102c3cac6ae391cf403139e5b0bde7e17941cea2..d430982b1a9eca39288a5f07d50b06ae21760f25 100644 Binary files a/ide/src/figures/animation/anrsdelayrow.jpg and b/ide/src/figures/animation/anrsdelayrow.jpg differ diff --git a/ide/src/figures/animation/framespacirow.jpg b/ide/src/figures/animation/framespacirow.jpg index 2abdad53efaa5e530b2e80f6e7e73e301fbbf2fc..4320bbbe702700593c61a573f963521bd8e8483f 100644 Binary files a/ide/src/figures/animation/framespacirow.jpg and b/ide/src/figures/animation/framespacirow.jpg differ diff --git a/ide/src/figures/appstartup/appstartupconfig.jpg b/ide/src/figures/appstartup/appstartupconfig.jpg index bbdfe9b048453b30b16d394ec405dc7403feaf2f..d9a6255947ad385e77d1ff4952874761693e8a51 100644 Binary files a/ide/src/figures/appstartup/appstartupconfig.jpg and b/ide/src/figures/appstartup/appstartupconfig.jpg differ diff --git a/ide/src/hdc/HdcDeviceManager.ts b/ide/src/hdc/HdcDeviceManager.ts index f5fab8b5f3e05da454272d5993b9da3ea0253338..6f484b16075e8ecca1ada30ac6f75b736f6186d2 100644 --- a/ide/src/hdc/HdcDeviceManager.ts +++ b/ide/src/hdc/HdcDeviceManager.ts @@ -38,10 +38,10 @@ export class HdcDeviceManager { ArrowUp: [27, 91, 65], ArrowDown: [27, 91, 66], ArrowLeft: [27, 91, 68], - ArrowRight: [27, 91, 67] + ArrowRight: [27, 91, 67], }; static ctrlKey = { - c: [3] + c: [3], }; private static clientList: Map = new Map(); private static currentHdcClient: HdcClient; @@ -95,7 +95,7 @@ export class HdcDeviceManager { this.currentHdcClient = hdcClient; this.clientList.set(serialNumber, hdcClient); } - log(`device Usb connected : ${ connected }`); + log(`device Usb connected : ${connected}`); return connected; } else { log('device Usb connected failed: '); @@ -128,7 +128,6 @@ export class HdcDeviceManager { } } - /** * Execute shell on the currently connected device and return the result as a string * @@ -183,8 +182,9 @@ export class HdcDeviceManager { return Promise.reject('not select device'); } - public static startShell(resultCallBack: (res: DataMessage) => void): - ((keyboardEvent: KeyboardEvent | string) => void | undefined) | undefined { + public static startShell( + resultCallBack: (res: DataMessage) => void + ): ((keyboardEvent: KeyboardEvent | string) => void | undefined) | undefined { if (this.currentHdcClient) { const hdcShellStream = new HdcStream(this.currentHdcClient, false); this.shellInit(hdcShellStream, resultCallBack); @@ -240,7 +240,7 @@ export class HdcDeviceManager { } const lines = command.split('\r\n'); let processedCommand = ''; - lines.forEach(line => { + lines.forEach((line) => { if (line.endsWith('\\')) { line = line.slice(0, -1); processedCommand += line; @@ -260,7 +260,7 @@ export class HdcDeviceManager { public static async shellResultAsBlob(cmd: string, isSkipResult: boolean): Promise { if (this.currentHdcClient) { const hdcStream = new HdcStream(this.currentHdcClient, false); - log(`cmd is ${ cmd }`); + log(`cmd is ${cmd}`); await hdcStream.DoCommand(cmd); let finalBuffer; while (true) { @@ -297,10 +297,10 @@ export class HdcDeviceManager { let finalBuffer; if (this.currentHdcClient) { const hdcStream = new HdcStream(this.currentHdcClient, false); - await hdcStream.DoCommand(`${ HdcDeviceManager.FILE_RECV_PREFIX_STRING + filename } ./`); + await hdcStream.DoCommand(`${HdcDeviceManager.FILE_RECV_PREFIX_STRING + filename} ./`); if (!finalBuffer && hdcStream.fileSize > 0) { finalBuffer = new Uint8Array(hdcStream.fileSize); - log(`Uint8Array size is ${ finalBuffer.byteLength }`); + log(`Uint8Array size is ${finalBuffer.byteLength}`); } let offset = 0; while (true) { diff --git a/ide/src/hdc/hdcclient/HdcClient.ts b/ide/src/hdc/hdcclient/HdcClient.ts index 8899896cbdcfefe1522d050e43ff3117ead1e131..241af4c1a53c41bc9acd0d4362a7f106685f58ac 100644 --- a/ide/src/hdc/hdcclient/HdcClient.ts +++ b/ide/src/hdc/hdcclient/HdcClient.ts @@ -50,7 +50,7 @@ export class HdcClient implements DataListener { async connectDevice(): Promise { debug('start Connect Device'); this.sessionId = Utils.getSessionId(); - log(`sessionId is ${ this.sessionId }`); + log(`sessionId is ${this.sessionId}`); // @ts-ignore let handShake: SessionHandShake = new SessionHandShake( HANDSHAKE_MESSAGE, @@ -77,9 +77,7 @@ export class HdcClient implements DataListener { this.handShakeSuccess(handBody); return true; } else { - log( - `session is not eq handShake?.sessionId is : ${ handShake?.sessionId } now session is ${ this.sessionId }` - ); + log(`session is not eq handShake?.sessionId is : ${handShake?.sessionId} now session is ${this.sessionId}`); return false; } } else { diff --git a/ide/src/hdc/hdcclient/HdcStream.ts b/ide/src/hdc/hdcclient/HdcStream.ts index 88c5d476880c9eee611100bf062ba7fd38a7c5bc..8f2249798b851dc4ff1c65223cf28f4f32984bcf 100644 --- a/ide/src/hdc/hdcclient/HdcStream.ts +++ b/ide/src/hdc/hdcclient/HdcStream.ts @@ -29,7 +29,6 @@ export class HdcStream { private hdcClient: HdcClient; public fileSize: number = -1; - constructor(hdcClient: HdcClient, isStopCmd: boolean) { this.hdcClient = hdcClient; this.channelId = Utils.getLocalId(); @@ -46,7 +45,6 @@ export class HdcStream { return this.DoCommandRemote(formatCommand); } - public async DoCommandRemote(command: FormatCommand): Promise { switch (command.cmdFlag) { case HdcCommand.CMD_SHELL_INIT: diff --git a/ide/src/hdc/transmission/UsbTransmissionChannel.ts b/ide/src/hdc/transmission/UsbTransmissionChannel.ts index 4d212663821043fa9edc31f22afa5fc520931135..976517912b34c1ec2cfaf098dc2cd173c7d438ca 100644 --- a/ide/src/hdc/transmission/UsbTransmissionChannel.ts +++ b/ide/src/hdc/transmission/UsbTransmissionChannel.ts @@ -74,8 +74,7 @@ export class UsbTransmissionChannel implements TransmissionInterface { try { await this._device?.releaseInterface(this.interfaceNumber); await this._device?.close(); - } catch (e) { - } + } catch (e) {} this._device = null; } diff --git a/ide/src/icon.svg b/ide/src/icon.svg index 1cce633830ef2e9caf112ee0fe44e07f6bed4e53..cb1ae9143e933e3653658a4d7f0efcff77985982 100644 --- a/ide/src/icon.svg +++ b/ide/src/icon.svg @@ -1,1001 +1,1420 @@ - \ No newline at end of file diff --git a/ide/src/img/menu-cut.svg b/ide/src/img/menu-cut.svg index 5614cb1143cd836b4fc0bb4a267eb28f7510944d..77bd856f242dfe15c8bb06911c1441ff0e0dc343 100644 --- a/ide/src/img/menu-cut.svg +++ b/ide/src/img/menu-cut.svg @@ -1,10 +1,15 @@ - + scissors - - + + \ No newline at end of file diff --git a/ide/src/img/next.png b/ide/src/img/next.png new file mode 100644 index 0000000000000000000000000000000000000000..797d6fcb6fff0299655170d61955dafb08062b92 Binary files /dev/null and b/ide/src/img/next.png differ diff --git a/ide/src/img/preview.png b/ide/src/img/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..cdd6a66ac184e8d14c24824cc17e65e25a23547d Binary files /dev/null and b/ide/src/img/preview.png differ diff --git a/ide/src/img/table_no_data.svg b/ide/src/img/table_no_data.svg index 344982cdc1ee6848ed03850adca49b1a70f20cff..8cf80453d1da351bd4c7e9c0ac54ff766c396287 100644 --- a/ide/src/img/table_no_data.svg +++ b/ide/src/img/table_no_data.svg @@ -1,5 +1,6 @@ - + table_no_data @@ -93,16 +94,32 @@ - - - - + + + + - + - - - + + + diff --git a/ide/src/trace/SpApplication.ts b/ide/src/trace/SpApplication.ts index dc62812402525d0b8617e529fac5617cf7965f74..26b51785447ae10c5e9909d40e4d61261dbd133c 100644 --- a/ide/src/trace/SpApplication.ts +++ b/ide/src/trace/SpApplication.ts @@ -54,11 +54,37 @@ import './component/SpFlags.js'; import './component/trace/base/CustomThemeColor.js'; import { CustomThemeColor, Theme } from './component/trace/base/CustomThemeColor.js'; import { convertPool } from './database/Convert.js'; +import { LongTraceDBUtils } from './database/LongTraceDBUtils.js'; @element('sp-application') export class SpApplication extends BaseElement { private static loadingProgress: number = 0; private static progressStep: number = 2; + longTraceHeadMessageList: Array<{ + pageNum: number; + data: ArrayBuffer; + }> = []; + + longTraceDataList: Array<{ + fileType: string; + index: number; + pageNum: number; + startOffsetSize: number; + endOffsetSize: number; + }> = []; + + longTraceTypeMessageMap: + | Map< + number, + Array<{ + fileType: string; + startIndex: number; + endIndex: number; + size: number; + }> + > + | undefined + | null; static skinChange: Function | null | undefined = null; static skinChange2: Function | null | undefined = null; skinChangeArray: Array = []; @@ -75,6 +101,10 @@ export class SpApplication extends BaseElement { }; private traceFileName: string | undefined; colorTransiton: any; + static isLongTrace: boolean = false; + fileTypeList: string[] = ['ebpf', 'arkts', 'hiperf']; + private pageTimStamp: number = 0; + private currentPageNum: number = 1; static get observedAttributes() { return ['server', 'sqlite', 'wasm', 'dark', 'vs', 'query-sql', 'subsection']; @@ -263,7 +293,7 @@ export class SpApplication extends BaseElement { align-items: center; border: 1px solid var(--dark-border,#c5c5c5); } - .search input{ + lit-search input{ outline: none; border: 0px; background-color: transparent; @@ -283,7 +313,7 @@ export class SpApplication extends BaseElement { color: #b5b7ba; font-size: 1em; } - .search input::placeholder { + lit-search input::placeholder { color: #b5b7ba; font-size: 1em; } @@ -333,7 +363,7 @@ export class SpApplication extends BaseElement { font-size: 20px; color: var(--dark-color1,#47A7E0); } - .chart-filter .custom-color { + .chart-filter { visibility: hidden; z-index: -1; } @@ -368,6 +398,107 @@ export class SpApplication extends BaseElement { .filter-config:hover { opacity: 0.7; } + .page-button[prohibit] { + cursor: none; + } + .page-button { + background: #D8D8D8; + border-radius: 12px; + width: 24px; + height: 24px; + margin-right: 12px; + display: flex; + justify-content: center; + align-items: center; + } + #preview-button:hover { + cursor: pointer; + background: #0A59F7; + color: #FFFFFF; + opacity: 1; + } + #next-button:hover { + cursor: pointer; + background: #0A59F7; + color: #FFFFFF; + opacity: 1; + } + .pagination:hover { + cursor: pointer; + background: #0A59F7; + color: #FFFFFF; + opacity: 1; + } + .confirm-button:hover { + cursor: pointer; + background: #0A59F7; + color: #FFFFFF; + opacity: 1; + } + .pagination { + background: #D8D8D8; + color: #000000; + border-radius: 12px; + width: 24px; + height: 24px; + margin-right: 12px; + display: flex; + justify-content: center; + align-items: center; + font-family: Helvetica; + font-size: 12px; + text-align: center; + line-height: 20px; + font-weight: 400; + opacity: 0.6; + } + .pagination[selected] { + background: #0A59F7; + color: #FFFFFF; + opacity: 1; + } + .page-jump-font { + opacity: 0.6; + font-family: Helvetica; + font-size: 12px; + color: #000000; + text-align: center; + line-height: 20px; + font-weight: 400; + } + .page-input { + background: #D8D8D8; + border-radius: 10px; + width: 40px; + height: 24px; + justify-content: center; + align-items: center; + text-align: center; + margin-right: 8px; + border: none; + } + .confirm-button { + font-family: Helvetica; + font-size: 12px; + color: #0A59F7; + text-align: center; + font-weight: 400; + border: 1px solid #0A59F7; + border-radius: 10px; + width: 64px; + height: 24px; + line-height: 24px; + } + .long_trace_page { + justify-content: flex-end; + width: -webkit-fill-available; + margin-right: 80px; + align-items: center; + display: none; + } + .page-number-list { + display: flex; + }
    @@ -380,6 +511,18 @@ export class SpApplication extends BaseElement {
    + @@ -417,6 +560,7 @@ export class SpApplication extends BaseElement { initElements() { SpStatisticsHttpUtil.initStatisticsServerConfig(); SpStatisticsHttpUtil.addUserVisitAction('visit'); + LongTraceDBUtils.getInstance().createDBAndTable().then(); let that = this; this.querySql = true; this.rootEL = this.shadowRoot!.querySelector('.root'); @@ -442,6 +586,7 @@ export class SpApplication extends BaseElement { let sidebarButton: HTMLDivElement | undefined | null = this.shadowRoot?.querySelector('.sidebar-button'); let chartFilter = this.shadowRoot?.querySelector('.chart-filter') as TraceRowConfig; let cutTraceFile = this.shadowRoot?.querySelector('.cut-trace-file') as HTMLImageElement; + let longTracePage = that.shadowRoot!.querySelector('.long_trace_page') as HTMLDivElement; cutTraceFile.addEventListener('click', () => { this.croppingFile(progressEL, litSearch); }); @@ -776,15 +921,17 @@ export class SpApplication extends BaseElement { let headerStr = enc.decode(htraceData); let newFileName = fileName.substring(0, fileName.lastIndexOf('.')) + '.systrace'; let aElement = document.createElement('a'); - let rowTraceStr = Array.from(new Uint8Array(DbPool.sharedBuffer!.slice(0, 2))).map(byte => byte.toString(16).padStart(2, '0')).join(''); + let rowTraceStr = Array.from(new Uint8Array(DbPool.sharedBuffer!.slice(0, 2))) + .map((byte) => byte.toString(16).padStart(2, '0')) + .join(''); if (headerStr.indexOf('OHOSPROF') === 0 || rowTraceStr.indexOf('49df') === 0) { convertPool.submitWithName('getConvertData', (status: boolean, msg: string, results: Blob) => { aElement.href = URL.createObjectURL(results); aElement.download = newFileName; let timeoutId = 0; - aElement.addEventListener('click', ev => { + aElement.addEventListener('click', (ev) => { clearTimeout(timeoutId); - timeoutId = window.setTimeout(()=>{ + timeoutId = window.setTimeout(() => { restoreDownLoadIcons(); }, 2000); }); @@ -795,9 +942,9 @@ export class SpApplication extends BaseElement { aElement.href = URL.createObjectURL(new Blob([DbPool.sharedBuffer!])); aElement.download = newFileName; let txtTimeoutId = 0; - aElement.addEventListener('click', ev => { + aElement.addEventListener('click', (ev) => { clearTimeout(txtTimeoutId); - txtTimeoutId = window.setTimeout(()=>{ + txtTimeoutId = window.setTimeout(() => { restoreDownLoadIcons(); }, 2000); }); @@ -934,6 +1081,335 @@ export class SpApplication extends BaseElement { }); } + function sendCutFileMessage(timStamp: number) { + that.pageTimStamp = timStamp; + threadPool.init('wasm').then(() => { + let headUintArray = new Uint8Array(that.longTraceHeadMessageList.length * 1024); + let headOffset = 0; + that.longTraceHeadMessageList = that.longTraceHeadMessageList.sort( + (leftMessage, rightMessage) => leftMessage.pageNum - rightMessage.pageNum + ); + for (let index = 0; index < that.longTraceHeadMessageList.length; index++) { + let currentUintArray = new Uint8Array(that.longTraceHeadMessageList[index].data); + headUintArray.set(currentUintArray, headOffset); + headOffset += currentUintArray.length; + } + threadPool.submit( + 'ts-cut-file', + '', + { + headArray: headUintArray, + timeStamp: timStamp, + splitFileInfo: that.longTraceTypeMessageMap?.get(0), + splitDataList: that.longTraceDataList, + }, + (res: Array) => { + litSearch.setPercent('Cut in file ', 100); + if (that.longTraceHeadMessageList.length > 0) { + getTraceFileByPage(that.currentPageNum); + litSearch.style.marginLeft = '80px'; + let pageListDiv = that.shadowRoot?.querySelector('.page-number-list') as HTMLDivElement; + that.drawPageNumber(longTracePage, pageListDiv, that.longTraceHeadMessageList.length); + let previewButton: HTMLDivElement | null | undefined = + that.shadowRoot?.querySelector('#preview-button'); + let nextButton: HTMLDivElement | null | undefined = + that.shadowRoot?.querySelector('#next-button'); + let pageInput = that.shadowRoot?.querySelector('.page-input'); + if (previewButton) { + previewButton.style.pointerEvents = 'none'; + previewButton.style.opacity = '0.7'; + previewButton.addEventListener('click', () => { + if (progressEL.loading) { + return; + } + if (that.currentPageNum > 1) { + that.currentPageNum--; + if (that.currentPageNum === 1) { + previewButton!.style.pointerEvents = 'none'; + nextButton!.style.pointerEvents = 'auto'; + previewButton!.style.opacity = '0.7'; + } else { + previewButton!.style.pointerEvents = 'auto'; + nextButton!.style.pointerEvents = 'none'; + previewButton!.style.opacity = '1'; + } + let previewElement = that.shadowRoot?.querySelector( + `.page-number[title='${that.currentPageNum}']` + ); + if (!previewElement || previewElement.textContent === '...') { + return; + } + let querySelector = pageListDiv.querySelector('.page-number[selected]'); + querySelector?.removeAttribute('selected'); + previewElement!.setAttribute('selected', ''); + pageInput!.value = that.currentPageNum + ''; + progressEL.loading = true; + getTraceFileByPage(that.currentPageNum); + } + }); + } + if (nextButton && that.longTraceHeadMessageList.length === 1) { + nextButton.style.pointerEvents = 'none'; + nextButton.style.opacity = '0.7'; + } + nextButton!.addEventListener('click', () => { + if (progressEL.loading) { + return; + } + if (that.currentPageNum < that.longTraceHeadMessageList.length) { + that.currentPageNum++; + if (that.currentPageNum === that.longTraceHeadMessageList.length) { + nextButton!.style.pointerEvents = 'none'; + previewButton!.style.pointerEvents = 'auto'; + nextButton!.style.opacity = '0.7'; + } else { + previewButton!.style.pointerEvents = 'auto'; + nextButton!.style.pointerEvents = 'auto'; + nextButton!.style.opacity = '1'; + } + let nextElement = that.shadowRoot?.querySelector( + `.page-number[title='${that.currentPageNum}']` + ); + if (!nextElement || nextElement.textContent === '...') { + return; + } + let querySelector = pageListDiv.querySelector('.page-number[selected]'); + querySelector?.removeAttribute('selected'); + nextElement?.setAttribute('selected', ''); + pageInput!.value = that.currentPageNum + ''; + progressEL.loading = true; + getTraceFileByPage(that.currentPageNum); + } + }); + pageListDiv.querySelectorAll('div').forEach((divEL) => { + divEL.addEventListener('click', () => { + if (progressEL.loading || divEL.textContent === '...') { + return; + } + let querySelector = pageListDiv.querySelector('.page-number[selected]'); + querySelector?.removeAttribute('selected'); + divEL.setAttribute('selected', ''); + let selectPageNum = Number(divEL.textContent); + if (selectPageNum !== that.currentPageNum) { + that.currentPageNum = selectPageNum; + if (that.currentPageNum === that.longTraceHeadMessageList.length) { + nextButton!.style.pointerEvents = 'none'; + nextButton!.style.opacity = '0.7'; + } else { + nextButton!.style.pointerEvents = 'auto'; + nextButton!.style.opacity = '1'; + } + if (that.currentPageNum === 1) { + previewButton!.style.pointerEvents = 'none'; + previewButton!.style.opacity = '0.7'; + } else { + previewButton!.style.pointerEvents = 'auto'; + previewButton!.style.opacity = '1'; + } + pageInput!.value = that.currentPageNum + ''; + progressEL.loading = true; + getTraceFileByPage(that.currentPageNum); + } + }); + }); + pageInput!.addEventListener('input', () => { + let value = pageInput!.value; + value = value.replace(/\D/g, ''); + if (value) { + value = Math.min(that.longTraceHeadMessageList.length, parseInt(value)).toString(); + } + pageInput!.value = value; + }); + let pageConfirmEl = that.shadowRoot?.querySelector('.confirm-button'); + pageConfirmEl!.addEventListener('click', () => { + if (progressEL.loading) { + return; + } + let pageIndex = Number(pageInput!.value); + if (pageIndex > 0 && pageIndex <= that.longTraceHeadMessageList.length) { + that.currentPageNum = pageIndex; + if (that.currentPageNum === that.longTraceHeadMessageList.length) { + nextButton!.style.pointerEvents = 'none'; + nextButton!.style.opacity = '0.7'; + } else { + nextButton!.style.pointerEvents = 'auto'; + nextButton!.style.opacity = '1'; + } + if (that.currentPageNum === 1) { + previewButton!.style.pointerEvents = 'none'; + previewButton!.style.opacity = '0.7'; + } else { + previewButton!.style.pointerEvents = 'auto'; + previewButton!.style.opacity = '1'; + } + let nextElement = that.shadowRoot?.querySelector( + `.page-number[title='${that.currentPageNum}']` + ); + if (!nextElement) { + nextElement = that.shadowRoot?.querySelector( + `.page-number[title='...']` + ); + } + let querySelector = pageListDiv.querySelector('.page-number[selected]'); + querySelector?.removeAttribute('selected'); + nextElement?.setAttribute('selected', ''); + progressEL.loading = true; + getTraceFileByPage(that.currentPageNum); + } + }); + } + }, + 'long_trace' + ); + }); + } + + function getTraceFileByPage(pageNumber: number): void { + openFileInit(); + litSearch.clear(); + showContent(spSystemTrace!); + that.search = true; + progressEL.loading = true; + if (!that.wasm) { + progressEL.loading = false; + return; + } + if (that.pageTimStamp === 0) { + return; + } + let indexedDbPageNum = pageNumber - 1; + let maxTraceFileLength = 400 * 1024 * 1024; + let traceRange = IDBKeyRange.bound( + [that.pageTimStamp, 'trace', indexedDbPageNum], + [that.pageTimStamp, 'trace', indexedDbPageNum], + false, + false + ); + LongTraceDBUtils.getInstance() + .indexedDBHelp.get(LongTraceDBUtils.getInstance().tableName, traceRange, 'QueryFileByPage') + .then((result) => { + let traceData = indexedDataToBufferData(result); + let traceLength = traceData.byteLength; + let ebpfRange = IDBKeyRange.bound( + [that.pageTimStamp, 'ebpf_new', indexedDbPageNum], + [that.pageTimStamp, 'ebpf_new', indexedDbPageNum], + false, + false + ); + let arkTsRange = IDBKeyRange.bound( + [that.pageTimStamp, 'arkts_new', indexedDbPageNum], + [that.pageTimStamp, 'arkts_new', indexedDbPageNum], + false, + false + ); + let hiperfRange = IDBKeyRange.bound( + [that.pageTimStamp, 'hiperf_new', indexedDbPageNum], + [that.pageTimStamp, 'hiperf_new', indexedDbPageNum], + false, + false + ); + Promise.all([ + LongTraceDBUtils.getInstance().indexedDBHelp.get( + LongTraceDBUtils.getInstance().tableName, + ebpfRange, + 'QueryFileByPage' + ), + LongTraceDBUtils.getInstance().indexedDBHelp.get( + LongTraceDBUtils.getInstance().tableName, + arkTsRange, + 'QueryFileByPage' + ), + LongTraceDBUtils.getInstance().indexedDBHelp.get( + LongTraceDBUtils.getInstance().tableName, + hiperfRange, + 'QueryFileByPage' + ), + ]).then((otherResult) => { + let ebpfData = indexedDataToBufferData(otherResult[0]); + let arkTsData = indexedDataToBufferData(otherResult[1]); + let hiperfData = indexedDataToBufferData(otherResult[2]); + let traceArray = new Uint8Array(traceData); + let ebpfArray = new Uint8Array(ebpfData); + let arkTsArray = new Uint8Array(arkTsData); + let hiPerfArray = new Uint8Array(hiperfData); + let allOtherData = [ebpfData, arkTsData, hiperfData]; + let otherDataLength = traceLength + ebpfData.byteLength + arkTsData.byteLength + hiperfData.byteLength; + let fileName = `hiprofiler_long_trace_${indexedDbPageNum}.htrace`; + if (otherDataLength > maxTraceFileLength) { + if (traceLength > maxTraceFileLength) { + litSearch.isLoading = false; + litSearch.setPercent('hitrace file too big!', -1); + progressEL.loading = false; + } else { + let freeDataLength = maxTraceFileLength - traceLength; + let freeDataIndex = findFreeSizeAlgorithm( + [ebpfData.byteLength, arkTsData.byteLength, hiperfData.byteLength], + freeDataLength + ); + let finalData = [traceData]; + freeDataIndex.forEach((dataIndex) => { + finalData.push(allOtherData[dataIndex]); + }); + let fileBlob = new Blob(finalData); + const file = new File([fileBlob], fileName); + let fileSize = (file.size / 1048576).toFixed(1); + handleWasmMode(file, file.name, `${fileSize}M`, fileName); + } + } else { + let fileBlob = new Blob([traceArray, ebpfArray, arkTsArray, hiPerfArray]); + const file = new File([fileBlob], fileName); + let fileSize = (file.size / 1048576).toFixed(1); + handleWasmMode(file, file.name, `${fileSize}M`, file.name); + } + that.traceFileName = fileName; + }); + }); + } + + function indexedDataToBufferData(sourceData: any): ArrayBuffer { + let uintArrayLength = 0; + let uintDataList = sourceData.map((item: any) => { + let currentBufData = new Uint8Array(item.buf); + uintArrayLength += currentBufData.length; + return currentBufData; + }); + let resultArrayBuffer = new ArrayBuffer(uintArrayLength); + let resultUintArray = new Uint8Array(resultArrayBuffer); + let offset = 0; + uintDataList.forEach((currentArray: Uint8Array) => { + resultUintArray.set(currentArray, offset); + offset += currentArray.length; + }); + return resultArrayBuffer; + } + + function findFreeSizeAlgorithm(numbers: Array, freeSize: number): Array { + let closestSize = 0; + let currentSize = 0; + let finalIndex: Array = []; + let currentSelectIndex: Array = []; + + function reBackFind(index: number): void { + if (index === numbers.length) { + const sumDifference = Math.abs(currentSize - freeSize); + if (currentSize <= freeSize && sumDifference < Math.abs(closestSize - freeSize)) { + closestSize = currentSize; + finalIndex = [...currentSelectIndex]; + } + return; + } + currentSize += numbers[index]; + currentSelectIndex.push(index); + reBackFind(index + 1); + currentSize -= numbers[index]; + currentSelectIndex.pop(); + reBackFind(index + 1); + } + + reBackFind(0); + return finalIndex; + } + function handleWasmMode(ev: any, showFileName: string, fileSize: string, fileName: string) { litSearch.setPercent('', 1); threadPool.init('wasm').then((res) => { @@ -1053,8 +1529,167 @@ export class SpApplication extends BaseElement { } }; + function openLongTraceFile(ev: any, isRecordTrace: boolean = false) { + openFileInit(); + litSearch.clear(); + showContent(spSystemTrace!); + that.search = true; + progressEL.loading = true; + if (!that.wasm) { + progressEL.loading = false; + return; + } + if (longTracePage) { + longTracePage.style.display = 'none'; + litSearch.style.marginLeft = '0px'; + let pageListDiv = that.shadowRoot?.querySelector('.page-number-list') as HTMLDivElement; + pageListDiv.innerHTML = ''; + } + that.currentPageNum = 1; + if (isRecordTrace) { + let detail = (ev as any).detail; + sendCutFileMessage(detail.timeStamp); + } else { + that.longTraceHeadMessageList = []; + that.longTraceTypeMessageMap = undefined; + that.longTraceDataList = []; + let detail = (ev as any).detail; + let timStamp = new Date().getTime(); + let traceTypePage: Array = []; + let allFileSize = 0; + let readSize = 0; + for (let index = 0; index < detail.length; index++) { + let file = detail[index]; + let fileName = file.name as string; + allFileSize += file.size; + if (that.fileTypeList.some(fileType => fileName.toLowerCase().includes(fileType))) { + continue; + } + let firstLastIndexOf = fileName.lastIndexOf('.'); + let firstText = fileName.slice(0, firstLastIndexOf); + let resultLastIndexOf = firstText.lastIndexOf('_'); + traceTypePage.push(Number(firstText.slice(resultLastIndexOf + 1, firstText.length)) - 1) + } + traceTypePage.sort((leftNum: number, rightNum: number) => leftNum - rightNum); + const readFiles = async (files: FileList, traceTypePage: Array) => { + const promises = Array.from(files).map((file) => { + let types = that.fileTypeList.filter((type) => file.name.toLowerCase().includes(type.toLowerCase())); + return readFile(file, types, traceTypePage); + }); + return Promise.all(promises); + }; + const readFile = async (file: any, types: Array, traceTypePage: Array) => { + return new Promise((resolve, reject) => { + let fileName = file.name; + let fr = new FileReader(); + let message = { + fileType: '', + startIndex: 0, + endIndex: 0, + size: 0, + }; + info('Parse long trace using wasm mode '); + let maxSize = 48 * 1024 * 1024; + let fileType = 'trace'; + let pageNumber = 0; + if (types.length > 0) { + fileType = types[0]; + } else { + let firstLastIndexOf = fileName.lastIndexOf('.'); + let firstText = fileName.slice(0, firstLastIndexOf); + let resultLastIndexOf = firstText.lastIndexOf('_'); + let searchNumber = Number(firstText.slice(resultLastIndexOf + 1, firstText.length)) - 1; + pageNumber = traceTypePage.lastIndexOf(searchNumber); + } + let chunk = maxSize; + let offset = 0; + let sliceLen = 0; + let index = 1; + fr.onload = function () { + let data = fr.result as ArrayBuffer; + LongTraceDBUtils.getInstance() + .indexedDBHelp.add(LongTraceDBUtils.getInstance().tableName, { + buf: data, + id: `${fileType}_${timStamp}_${pageNumber}_${index}`, + fileType: fileType, + pageNum: pageNumber, + startOffset: offset, + endOffset: offset + sliceLen, + index: index, + timStamp: timStamp, + }) + .then(() => { + if (index === 1 && types.length === 0) { + that.longTraceHeadMessageList.push({ + pageNum: pageNumber, + data: data.slice(offset, 1024), + }); + } + that.longTraceDataList.push({ + index: index, + fileType: fileType, + pageNum: pageNumber, + startOffsetSize: offset, + endOffsetSize: offset + sliceLen, + }); + offset += sliceLen; + if (offset < file.size) { + index++; + } + continue_reading(); + }); + }; + + function continue_reading() { + if (offset >= file.size) { + message.endIndex = index; + message.size = file.size; + if (that.longTraceTypeMessageMap) { + if (that.longTraceTypeMessageMap?.has(pageNumber)) { + let oldTypeList = that.longTraceTypeMessageMap?.get(pageNumber); + oldTypeList?.push(message); + that.longTraceTypeMessageMap?.set(pageNumber, oldTypeList!); + } else { + that.longTraceTypeMessageMap?.set(pageNumber, [message]); + } + } else { + that.longTraceTypeMessageMap = new Map(); + that.longTraceTypeMessageMap.set(pageNumber, [message]); + } + resolve(true); + return; + } + if (index === 1) { + message.fileType = fileType; + message.startIndex = index; + } + sliceLen = Math.min(file.size - offset, chunk); + let slice = file.slice(offset, offset + sliceLen); + readSize += slice.size; + let percentValue = (readSize * 100 / allFileSize).toFixed(2); + litSearch.setPercent('Read in file: ', Number(percentValue)); + fr.readAsArrayBuffer(slice); + } + continue_reading(); + fr.onerror = function () { + reject(false); + }; + }); + }; + litSearch.setPercent('Read in file: ', 1); + readFiles(detail, traceTypePage).then(() => { + litSearch.setPercent('Cut in file: ', 1); + sendCutFileMessage(timStamp); + }); + } + } + function openTraceFile(ev: any, isClickHandle?: boolean) { that.removeAttribute('custom-color'); + longTracePage.style.display = 'none'; + litSearch.style.marginLeft = '0px'; + let pageListDiv = that.shadowRoot?.querySelector('.page-number-list') as HTMLDivElement; + pageListDiv.innerHTML = ''; openFileInit(); if (that.vs && isClickHandle) { Cmd.openFileDialog().then((res: string) => { @@ -1177,6 +1812,17 @@ export class SpApplication extends BaseElement { openTraceFile(hand, true); }, }, + { + title: 'Open long trace file', + icon: 'folder', + fileChoose: !that.vs, + fileHandler: function (ev: InputEvent) { + openLongTraceFile(ev); + }, + clickHandler: function (hand: any) { + openLongTraceFile(hand, true); + }, + }, { title: 'Record new trace', icon: 'copyhovered', @@ -1186,6 +1832,8 @@ export class SpApplication extends BaseElement { spRecordTrace!.startRefreshDeviceList(); } spRecordTrace!.synchronizeDeviceList(); + spRecordTemplate!.record_template = false; + spRecordTrace!.refreshConfig(true); showContent(spRecordTrace!); }, }, @@ -1198,6 +1846,8 @@ export class SpApplication extends BaseElement { spRecordTemplate!.startRefreshDeviceList(); } spRecordTemplate!.refreshHint(); + spRecordTemplate!.record_template = true; + spRecordTemplate!.refreshConfig(false); spRecordTemplate!.synchronizeDeviceList(); showContent(spRecordTemplate!); }, @@ -1346,31 +1996,67 @@ export class SpApplication extends BaseElement { fileName = path.split('/').reverse()[0]; } that.traceFileName = fileName; - showFileName = - fileName.lastIndexOf('.') == -1 ? fileName : fileName.substring(0, fileName.lastIndexOf('.')); + showFileName = fileName.lastIndexOf('.') == -1 ? fileName : fileName.substring(0, fileName.lastIndexOf('.')); TraceRow.rangeSelectObject = undefined; let localUrl = downloadLineFile ? `${window.location.origin}${localPath}` : urlParams.trace; - fetch(localUrl).then((res) => { - res.arrayBuffer().then((arrayBuf) => { - if (urlParams.local) { - URL.revokeObjectURL(localUrl); - } - let fileSize = (arrayBuf.byteLength / 1048576).toFixed(1); - postLog(fileName, fileSize); - document.title = `${showFileName} (${fileSize}M)`; - info('Parse trace using wasm mode '); - handleWasmMode(new File([arrayBuf], fileName), showFileName, fileSize, fileName); + fetch(localUrl) + .then((res) => { + res.arrayBuffer().then((arrayBuf) => { + if (urlParams.local) { + URL.revokeObjectURL(localUrl); + } + let fileSize = (arrayBuf.byteLength / 1048576).toFixed(1); + postLog(fileName, fileSize); + document.title = `${showFileName} (${fileSize}M)`; + info('Parse trace using wasm mode '); + handleWasmMode(new File([arrayBuf], fileName), showFileName, fileSize, fileName); + }); + }) + .catch((e) => { + const firstQuestionMarkIndex = window.location.href.indexOf('?'); + location.replace(window.location.href.substring(0, firstQuestionMarkIndex)); }); - }).catch((e) => { - const firstQuestionMarkIndex = window.location.href.indexOf('?'); - location.replace(window.location.href.substring(0, firstQuestionMarkIndex)); - }); }); } else { openMenu(true); } } + private drawPageNumber(longTracePage: HTMLDivElement, pageListDiv: HTMLDivElement, maxPageNumber: number): void { + longTracePage.style.display = 'flex'; + if (maxPageNumber > 6) { + for (let index = 1; index <= 6; index++) { + let element = document.createElement('div'); + element.className = 'page-number pagination'; + element.textContent = index.toString(); + element.title = index.toString(); + if (index === 1) { + element.setAttribute('selected', ''); + } + if (index === 5) { + element.textContent = '...'; + element.title = '...' + } + if (index === 6) { + element.textContent = `${maxPageNumber}`; + element.title = `${maxPageNumber}`; + } + pageListDiv.appendChild(element); + } + } else { + for (let index = 1; index <= maxPageNumber; index++) { + let element = document.createElement('div'); + element.className = 'page-number pagination'; + element.textContent = index.toString(); + element.title = index.toString(); + if (index === 1) { + element.setAttribute('selected', ''); + } + pageListDiv.appendChild(element); + } + } + } + /** * 修改颜色或者主题,重新绘制侧边栏和泳道图 * @param theme 当前主题(深色和浅色) @@ -1502,6 +2188,13 @@ export class SpApplication extends BaseElement { if (cutRightTs > recordEndNS) { cutRightTs = recordEndNS; } + let minCutDur = 1_000_000; + if (cutRightTs - cutLeftTs < minCutDur) { + let unitTs = (cutRightTs - cutLeftTs) / 2; + let midTs = cutLeftTs + unitTs; + cutLeftTs = midTs - minCutDur / 2; + cutRightTs = midTs + minCutDur / 2; + } progressEL.loading = true; threadPool.cutFile(cutLeftTs, cutRightTs, (status: boolean, msg: string, cutBuffer?: ArrayBuffer) => { progressEL.loading = false; @@ -1516,7 +2209,11 @@ export class SpApplication extends BaseElement { traceName = traceName; } let blobUrl = URL.createObjectURL(new Blob([cutBuffer!])); - window.open(`index.html?link=true&local=true&traceName=${traceName}_cut_${cutLeftTs}${fileType}&trace=${encodeURIComponent(blobUrl)}`); + window.open( + `index.html?link=true&local=true&traceName=${traceName}_cut_${cutLeftTs}${fileType}&trace=${encodeURIComponent( + blobUrl + )}` + ); } else { litSearch.setPercent(msg, -1); window.setTimeout(() => { @@ -1659,6 +2356,8 @@ export class SpApplication extends BaseElement { let mainMenu = this.shadowRoot?.querySelector('#main-menu') as LitMainMenu; // @ts-ignore mainMenu.menus[0].children[0].disabled = disable; + // @ts-ignore + mainMenu.menus[0].children[1].disabled = disable; if (mainMenu.menus!.length > 2) { // @ts-ignore mainMenu.menus[1].children.map((it) => (it.disabled = disable)); diff --git a/ide/src/trace/bean/BoxSelection.ts b/ide/src/trace/bean/BoxSelection.ts index e8cc68cae2915e16f5347af1cd86d03c55397b97..0e18d1c5662f9a6d553c84fe54b2a9c3a50e8cc8 100644 --- a/ide/src/trace/bean/BoxSelection.ts +++ b/ide/src/trace/bean/BoxSelection.ts @@ -83,14 +83,16 @@ export class SelectionParam { frameSpacing: Array = []; jsCpuProfilerData: Array = []; gpu: { - gl: boolean, - gpuTotal: boolean, - gpuWindow: boolean + gl: boolean; + graph: boolean; + gpuTotal: boolean; + gpuWindow: boolean; } = { gl: false, + graph: false, gpuWindow: false, - gpuTotal: false - } + gpuTotal: false, + }; purgeableTotalAbility: Array = []; purgeableTotalVM: Array = []; purgeablePinAbility: Array = []; diff --git a/ide/src/trace/bean/CpuFreqStruct.ts b/ide/src/trace/bean/CpuFreqStruct.ts index 2fa2526a215e8f027f2868a9a471379ca6c2b924..eb76553d0b981306de65d2984e85c24877ee9a70 100644 --- a/ide/src/trace/bean/CpuFreqStruct.ts +++ b/ide/src/trace/bean/CpuFreqStruct.ts @@ -37,8 +37,7 @@ export class CpuFreqStruct extends BaseStruct { freqBeanStructCanvasCtx.lineWidth = 1; freqBeanStructCanvasCtx.globalAlpha = 0.6; let freqBeanStructDrawHeight: number = Math.floor( - ((freqBeanStruct.value || 0) * (freqBeanStruct.frame.height || 0) * 1.0) / - CpuFreqStruct.maxFreq + ((freqBeanStruct.value || 0) * (freqBeanStruct.frame.height || 0) * 1.0) / CpuFreqStruct.maxFreq ); freqBeanStructCanvasCtx.fillRect( freqBeanStruct.frame.x, @@ -73,8 +72,7 @@ export class CpuFreqStruct extends BaseStruct { freqBeanStructCanvasCtx.globalAlpha = 0.6; freqBeanStructCanvasCtx.lineWidth = 1; let drawHeight: number = Math.floor( - ((freqBeanStruct.value || 0) * (freqBeanStruct.frame.height || 0)) / - CpuFreqStruct.maxFreq + ((freqBeanStruct.value || 0) * (freqBeanStruct.frame.height || 0)) / CpuFreqStruct.maxFreq ); freqBeanStructCanvasCtx.fillRect( freqBeanStruct.frame.x, @@ -87,7 +85,6 @@ export class CpuFreqStruct extends BaseStruct { freqBeanStructCanvasCtx.globalAlpha = 1.0; freqBeanStructCanvasCtx.lineWidth = 1; } - } const textPadding = 2; diff --git a/ide/src/trace/bean/CpuStruct.ts b/ide/src/trace/bean/CpuStruct.ts index 365efaecff556e3db8703c47bf302b26c153a552..5a6752cf82268d0f90382c03ab0cc6f827d80662 100644 --- a/ide/src/trace/bean/CpuStruct.ts +++ b/ide/src/trace/bean/CpuStruct.ts @@ -40,11 +40,18 @@ export class CpuStruct extends BaseStruct { if (cpuBeanStruct.frame) { let cpuBeanStructWidth = cpuBeanStruct.frame.width || 0; if (cpuBeanStruct.processId === CpuStruct.hoverCpuStruct?.processId || !CpuStruct.hoverCpuStruct) { - cpuBeanStructCanvasCtx.fillStyle = ColorUtils.colorForTid((cpuBeanStruct.processId || 0) > 0 ? cpuBeanStruct.processId || 0 : cpuBeanStruct.tid || 0); + cpuBeanStructCanvasCtx.fillStyle = ColorUtils.colorForTid( + (cpuBeanStruct.processId || 0) > 0 ? cpuBeanStruct.processId || 0 : cpuBeanStruct.tid || 0 + ); } else { cpuBeanStructCanvasCtx.fillStyle = '#e0e0e0'; } - cpuBeanStructCanvasCtx.fillRect(cpuBeanStruct.frame.x, cpuBeanStruct.frame.y, cpuBeanStructWidth, cpuBeanStruct.frame.height); + cpuBeanStructCanvasCtx.fillRect( + cpuBeanStruct.frame.x, + cpuBeanStruct.frame.y, + cpuBeanStructWidth, + cpuBeanStruct.frame.height + ); if (cpuBeanStructWidth > textPadding * 2) { let cpuBeanProcess = `${cpuBeanStruct.processName || 'Process'} [${cpuBeanStruct.processId}]`; let cpuBeanThread = `${cpuBeanStruct.name || 'Thread'} [${cpuBeanStruct.tid}]`; @@ -55,30 +62,49 @@ export class CpuStruct extends BaseStruct { cpuBeanStructCanvasCtx.fillStyle = '#ffffff'; let y = cpuBeanStruct.frame.height / 2 + cpuBeanStruct.frame.y; if (cpuBeanProcessMeasure.width < cpuBeanStructWidth - textPadding * 2) { - let x1 = Math.floor(cpuBeanStructWidth / 2 - cpuBeanProcessMeasure.width / 2 + cpuBeanStruct.frame.x + textPadding); + let x1 = Math.floor( + cpuBeanStructWidth / 2 - cpuBeanProcessMeasure.width / 2 + cpuBeanStruct.frame.x + textPadding + ); cpuBeanStructCanvasCtx.textBaseline = 'bottom'; cpuBeanStructCanvasCtx.fillText(cpuBeanProcess, x1, y, cpuBeanStructWidth - textPadding * 2); } else if (cpuBeanStructWidth - textPadding * 2 > cpuBeanProcessCharWidth * 4) { let chatNum = (cpuBeanStructWidth - textPadding * 2) / cpuBeanProcessCharWidth; let x1 = cpuBeanStruct.frame.x + textPadding; cpuBeanStructCanvasCtx.textBaseline = 'bottom'; - cpuBeanStructCanvasCtx.fillText(cpuBeanProcess.substring(0, chatNum - 4) + '...', x1, y, cpuBeanStructWidth - textPadding * 2); + cpuBeanStructCanvasCtx.fillText( + cpuBeanProcess.substring(0, chatNum - 4) + '...', + x1, + y, + cpuBeanStructWidth - textPadding * 2 + ); } if (cpuBeanThreadMeasure.width < cpuBeanStructWidth - textPadding * 2) { cpuBeanStructCanvasCtx.textBaseline = 'top'; - let x2 = Math.floor(cpuBeanStructWidth / 2 - cpuBeanThreadMeasure.width / 2 + cpuBeanStruct.frame.x + textPadding); + let x2 = Math.floor( + cpuBeanStructWidth / 2 - cpuBeanThreadMeasure.width / 2 + cpuBeanStruct.frame.x + textPadding + ); cpuBeanStructCanvasCtx.fillText(cpuBeanThread, x2, y + 2, cpuBeanStructWidth - textPadding * 2); } else if (cpuBeanStructWidth - textPadding * 2 > cpuBeanThreadCharWidth * 4) { let chatNum = (cpuBeanStructWidth - textPadding * 2) / cpuBeanThreadCharWidth; let x1 = cpuBeanStruct.frame.x + textPadding; cpuBeanStructCanvasCtx.textBaseline = 'top'; - cpuBeanStructCanvasCtx.fillText(cpuBeanThread.substring(0, chatNum - 4) + '...', x1, y + 2, cpuBeanStructWidth - textPadding * 2); + cpuBeanStructCanvasCtx.fillText( + cpuBeanThread.substring(0, chatNum - 4) + '...', + x1, + y + 2, + cpuBeanStructWidth - textPadding * 2 + ); } } if (CpuStruct.selectCpuStruct && CpuStruct.equals(CpuStruct.selectCpuStruct, cpuBeanStruct)) { cpuBeanStructCanvasCtx.strokeStyle = '#232c5d'; cpuBeanStructCanvasCtx.lineWidth = 2; - cpuBeanStructCanvasCtx.strokeRect(cpuBeanStruct.frame.x, cpuBeanStruct.frame.y, cpuBeanStructWidth - 2, cpuBeanStruct.frame.height); + cpuBeanStructCanvasCtx.strokeRect( + cpuBeanStruct.frame.x, + cpuBeanStruct.frame.y, + cpuBeanStructWidth - 2, + cpuBeanStruct.frame.height + ); } } } diff --git a/ide/src/trace/bean/FpsStruct.ts b/ide/src/trace/bean/FpsStruct.ts index 793cd20c39966804853499f61a870e9a589ea31f..bd705aed958c4e4b5115b724c164226b476393f3 100644 --- a/ide/src/trace/bean/FpsStruct.ts +++ b/ide/src/trace/bean/FpsStruct.ts @@ -35,30 +35,62 @@ export class FpsStruct extends BaseStruct { if (fpsBeanStructData.startNS === FpsStruct.hoverFpsStruct?.startNS) { fpsBeanStructCanvasCtx.lineWidth = 1; fpsBeanStructCanvasCtx.globalAlpha = 0.6; - let drawHeight: number = ((fpsBeanStructData.fps || 0) * (fpsBeanStructData.frame.height || 0) * 1.0) / FpsStruct.maxFps; - fpsBeanStructCanvasCtx.fillRect(fpsBeanStructData.frame.x, fpsBeanStructData.frame.y + fpsBeanStructData.frame.height - drawHeight, fpsBeanWidth, drawHeight); + let drawHeight: number = + ((fpsBeanStructData.fps || 0) * (fpsBeanStructData.frame.height || 0) * 1.0) / FpsStruct.maxFps; + fpsBeanStructCanvasCtx.fillRect( + fpsBeanStructData.frame.x, + fpsBeanStructData.frame.y + fpsBeanStructData.frame.height - drawHeight, + fpsBeanWidth, + drawHeight + ); fpsBeanStructCanvasCtx.beginPath(); - fpsBeanStructCanvasCtx.arc(fpsBeanStructData.frame.x, fpsBeanStructData.frame.y + fpsBeanStructData.frame.height - drawHeight, 3, 0, 2 * Math.PI, true); + fpsBeanStructCanvasCtx.arc( + fpsBeanStructData.frame.x, + fpsBeanStructData.frame.y + fpsBeanStructData.frame.height - drawHeight, + 3, + 0, + 2 * Math.PI, + true + ); fpsBeanStructCanvasCtx.fill(); fpsBeanStructCanvasCtx.globalAlpha = 1.0; fpsBeanStructCanvasCtx.stroke(); fpsBeanStructCanvasCtx.beginPath(); - fpsBeanStructCanvasCtx.moveTo(fpsBeanStructData.frame.x + 3, fpsBeanStructData.frame.y + fpsBeanStructData.frame.height - drawHeight); + fpsBeanStructCanvasCtx.moveTo( + fpsBeanStructData.frame.x + 3, + fpsBeanStructData.frame.y + fpsBeanStructData.frame.height - drawHeight + ); fpsBeanStructCanvasCtx.lineWidth = 3; - fpsBeanStructCanvasCtx.lineTo(fpsBeanStructData.frame.x + fpsBeanWidth, fpsBeanStructData.frame.y + fpsBeanStructData.frame.height - drawHeight); + fpsBeanStructCanvasCtx.lineTo( + fpsBeanStructData.frame.x + fpsBeanWidth, + fpsBeanStructData.frame.y + fpsBeanStructData.frame.height - drawHeight + ); fpsBeanStructCanvasCtx.stroke(); } else { fpsBeanStructCanvasCtx.globalAlpha = 0.6; fpsBeanStructCanvasCtx.lineWidth = 1; - let drawHeight: number = ((fpsBeanStructData.fps || 0) * (fpsBeanStructData.frame.height || 0) * 1.0) / FpsStruct.maxFps; - fpsBeanStructCanvasCtx.fillRect(fpsBeanStructData.frame.x, fpsBeanStructData.frame.y + fpsBeanStructData.frame.height - drawHeight, fpsBeanWidth, drawHeight); + let drawHeight: number = + ((fpsBeanStructData.fps || 0) * (fpsBeanStructData.frame.height || 0) * 1.0) / FpsStruct.maxFps; + fpsBeanStructCanvasCtx.fillRect( + fpsBeanStructData.frame.x, + fpsBeanStructData.frame.y + fpsBeanStructData.frame.height - drawHeight, + fpsBeanWidth, + drawHeight + ); } } fpsBeanStructCanvasCtx.globalAlpha = 1.0; fpsBeanStructCanvasCtx.lineWidth = 1; } - static setFrame(fpsBeanStructNode: FpsStruct, fpsBeanFramePadding: number, startNS: number, endNS: number, totalNS: number, frame: Rect) { + static setFrame( + fpsBeanStructNode: FpsStruct, + fpsBeanFramePadding: number, + startNS: number, + endNS: number, + totalNS: number, + frame: Rect + ) { let fpsBeanStructX1: number, fpsBeanStructX2: number; if ((fpsBeanStructNode.startNS || 0) < startNS) { fpsBeanStructX1 = 0; @@ -68,7 +100,13 @@ export class FpsStruct extends BaseStruct { if ((fpsBeanStructNode.startNS || 0) + (fpsBeanStructNode.dur || 0) > endNS) { fpsBeanStructX2 = frame.width; } else { - fpsBeanStructX2 = ns2x((fpsBeanStructNode.startNS || 0) + (fpsBeanStructNode.dur || 0), startNS, endNS, totalNS, frame); + fpsBeanStructX2 = ns2x( + (fpsBeanStructNode.startNS || 0) + (fpsBeanStructNode.dur || 0), + startNS, + endNS, + totalNS, + frame + ); } let getV: number = fpsBeanStructX2 - fpsBeanStructX1 <= 1 ? 1 : fpsBeanStructX2 - fpsBeanStructX1; let rectangle: Rect = new Rect( diff --git a/ide/src/trace/bean/FrameChartStruct.ts b/ide/src/trace/bean/FrameChartStruct.ts index cfaff1d2c15f01ae5cf7a4f1d0870f18dff21400..cb93632d9c4051aa22f044d4255ae2fe107c1d83 100644 --- a/ide/src/trace/bean/FrameChartStruct.ts +++ b/ide/src/trace/bean/FrameChartStruct.ts @@ -168,4 +168,4 @@ function getHeatColor(widthPercentage: number): string { function isHover(data: ChartStruct): boolean { return ChartStruct.hoverFuncStruct === data; -} \ No newline at end of file +} diff --git a/ide/src/trace/bean/FrameComponentBean.ts b/ide/src/trace/bean/FrameComponentBean.ts index fdc9476b8900ff7b518c625c2ba393747cd8d0f3..f021f861c0629c7588518df7f9d26855b1772b41 100644 --- a/ide/src/trace/bean/FrameComponentBean.ts +++ b/ide/src/trace/bean/FrameComponentBean.ts @@ -36,4 +36,4 @@ export interface DeviceStruct { physicalWidth: number; physicalHeight: number; physicalFrameRate: number; -} \ No newline at end of file +} diff --git a/ide/src/trace/bean/FuncStruct.ts b/ide/src/trace/bean/FuncStruct.ts index 974a4c456c1a2f05a079c28b7a6d9d5958d7e454..ab073cd3ab88824b32a4879d224f684e946a2920 100644 --- a/ide/src/trace/bean/FuncStruct.ts +++ b/ide/src/trace/bean/FuncStruct.ts @@ -38,17 +38,33 @@ export class FuncStruct extends BaseStruct { static draw(funcBeanStructCanvasCtx: CanvasRenderingContext2D, funcBeanStruct: FuncStruct) { if (funcBeanStruct.frame) { - if (funcBeanStruct.dur == undefined || funcBeanStruct.dur == null || funcBeanStruct.dur == 0 || FuncStruct.isBinder(funcBeanStruct)) { + if ( + funcBeanStruct.dur == undefined || + funcBeanStruct.dur == null || + funcBeanStruct.dur == 0 || + FuncStruct.isBinder(funcBeanStruct) + ) { } else { - funcBeanStructCanvasCtx.fillStyle = ColorUtils.FUNC_COLOR[funcBeanStruct.depth || 0 % ColorUtils.FUNC_COLOR.length]; + funcBeanStructCanvasCtx.fillStyle = + ColorUtils.FUNC_COLOR[funcBeanStruct.depth || 0 % ColorUtils.FUNC_COLOR.length]; let miniHeight = 20; - funcBeanStructCanvasCtx.fillRect(funcBeanStruct.frame.x, funcBeanStruct.frame.y, funcBeanStruct.frame.width, miniHeight - padding * 2); + funcBeanStructCanvasCtx.fillRect( + funcBeanStruct.frame.x, + funcBeanStruct.frame.y, + funcBeanStruct.frame.width, + miniHeight - padding * 2 + ); funcBeanStructCanvasCtx.fillStyle = '#fff'; drawString(funcBeanStructCanvasCtx, funcBeanStruct.funName || '', 5, funcBeanStruct.frame, funcBeanStruct); if (FuncStruct.isSelected(funcBeanStruct)) { funcBeanStructCanvasCtx.strokeStyle = '#000'; funcBeanStructCanvasCtx.lineWidth = 1; - funcBeanStructCanvasCtx.strokeRect(funcBeanStruct.frame.x, funcBeanStruct.frame.y, funcBeanStruct.frame.width, miniHeight - padding * 2); + funcBeanStructCanvasCtx.strokeRect( + funcBeanStruct.frame.x, + funcBeanStruct.frame.y, + funcBeanStruct.frame.width, + miniHeight - padding * 2 + ); } } } diff --git a/ide/src/trace/bean/HeapStruct.ts b/ide/src/trace/bean/HeapStruct.ts index 3705d398eb556d2b8398410e7b7929e2d2c42851..db3d89de90220154006ea7cb7639af535078d3c7 100644 --- a/ide/src/trace/bean/HeapStruct.ts +++ b/ide/src/trace/bean/HeapStruct.ts @@ -35,23 +35,50 @@ export class HeapStruct extends BaseStruct { if (heapBeanData.startTime === HeapStruct.hoverHeapStruct?.startTime) { heapBeanStructCanvasCtx.lineWidth = 1; heapBeanStructCanvasCtx.globalAlpha = 0.6; - let drawHeight: number = Math.ceil(((heapBeanData.heapsize || 0) * (heapBeanData.frame.height || 0)) / heapBeanData.maxHeapSize); - heapBeanStructCanvasCtx.fillRect(heapBeanData.frame.x, heapBeanData.frame.y + heapBeanData.frame.height - drawHeight, width, drawHeight); + let drawHeight: number = Math.ceil( + ((heapBeanData.heapsize || 0) * (heapBeanData.frame.height || 0)) / heapBeanData.maxHeapSize + ); + heapBeanStructCanvasCtx.fillRect( + heapBeanData.frame.x, + heapBeanData.frame.y + heapBeanData.frame.height - drawHeight, + width, + drawHeight + ); heapBeanStructCanvasCtx.beginPath(); - heapBeanStructCanvasCtx.arc(heapBeanData.frame.x, heapBeanData.frame.y + heapBeanData.frame.height - drawHeight, 3, 0, 2 * Math.PI, true); + heapBeanStructCanvasCtx.arc( + heapBeanData.frame.x, + heapBeanData.frame.y + heapBeanData.frame.height - drawHeight, + 3, + 0, + 2 * Math.PI, + true + ); heapBeanStructCanvasCtx.fill(); heapBeanStructCanvasCtx.globalAlpha = 1.0; heapBeanStructCanvasCtx.stroke(); heapBeanStructCanvasCtx.beginPath(); - heapBeanStructCanvasCtx.moveTo(heapBeanData.frame.x + 3, heapBeanData.frame.y + heapBeanData.frame.height - drawHeight); + heapBeanStructCanvasCtx.moveTo( + heapBeanData.frame.x + 3, + heapBeanData.frame.y + heapBeanData.frame.height - drawHeight + ); heapBeanStructCanvasCtx.lineWidth = 3; - heapBeanStructCanvasCtx.lineTo(heapBeanData.frame.x + width, heapBeanData.frame.y + heapBeanData.frame.height - drawHeight); + heapBeanStructCanvasCtx.lineTo( + heapBeanData.frame.x + width, + heapBeanData.frame.y + heapBeanData.frame.height - drawHeight + ); heapBeanStructCanvasCtx.stroke(); } else { heapBeanStructCanvasCtx.globalAlpha = 0.6; heapBeanStructCanvasCtx.lineWidth = 1; - let drawHeight: number = Math.ceil(((heapBeanData.heapsize || 0) * (heapBeanData.frame.height || 0)) / heapBeanData.maxHeapSize); - heapBeanStructCanvasCtx.fillRect(heapBeanData.frame.x, heapBeanData.frame.y + heapBeanData.frame.height - drawHeight, width, drawHeight); + let drawHeight: number = Math.ceil( + ((heapBeanData.heapsize || 0) * (heapBeanData.frame.height || 0)) / heapBeanData.maxHeapSize + ); + heapBeanStructCanvasCtx.fillRect( + heapBeanData.frame.x, + heapBeanData.frame.y + heapBeanData.frame.height - drawHeight, + width, + drawHeight + ); } } heapBeanStructCanvasCtx.globalAlpha = 1.0; diff --git a/ide/src/trace/bean/MemoryConfig.ts b/ide/src/trace/bean/MemoryConfig.ts index 014b1f038bd1e51a80a2a3ef7339d71a09fccd1c..68ad163d4adb440d77e2fd8572223a5b9d85e614 100644 --- a/ide/src/trace/bean/MemoryConfig.ts +++ b/ide/src/trace/bean/MemoryConfig.ts @@ -32,6 +32,6 @@ export class MemoryConfig { this.iPid = iPid; this.processName = processName; this.interval = interval; - this.snapshotDur = (interval * 1000 * 1000) / 5 + this.snapshotDur = (interval * 1000 * 1000) / 5; } } diff --git a/ide/src/trace/bean/PerfProfile.ts b/ide/src/trace/bean/PerfProfile.ts index 2f9dcbedb188c3c577706fd7144d10d459f1a1f3..de3ba331c04ee84c8bc754d109442a71c4dc3721 100644 --- a/ide/src/trace/bean/PerfProfile.ts +++ b/ide/src/trace/bean/PerfProfile.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import { ChartStruct } from "../bean/FrameChartStruct.js"; +import { ChartStruct } from '../bean/FrameChartStruct.js'; export class PerfFile { path: string = ''; diff --git a/ide/src/trace/bean/ProcessMemStruct.ts b/ide/src/trace/bean/ProcessMemStruct.ts index 9d7aa90ccb91f37fbd75e2e03cc1d24e88b87763..ce71a220541684fde0d9955579bb437211521e85 100644 --- a/ide/src/trace/bean/ProcessMemStruct.ts +++ b/ide/src/trace/bean/ProcessMemStruct.ts @@ -38,26 +38,52 @@ export class ProcessMemStruct extends BaseStruct { processMemBeanStructCanvasCtx.lineWidth = 1; processMemBeanStructCanvasCtx.globalAlpha = 0.6; let drawHeight: number = Math.floor( - ((processMemBeanStructData.value || 0) * (processMemBeanStructData.frame.height || 0) * 1.0) / (processMemBeanStructData.maxValue || 0) + ((processMemBeanStructData.value || 0) * (processMemBeanStructData.frame.height || 0) * 1.0) / + (processMemBeanStructData.maxValue || 0) + ); + processMemBeanStructCanvasCtx.fillRect( + processMemBeanStructData.frame.x, + processMemBeanStructData.frame.y + processMemBeanStructData.frame.height - drawHeight, + width, + drawHeight ); - processMemBeanStructCanvasCtx.fillRect(processMemBeanStructData.frame.x, processMemBeanStructData.frame.y + processMemBeanStructData.frame.height - drawHeight, width, drawHeight); processMemBeanStructCanvasCtx.beginPath(); - processMemBeanStructCanvasCtx.arc(processMemBeanStructData.frame.x, processMemBeanStructData.frame.y + processMemBeanStructData.frame.height - drawHeight, 3, 0, 2 * Math.PI, true); + processMemBeanStructCanvasCtx.arc( + processMemBeanStructData.frame.x, + processMemBeanStructData.frame.y + processMemBeanStructData.frame.height - drawHeight, + 3, + 0, + 2 * Math.PI, + true + ); processMemBeanStructCanvasCtx.fill(); processMemBeanStructCanvasCtx.globalAlpha = 1.0; processMemBeanStructCanvasCtx.stroke(); processMemBeanStructCanvasCtx.beginPath(); - processMemBeanStructCanvasCtx.moveTo(processMemBeanStructData.frame.x + 3, processMemBeanStructData.frame.y + processMemBeanStructData.frame.height - drawHeight); + processMemBeanStructCanvasCtx.moveTo( + processMemBeanStructData.frame.x + 3, + processMemBeanStructData.frame.y + processMemBeanStructData.frame.height - drawHeight + ); processMemBeanStructCanvasCtx.lineWidth = 3; - processMemBeanStructCanvasCtx.lineTo(processMemBeanStructData.frame.x + width, processMemBeanStructData.frame.y + processMemBeanStructData.frame.height - drawHeight); + processMemBeanStructCanvasCtx.lineTo( + processMemBeanStructData.frame.x + width, + processMemBeanStructData.frame.y + processMemBeanStructData.frame.height - drawHeight + ); processMemBeanStructCanvasCtx.stroke(); } else { processMemBeanStructCanvasCtx.fillStyle = ColorUtils.colorForTid(processMemBeanStructData.maxValue || 0); processMemBeanStructCanvasCtx.strokeStyle = ColorUtils.colorForTid(processMemBeanStructData.maxValue || 0); processMemBeanStructCanvasCtx.globalAlpha = 0.6; processMemBeanStructCanvasCtx.lineWidth = 1; - let drawHeight: number = ((processMemBeanStructData.value || 0) * (processMemBeanStructData.frame.height || 0) * 1.0) / (processMemBeanStructData.maxValue || 1); - processMemBeanStructCanvasCtx.fillRect(processMemBeanStructData.frame.x, processMemBeanStructData.frame.y + processMemBeanStructData.frame.height - drawHeight, width, drawHeight); + let drawHeight: number = + ((processMemBeanStructData.value || 0) * (processMemBeanStructData.frame.height || 0) * 1.0) / + (processMemBeanStructData.maxValue || 1); + processMemBeanStructCanvasCtx.fillRect( + processMemBeanStructData.frame.x, + processMemBeanStructData.frame.y + processMemBeanStructData.frame.height - drawHeight, + width, + drawHeight + ); } } processMemBeanStructCanvasCtx.globalAlpha = 1.0; diff --git a/ide/src/trace/bean/SearchFuncBean.ts b/ide/src/trace/bean/SearchFuncBean.ts index 3419300477407d64c40c60638b71b66599eb0138..40bfb5baa53801a350efbc909a3b773a0031dc1f 100644 --- a/ide/src/trace/bean/SearchFuncBean.ts +++ b/ide/src/trace/bean/SearchFuncBean.ts @@ -40,4 +40,4 @@ export class SearchSdkBean { name: string | undefined; rowType: string | undefined | null; rowParentId: string | undefined | null; -} \ No newline at end of file +} diff --git a/ide/src/trace/bean/SmapsStruct.ts b/ide/src/trace/bean/SmapsStruct.ts index 7c9edd3b450e8473bf1fa005a30413d280d01469..d6936ee370fedc22f79d01313beeaf90797a1ca1 100644 --- a/ide/src/trace/bean/SmapsStruct.ts +++ b/ide/src/trace/bean/SmapsStruct.ts @@ -1,4 +1,3 @@ - /* * Copyright (C) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,17 +23,17 @@ export class Smaps { path: string = ''; size: number = 0; sizeStr: string = ''; - count:number = 0; + count: number = 0; rss: number = 0; rssStr: string = ''; pss: number = 0; pssStr: string = ''; - sharedClean : number = 0; - sharedDirty:number = 0; - privateClean:number = 0; - privateDirty:number = 0; - swap:number = 0; - swapPss:number = 0; + sharedClean: number = 0; + sharedDirty: number = 0; + privateClean: number = 0; + privateDirty: number = 0; + swap: number = 0; + swapPss: number = 0; resideStr: string = ''; } export class SmapsTreeObj { @@ -49,28 +48,28 @@ export class SmapsTreeObj { path: any = ''; size: number = 0; sizeStr: string = ''; - sizePro:number = 0; - sizeProStr :string = ''; - count :number = 0 ; + sizePro: number = 0; + sizeProStr: string = ''; + count: number = 0; rss: number = 0; rssStr: string = ''; pss: number = 0; pssStr: string = ''; - sharedClean : number = 0; - sharedCleanStr:string = ''; - sharedDirty:number = 0; - sharedDirtyStr:string = ''; - privateClean:number = 0; - privateCleanStr:string = ''; - privateDirty:number = 0; - privateDirtyStr:string = ''; - swap:number = 0; - swapStr:string = ''; - swapPss:number = 0; - swapPssStr:string = ''; + sharedClean: number = 0; + sharedCleanStr: string = ''; + sharedDirty: number = 0; + sharedDirtyStr: string = ''; + privateClean: number = 0; + privateCleanStr: string = ''; + privateDirty: number = 0; + privateDirtyStr: string = ''; + swap: number = 0; + swapStr: string = ''; + swapPss: number = 0; + swapPssStr: string = ''; children: Array = []; } -export enum SmapsType{ +export enum SmapsType { TYPE_CODE_SYS, TYPE_CODE_APP, TYPE_DATA_SYS, @@ -82,6 +81,19 @@ export enum SmapsType{ TYPE_NATIVE_HEAP, TYPE_ASHMEM, TYPE_OTHER_SYS, - TYPE_OTHER_APP + TYPE_OTHER_APP, } -export const TYPE_STRING = ['CODE_SYS','CODE_APP','DATA_SYS','DATA_APP','UNKNOWN_ANON','STACK','JS_HEAP','JAVA_VM','NATIVE_HEAP','ASHMEM','OTHER_SYS','OTHER_APP'] \ No newline at end of file +export const TYPE_STRING = [ + 'CODE_SYS', + 'CODE_APP', + 'DATA_SYS', + 'DATA_APP', + 'UNKNOWN_ANON', + 'STACK', + 'JS_HEAP', + 'JAVA_VM', + 'NATIVE_HEAP', + 'ASHMEM', + 'OTHER_SYS', + 'OTHER_APP', +]; diff --git a/ide/src/trace/bean/ThreadStruct.ts b/ide/src/trace/bean/ThreadStruct.ts index a9f69b476fe95c8e7baa12679c734dfa03190cd7..59e8a75fae17fb500709584857b9ac681d09f40e 100644 --- a/ide/src/trace/bean/ThreadStruct.ts +++ b/ide/src/trace/bean/ThreadStruct.ts @@ -51,7 +51,12 @@ export class ThreadStruct extends BaseStruct { if ('S' == threadBeanStructData.state) { threadBeanCanvasCtx.fillStyle = ThreadStruct.sColor; threadBeanCanvasCtx.globalAlpha = 0.2; // transparency - threadBeanCanvasCtx.fillRect(threadBeanStructData.frame.x, threadBeanStructData.frame.y + padding, threadBeanStructData.frame.width, threadBeanStructData.frame.height - padding * 2); + threadBeanCanvasCtx.fillRect( + threadBeanStructData.frame.x, + threadBeanStructData.frame.y + padding, + threadBeanStructData.frame.width, + threadBeanStructData.frame.height - padding * 2 + ); threadBeanCanvasCtx.globalAlpha = 1; // transparency } else if ('R' == threadBeanStructData.state) { threadBeanCanvasCtx.fillStyle = ThreadStruct.rColor; @@ -73,17 +78,33 @@ export class ThreadStruct extends BaseStruct { ) { threadBeanCanvasCtx.strokeStyle = '#232c5d'; threadBeanCanvasCtx.lineWidth = 2; - threadBeanCanvasCtx.strokeRect(threadBeanStructData.frame.x, threadBeanStructData.frame.y + padding, threadBeanStructData.frame.width - 2, threadBeanStructData.frame.height - padding * 2); + threadBeanCanvasCtx.strokeRect( + threadBeanStructData.frame.x, + threadBeanStructData.frame.y + padding, + threadBeanStructData.frame.width - 2, + threadBeanStructData.frame.height - padding * 2 + ); } } } private static drawRectAndString(threadBeanCanvasCtx: CanvasRenderingContext2D, threadBeanStructData: ThreadStruct) { // @ts-ignore - threadBeanCanvasCtx.fillRect(threadBeanStructData.frame.x, threadBeanStructData.frame.y + padding, threadBeanStructData.frame.width, threadBeanStructData.frame.height - padding * 2); + threadBeanCanvasCtx.fillRect( + threadBeanStructData.frame!.x, + threadBeanStructData.frame!.y + padding, + threadBeanStructData.frame!.width, + threadBeanStructData.frame!.height - padding * 2 + ); threadBeanCanvasCtx.fillStyle = '#fff'; // @ts-ignore - drawString(threadBeanCanvasCtx, ThreadStruct.getEndState(threadBeanStructData.state || ''), 2, threadBeanStructData.frame, threadBeanStructData); + drawString( + threadBeanCanvasCtx, + ThreadStruct.getEndState(threadBeanStructData.state || ''), + 2, + threadBeanStructData.frame!, + threadBeanStructData + ); } static getEndState(state: string): string { @@ -99,12 +120,14 @@ export class ThreadStruct extends BaseStruct { } static equals(d1: ThreadStruct, d2: ThreadStruct): boolean { - return d1 && + return ( + d1 && d2 && d1.cpu == d2.cpu && d1.tid == d2.tid && d1.state == d2.state && d1.startTime == d2.startTime && - d1.dur == d2.dur; + d1.dur == d2.dur + ); } } diff --git a/ide/src/trace/bean/WakeupBean.ts b/ide/src/trace/bean/WakeupBean.ts index bea2a9686034e9b0673f9cd5d21f3645efb321b3..739be80e303d5c6259737dca54eb1edff7c41562 100644 --- a/ide/src/trace/bean/WakeupBean.ts +++ b/ide/src/trace/bean/WakeupBean.ts @@ -17,7 +17,7 @@ export class WakeupBean { thread: string | undefined; wakeupTime: number | undefined; cpu: number | undefined; - dur: number| null | undefined; + dur: number | null | undefined; process: string | undefined; pid: number | undefined; tid: number | undefined; diff --git a/ide/src/trace/component/SpFlags.ts b/ide/src/trace/component/SpFlags.ts index 7e1cb955630819813c4197fdb3735264508ae662..8b117349f1bf96ebf40581ca006ae9e0641297a5 100644 --- a/ide/src/trace/component/SpFlags.ts +++ b/ide/src/trace/component/SpFlags.ts @@ -13,7 +13,6 @@ * limitations under the License. */ - import { BaseElement, element } from '../../base-ui/BaseElement.js'; @element('sp-flags') @@ -186,7 +185,7 @@ export class SpFlags extends BaseElement { deviceWidthLabelEl.className = 'device_label'; deviceWidthLabelEl.textContent = 'PhysicalWidth :'; let deviceWidthEl = document.createElement('input'); - deviceWidthEl.value = config.addInfo!.physicalWidth; + deviceWidthEl.value = config.addInfo!.physicalWidth; deviceWidthEl.addEventListener('keyup', () => { deviceWidthEl.value = deviceWidthEl.value.replace(/\D/g, ''); }); @@ -201,7 +200,7 @@ export class SpFlags extends BaseElement { deviceHeightLabelEl.className = 'device_label'; let deviceHeightEl = document.createElement('input'); deviceHeightEl.className = 'device_input'; - deviceHeightEl.value = config.addInfo!.physicalHeight; + deviceHeightEl.value = config.addInfo!.physicalHeight; deviceHeightEl.addEventListener('keyup', () => { deviceHeightEl.value = deviceHeightEl.value.replace(/\D/g, ''); }); @@ -237,7 +236,7 @@ export class FlagsConfig { title: 'AnimationAnalysis', switchOptions: [{ option: 'Enabled' }, { option: 'Disabled', selected: true }], describeContent: 'Analyze Animation effect templates', - addInfo: { physicalWidth: 0, physicalHeight: 0 } + addInfo: { physicalWidth: 0, physicalHeight: 0 }, }, { title: 'AppStartup', @@ -305,16 +304,14 @@ export class FlagsConfig { static getSpTraceStreamParseConfig(): string { let parseConfig = {}; - FlagsConfig.getAllFlagConfig().forEach( - configItem => { - let selectedOption = configItem.switchOptions.filter((option) => { - return option.selected; - }); - // @ts-ignore - parseConfig[configItem.title] = selectedOption[0].option === 'Enabled' ? 1 : 0; - } - ); - return JSON.stringify({ 'config': parseConfig }); + FlagsConfig.getAllFlagConfig().forEach((configItem) => { + let selectedOption = configItem.switchOptions.filter((option) => { + return option.selected; + }); + // @ts-ignore + parseConfig[configItem.title] = selectedOption[0].option === 'Enabled' ? 1 : 0; + }); + return JSON.stringify({ config: parseConfig }); } static getFlagsConfig(flagName: string): Params | undefined { diff --git a/ide/src/trace/component/SpHelp.ts b/ide/src/trace/component/SpHelp.ts index 9de6f77f6b5bce6136d79c61c88674623c5855b6..ab371917ae2707b4dc03047693eff33b424ba68f 100644 --- a/ide/src/trace/component/SpHelp.ts +++ b/ide/src/trace/component/SpHelp.ts @@ -342,6 +342,19 @@ export class SpHelp extends BaseElement { `/application/doc/quickstart_memory_template.html?${that.dark} width="100%" height="100%">`; }, }, + { + title: 'Hilog抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + SpStatisticsHttpUtil.addOrdinaryVisitAction({ + event: 'hilog', + action: 'help_doc', + }); + that.appContent!.innerHTML = + ' { this.initDataTableStyle(metaDataStyle!); diff --git a/ide/src/trace/component/SpMetrics.ts b/ide/src/trace/component/SpMetrics.ts index f630a2eb84598673a4955a093a4f6b6bf4789a8d..0a41225051ae9fd488c7279d955e77368cd61015 100644 --- a/ide/src/trace/component/SpMetrics.ts +++ b/ide/src/trace/component/SpMetrics.ts @@ -15,9 +15,7 @@ import { BaseElement, element } from '../../base-ui/BaseElement.js'; -import { - queryMetric, -} from '../database/SqlLite.js'; +import { queryMetric } from '../database/SqlLite.js'; import '../../base-ui/table/lit-table.js'; import { LitProgressBar } from '../../base-ui/progress-bar/LitProgressBar.js'; @@ -52,7 +50,7 @@ export class SpMetrics extends BaseElement { let index = this.selectMetricEl!.selectedIndex; let optionEl = this.selectMetricEl?.querySelectorAll('option')[index]; if (optionEl && optionEl.value !== '') { - queryMetric(optionEl.value).then((result)=>{ + queryMetric(optionEl.value).then((result) => { this.metricProgressLoad!.loading = false; this.responseJson!.textContent = result.toString(); }); diff --git a/ide/src/trace/component/SpQuerySQL.ts b/ide/src/trace/component/SpQuerySQL.ts index 79fc8c2f18ab142c3835823fb01d45cc0b22a2e4..1b3bbf02314073728920b6cf38c3f752809cb5c4 100644 --- a/ide/src/trace/component/SpQuerySQL.ts +++ b/ide/src/trace/component/SpQuerySQL.ts @@ -46,7 +46,7 @@ export class SpQuerySQL extends BaseElement { this.progressLoad = this.shadowRoot?.querySelector('.load-query-sql') as LitProgressBar; this.selector = this.shadowRoot?.querySelector('.sql-select') as HTMLTextAreaElement; this.queryTableEl = this.shadowRoot?.querySelector('lit-table') as LitTable; - this.queryTableEl.setAttribute('data-query-scene',''); + this.queryTableEl.setAttribute('data-query-scene', ''); this.querySize = this.shadowRoot?.querySelector('.query_size') as HTMLElement; this.response = this.shadowRoot?.querySelector('#dataResult') as HTMLDivElement; this.pagination = this.shadowRoot?.querySelector('.pagination-box') as PaginationBox; @@ -70,10 +70,10 @@ export class SpQuerySQL extends BaseElement { this.initCommonList(); } - private initCommonList() : void { + private initCommonList(): void { let commonSqlList = getAllSql(); if (commonSqlList.length > 0) { - for (let i = 0;i < commonSqlList.length; i ++) { + for (let i = 0; i < commonSqlList.length; i++) { let commonSqlDiv = document.createElement('div'); commonSqlDiv.className = 'sql-item'; let sql = document.createElement('div'); @@ -169,15 +169,14 @@ export class SpQuerySQL extends BaseElement { this.keyList = Object.keys(resultList[0]); this.querySize!.textContent = `Query result - ${this.statDataArray.length} counts.`; this.initDataElement(); - this.response!.appendChild(this.queryTableEl!); - this.setPageNationTableEl(); - setTimeout(() => { - if (this.parentElement?.clientHeight !== 0) { + this.response!.appendChild(this.queryTableEl!); + this.setPageNationTableEl(); + setTimeout(() => { + if (this.parentElement?.clientHeight !== 0) { this.queryTableEl!.style.height = '100%'; this.queryTableEl!.reMeauseHeight(); - } - }, 300); - + } + }, 300); } else { this.querySize!.textContent = `Query result - ${this.statDataArray.length} counts.`; this.progressLoad!.loading = false; @@ -229,7 +228,8 @@ export class SpQuerySQL extends BaseElement { return false; } else { let queryNormalLength = 15; - if (this.selector!.value.length < queryNormalLength || + if ( + this.selector!.value.length < queryNormalLength || !this.selector?.value.toLowerCase().trim().startsWith('select') ) { this.querySqlErrorText = `Query result - (Error): @@ -271,10 +271,9 @@ export class SpQuerySQL extends BaseElement { this.selector!.addEventListener('input', this.inputSqlListener); this.selector!.addEventListener('change', this.inputSqlListener); this.selector!.addEventListener('keydown', this.deleteSqlListener); - this.shadowRoot?.querySelectorAll('.runButton'). - forEach((it) => ( - it.addEventListener('click', this.runSqlListener) - )); + this.shadowRoot + ?.querySelectorAll('.runButton') + .forEach((it) => it.addEventListener('click', this.runSqlListener)); } runSqlListener = (e: Event): void => { @@ -495,6 +494,9 @@ export class SpQuerySQL extends BaseElement { lit-icon { text-overflow: ellipsis; } + .runButton:hover { + cursor: pointer; + }
    diff --git a/ide/src/trace/component/SpRecordTrace.ts b/ide/src/trace/component/SpRecordTrace.ts index 3456de222483f27a7d01e68914ed79f511793d57..9677ca1b0db32ce2211de333f12ab344388435be 100644 --- a/ide/src/trace/component/SpRecordTrace.ts +++ b/ide/src/trace/component/SpRecordTrace.ts @@ -28,7 +28,7 @@ import { CpuConfig, CreateSessionRequest, DiskioConfig, - FileSystemConfig, + HiebpfConfig, FpsConfig, HilogConfig, HiperfPluginConfig, @@ -69,6 +69,7 @@ import { SpStatisticsHttpUtil } from '../../statistics/util/SpStatisticsHttpUtil import { SpArkTs } from './setting/SpArkTs.js'; import { SpWebHdcShell } from './setting/SpWebHdcShell.js'; import { SpHilogRecord } from './setting/SpHilogRecord.js'; +import { LongTraceDBUtils } from '../database/LongTraceDBUtils.js'; @element('sp-record-trace') export class SpRecordTrace extends BaseElement { @@ -80,6 +81,7 @@ export class SpRecordTrace extends BaseElement { public static cancelRecord = false; static supportVersions = ['3.2', '4.0+']; private nowChildItem: HTMLElement | undefined; + private longTraceList: Array = []; set record_template(re: boolean) { if (re) { @@ -87,6 +89,9 @@ export class SpRecordTrace extends BaseElement { } else { this.removeAttribute('record_template'); } + if (this.recordSetting) { + this.recordSetting.isRecordTemplate = re; + } } get record_template(): boolean { @@ -522,6 +527,19 @@ export class SpRecordTrace extends BaseElement { mainMenu.menus = mainMenu.menus; } + refreshConfig(isTraceConfig: boolean) { + let recordSettingEl = this.shadowRoot?.querySelector('record-setting') as SpRecordSetting; + if (recordSettingEl) { + if (isTraceConfig) { + recordSettingEl.setAttribute('trace_config', ''); + } else { + if (recordSettingEl.hasAttribute('trace_config')) { + recordSettingEl.removeAttribute('trace_config'); + } + } + } + } + refreshHint() { let flags = FlagsConfig.getAllFlagConfig(); let showHint = false; @@ -571,7 +589,9 @@ export class SpRecordTrace extends BaseElement { initElements(): void { let parentElement = this.parentNode as HTMLElement; - parentElement.style.overflow = 'hidden'; + if (parentElement) { + parentElement.style.overflow = 'hidden'; + } this.recordSetting = new SpRecordSetting(); this.probesConfig = new SpProbesConfig(); this.traceCommand = new SpTraceCommand(); @@ -661,14 +681,6 @@ export class SpRecordTrace extends BaseElement { this.appendDeviceVersion(); // @ts-ignore if (navigator.usb) { - // @ts-ignore - navigator.usb.addEventListener( - 'connect', - // @ts-ignore - (ev: USBConnectionEvent) => { - this.usbConnectionListener(ev); - } - ); // @ts-ignore navigator.usb.addEventListener( 'disconnect', @@ -706,8 +718,8 @@ export class SpRecordTrace extends BaseElement { this.recordButtonText = this.shadowRoot?.querySelector('.record_text') as HTMLSpanElement; this.cancelButton = this.shadowRoot?.querySelector('.cancel') as LitButton; this.sp = document.querySelector('sp-application') as SpApplication; - this.progressEL = this.sp.shadowRoot?.querySelector('.progress') as LitProgressBar; - this.litSearch = this.sp.shadowRoot?.querySelector('#lit-record-search') as LitSearch; + this.progressEL = this.sp?.shadowRoot?.querySelector('.progress') as LitProgressBar; + this.litSearch = this.sp?.shadowRoot?.querySelector('#lit-record-search') as LitSearch; if (this.deviceSelect!.options && this.deviceSelect!.options.length > 0) { this.disconnectButton!.hidden = false; this.recordButton!.hidden = false; @@ -1007,6 +1019,7 @@ export class SpRecordTrace extends BaseElement { clickHandler: function (ev: InputEvent): void { that.appContent!.innerHTML = ''; that.appContent!.append(that.spFileSystem!); + that.spFileSystem!.setAttribute('long_trace', ''); that.freshMenuItemsStatus('eBPF Config'); }, }, @@ -1246,79 +1259,21 @@ export class SpRecordTrace extends BaseElement { this.buttonDisable(true); this.freshMenuDisable(true); this.freshConfigMenuDisable(true); - HdcDeviceManager.shellResultAsString(CmdConstant.CMD_SHELL + traceCommandStr, false).then( - (traceResult) => { - let re = this.isSuccess(traceResult); - if (re == 0) { - this.litSearch!.setPercent('tracing htrace down', -1); - HdcDeviceManager.shellResultAsString( - CmdConstant.CMD_TRACE_FILE_SIZE + this.recordSetting!.output, - false - ).then((traceFileSize) => { - this.litSearch!.setPercent(`traceFileSize is ${traceFileSize}`,-1); - if (traceFileSize.indexOf('No such') != -1) { - this.litSearch!.setPercent('No such file or directory', -2); - this.buttonDisable(false); - this.freshConfigMenuDisable(false); - this.freshMenuDisable(false); - } else if (Number(traceFileSize) <= SpRecordTrace.MaxFileSize) { - HdcDeviceManager.fileRecv(this.recordSetting!.output, (perNumber: number) => { - this.litSearch!.setPercent('downloading Hitrace file ', perNumber); - }).then((pullRes) => { - this.litSearch!.setPercent('downloading Hitrace file ', 101); - pullRes.arrayBuffer().then((buffer) => { - let fileName = this.recordSetting!.output.substring( - this.recordSetting!.output.lastIndexOf('/') + 1 - ); - let file = new File([buffer], fileName); - let main = this!.parentNode!.parentNode!.querySelector('lit-main-menu') as LitMainMenu; - let children = main.menus as Array; - let child = children[0].children as Array; - let fileHandler = child[0].fileHandler; - if (fileHandler && !SpRecordTrace.cancelRecord) { - this.freshConfigMenuDisable(false); - this.freshMenuDisable(false); - this.buttonDisable(false); - this.recordButtonDisable(false); - fileHandler({ - detail: file, - }); - } else { - SpRecordTrace.cancelRecord = false; - } - }); - }); - } else { - this.recordButtonText!.textContent = this.record; - this.recordButtonDisable(false); - this.litSearch!.setPercent('htrace file is too big', -2); - this.buttonDisable(false); - this.freshConfigMenuDisable(false); - this.freshMenuDisable(false); - } - }); - } else if (re == 2) { - this.recordButtonDisable(false); - this.litSearch!.setPercent('stop tracing htrace ', -1); - this.freshConfigMenuDisable(false); - this.freshMenuDisable(false); - this.buttonDisable(false); - } else if (re == -1) { - this.recordButtonDisable(false); - this.litSearch!.setPercent('The device is abnormal', -2); - this.progressEL!.loading = false; - this.freshConfigMenuDisable(false); - this.freshMenuDisable(false); - this.buttonDisable(false); - } else { - this.recordButtonDisable(false); - this.litSearch!.setPercent('tracing htrace failed, please check your config ', -2); - this.freshConfigMenuDisable(false); - this.freshMenuDisable(false); - this.buttonDisable(false); - } - } - ); + if (SpApplication.isLongTrace) { + HdcDeviceManager.shellResultAsString( + CmdConstant.CMD_CLEAR_LONG_FOLD + this.recordSetting!.longOutPath, + false + ).then(() => { + HdcDeviceManager.shellResultAsString( + CmdConstant.CMD_MKDIR_LONG_FOLD + this.recordSetting!.longOutPath, + false + ).then(() => { + this.recordLongTraceCmd(traceCommandStr); + }); + }); + } else { + this.recordTraceCmd(traceCommandStr); + } }); }); } catch (e) { @@ -1335,6 +1290,265 @@ export class SpRecordTrace extends BaseElement { } } + private recordTraceCmd(traceCommandStr: string): void { + HdcDeviceManager.shellResultAsString(CmdConstant.CMD_SHELL + traceCommandStr, false).then((traceResult) => { + let re = this.isSuccess(traceResult); + if (re == 0) { + this.litSearch!.setPercent('tracing htrace down', -1); + HdcDeviceManager.shellResultAsString(CmdConstant.CMD_TRACE_FILE_SIZE + this.recordSetting!.output, false).then( + (traceFileSize) => { + this.litSearch!.setPercent(`traceFileSize is ${traceFileSize}`, -1); + if (traceFileSize.indexOf('No such') != -1) { + this.litSearch!.setPercent('No such file or directory', -2); + this.buttonDisable(false); + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + } else if (Number(traceFileSize) <= SpRecordTrace.MaxFileSize) { + HdcDeviceManager.fileRecv(this.recordSetting!.output, (perNumber: number) => { + this.litSearch!.setPercent('downloading Hitrace file ', perNumber); + }).then((pullRes) => { + this.litSearch!.setPercent('downloading Hitrace file ', 101); + pullRes.arrayBuffer().then((buffer) => { + let fileName = this.recordSetting!.output.substring(this.recordSetting!.output.lastIndexOf('/') + 1); + let file = new File([buffer], fileName); + let main = this!.parentNode!.parentNode!.querySelector('lit-main-menu') as LitMainMenu; + let children = main.menus as Array; + let child = children[0].children as Array; + let fileHandler = child[0].fileHandler; + if (fileHandler && !SpRecordTrace.cancelRecord) { + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + this.buttonDisable(false); + this.recordButtonDisable(false); + fileHandler({ + detail: file, + }); + } else { + SpRecordTrace.cancelRecord = false; + } + }); + }); + } else { + this.recordButtonText!.textContent = this.record; + this.recordButtonDisable(false); + this.litSearch!.setPercent('htrace file is too big', -2); + this.buttonDisable(false); + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + } + } + ); + } else if (re == 2) { + this.recordButtonDisable(false); + this.litSearch!.setPercent('stop tracing htrace ', -1); + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + this.buttonDisable(false); + } else if (re == -1) { + this.recordButtonDisable(false); + this.litSearch!.setPercent('The device is abnormal', -2); + this.progressEL!.loading = false; + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + this.buttonDisable(false); + } else { + this.recordButtonDisable(false); + this.litSearch!.setPercent('tracing htrace failed, please check your config ', -2); + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + this.buttonDisable(false); + } + }); + } + + private recordLongTraceCmd(traceCommandStr: string): void { + HdcDeviceManager.shellResultAsString(CmdConstant.CMD_SHELL + traceCommandStr, false).then((traceResult) => { + let re = this.isSuccess(traceResult); + if (re === 0) { + this.litSearch!.setPercent('tracing htrace down', -1); + HdcDeviceManager.shellResultAsString( + CmdConstant.CMD_TRACE_FILE_SIZE + this.recordSetting!.longOutPath, + false + ).then((traceFileSize) => { + this.litSearch!.setPercent(`traceFileSize is ${traceFileSize}`, -1); + if (traceFileSize.indexOf('No such') != -1) { + this.litSearch!.setPercent('No such file or directory', -2); + this.buttonDisable(false); + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + } else { + this.recordLongTrace(); + } + }); + } else if (re === 2) { + this.recordButtonDisable(false); + this.litSearch!.setPercent('stop tracing htrace ', -1); + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + this.buttonDisable(false); + } else if (re === -1) { + this.recordButtonDisable(false); + this.litSearch!.setPercent('The device is abnormal', -2); + this.progressEL!.loading = false; + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + this.buttonDisable(false); + } else { + this.recordButtonDisable(false); + this.litSearch!.setPercent('tracing htrace failed, please check your config ', -2); + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + this.buttonDisable(false); + } + }); + } + + private loadLongTraceFile(timStamp: number) { + return new Promise(async (resolve) => { + let maxSize = 48 * 1024 * 1024; + let traceTypePage: Array = []; + for (let fileIndex = 0; fileIndex < this.longTraceList.length; fileIndex++) { + let traceFileName = this.longTraceList[fileIndex]; + if (this.sp!.fileTypeList.some(fileType => traceFileName.toLowerCase().includes(fileType))) { + continue; + } + let firstLastIndexOf = traceFileName.lastIndexOf('.'); + let firstText = traceFileName.slice(0, firstLastIndexOf); + let resultLastIndexOf = firstText.lastIndexOf('_'); + traceTypePage.push(Number(firstText.slice(resultLastIndexOf + 1, firstText.length)) - 1) + } + traceTypePage.sort((leftNum: number, rightNum: number) => leftNum - rightNum); + for (let fileIndex = 0; fileIndex < this.longTraceList.length; fileIndex++) { + if (this.longTraceList[fileIndex] !== '') { + let types = this.sp!.fileTypeList.filter((type) => + this.longTraceList[fileIndex].toLowerCase().includes(type.toLowerCase()) + ); + let pageNumber = 0; + let fileType = types[0]; + if (types.length === 0) { + fileType = 'trace'; + let searchNumber = + Number( + this.longTraceList[fileIndex].substring( + this.longTraceList[fileIndex].lastIndexOf('_') + 1, + this.longTraceList[fileIndex].lastIndexOf('.') + ) + ) - 1; + pageNumber = traceTypePage.lastIndexOf(searchNumber); + } + let pullRes = await HdcDeviceManager.fileRecv( + this.recordSetting!.longOutPath + this.longTraceList[fileIndex], + (perNumber: number) => { + this.litSearch!.setPercent(`downloading ${fileType} file `, perNumber); + } + ); + this.litSearch!.setPercent(`downloading ${fileType} file `, 101); + let buffer = await pullRes.arrayBuffer(); + let chunks = Math.ceil(buffer.byteLength / maxSize); + let offset = 0; + let sliceLen = 0; + let message = { + fileType: '', + startIndex: 0, + endIndex: 0, + size: 0, + }; + for (let chunkIndex = 0; chunkIndex < chunks; chunkIndex++) { + let start = chunkIndex * maxSize; + let end = Math.min(start + maxSize, buffer.byteLength); + let chunk = buffer.slice(start, end); + if (chunkIndex === 0) { + message.fileType = fileType; + message.startIndex = chunkIndex; + } + sliceLen = Math.min(buffer.byteLength - offset, maxSize); + if (chunkIndex === 0 && fileType === 'trace') { + this.sp!.longTraceHeadMessageList.push({ + pageNum: pageNumber, + data: buffer.slice(offset, 1024), + }); + } + this.sp!.longTraceDataList.push({ + index: chunkIndex, + fileType: fileType, + pageNum: pageNumber, + startOffsetSize: offset, + endOffsetSize: offset + sliceLen, + }); + await LongTraceDBUtils.getInstance().indexedDBHelp.add(LongTraceDBUtils.getInstance().tableName, { + buf: chunk, + id: `${fileType}_${timStamp}_${pageNumber}_${chunkIndex}`, + fileType: fileType, + pageNum: pageNumber, + startOffset: offset, + endOffset: offset + sliceLen, + index: chunkIndex, + timStamp: timStamp, + }); + offset += sliceLen; + if (offset >= buffer.byteLength) { + message.endIndex = chunkIndex; + message.size = buffer.byteLength; + if (this.sp!.longTraceTypeMessageMap) { + if (this.sp!.longTraceTypeMessageMap?.has(pageNumber)) { + let oldTypeList = this.sp!.longTraceTypeMessageMap?.get(pageNumber); + oldTypeList?.push(message); + this.sp!.longTraceTypeMessageMap?.set(pageNumber, oldTypeList!); + } else { + this.sp!.longTraceTypeMessageMap?.set(pageNumber, [message]); + } + } else { + this.sp!.longTraceTypeMessageMap = new Map(); + this.sp!.longTraceTypeMessageMap.set(pageNumber, [message]); + } + } + } + } + } + resolve(1); + }); + } + + private recordLongTrace(): void { + let querySelector = this.sp!.shadowRoot?.querySelector('.long_trace_page') as HTMLDivElement; + if (querySelector) { + querySelector.style.display = 'none'; + } + HdcDeviceManager.shellResultAsString(CmdConstant.CMD_GET_LONG_FILES + this.recordSetting!.longOutPath, false).then( + (result) => { + this.longTraceList = result.split('\n').filter((fileName) => Boolean(fileName)); + if (this.longTraceList.length > 0) { + this.sp!.longTraceHeadMessageList = []; + this.sp!.longTraceDataList = []; + this.sp!.longTraceTypeMessageMap = undefined; + let timStamp = new Date().getTime(); + this.loadLongTraceFile(timStamp).then(() => { + let main = this!.parentNode!.parentNode!.querySelector('lit-main-menu') as LitMainMenu; + let children = main.menus as Array; + let child = children[0].children as Array; + let fileHandler = child[1].clickHandler; + if (fileHandler && !SpRecordTrace.cancelRecord) { + this.freshConfigMenuDisable(false); + this.freshMenuDisable(false); + this.buttonDisable(false); + this.recordButtonDisable(false); + fileHandler( + { + detail: { + timeStamp: timStamp, + }, + }, + true + ); + } else { + SpRecordTrace.cancelRecord = false; + } + }); + } + } + ); + } + private initRecordUIState(): void { this.buttonDisable(true); this.freshMenuDisable(true); @@ -1363,6 +1577,11 @@ export class SpRecordTrace extends BaseElement { request.pluginConfigs.push(config); }); } else { + if (SpApplication.isLongTrace && request.sessionConfig) { + request.sessionConfig.splitFile = true; + request.sessionConfig!.splitFileMaxSizeMb = this.recordSetting!.longTraceSingleFileMaxSize; + request.sessionConfig!.splitFileMaxNum = 20; + } let hasMonitorMemory = false; let hasSamps = false; if (this.probesConfig!.traceConfig.length > 0) { @@ -1437,12 +1656,11 @@ export class SpRecordTrace extends BaseElement { resultMaxSize: 0, keepAliveTime: 0, }; - let request: CreateSessionRequest = { + return { requestId: 1, sessionConfig: sessionConfig, pluginConfigs: [], }; - return request; } private createMonitorPlugin(that: this, request: CreateSessionRequest): void { @@ -1809,6 +2027,9 @@ export class SpRecordTrace extends BaseElement { outfileName: '/data/local/tmp/perf.data', recordArgs: recordArgs, }; + if (SpApplication.isLongTrace) { + hiPerf.splitOutfileName = `${this.recordSetting!.longOutPath}hiprofiler_data_hiperf.htrace`; + } let hiPerfPluginConfig: ProfilerPluginConfig = { pluginName: 'hiperf-plugin', sampleInterval: reportingFrequency * 1000, @@ -1817,7 +2038,7 @@ export class SpRecordTrace extends BaseElement { return hiPerfPluginConfig; } - private createSystemConfig(): ProfilerPluginConfig { + private createSystemConfig(): ProfilerPluginConfig { let systemConfig = this.spFileSystem!.getSystemConfig(); let recordArgs = 'hiebpf'; let recordEvent = []; @@ -1838,11 +2059,14 @@ export class SpRecordTrace extends BaseElement { recordArgs = `${recordArgs} --pids ${systemConfig?.process}`; } recordArgs += ` --max_stack_depth ${systemConfig?.unWindLevel}`; - let systemPluginConfig: FileSystemConfig = { + let systemPluginConfig: HiebpfConfig = { cmdLine: recordArgs, outfileName: '/data/local/tmp/ebpf.data', }; - let ebpfPluginConfig: ProfilerPluginConfig = { + if (SpApplication.isLongTrace) { + systemPluginConfig.splitOutfileName = `${this.recordSetting?.longOutPath}hiprofiler_data_ebpf.htrace`; + } + let ebpfPluginConfig: ProfilerPluginConfig = { pluginName: 'hiebpf-plugin', sampleInterval: 1000, configData: systemPluginConfig, @@ -1989,6 +2213,9 @@ export class SpRecordTrace extends BaseElement { enable_cpu_profiler: this.spArkTs!.grabCpuProfiler, cpu_profiler_interval: this.spArkTs!.intervalCpuValue, }; + if (SpApplication.isLongTrace) { + arkTSConfig.splitOutfileName = `${this.recordSetting?.longOutPath}hiprofiler_data_arkts.htrace`; + } let arkTSPluginConfig: ProfilerPluginConfig = { pluginName: 'arkts-plugin', sampleInterval: 5000, diff --git a/ide/src/trace/component/SpRecyclerSystemTrace.ts b/ide/src/trace/component/SpRecyclerSystemTrace.ts index b7d4e3369c01d1c3d22bf7312d8274250f1073e8..3dcd23320bb2d7b2504d1b615e6402741b13d43f 100644 --- a/ide/src/trace/component/SpRecyclerSystemTrace.ts +++ b/ide/src/trace/component/SpRecyclerSystemTrace.ts @@ -296,7 +296,10 @@ export class SpRecyclerSystemTrace extends BaseElement { let scrollHeight = this.rowsEL?.clientHeight || 0; this.rowsEL?.querySelectorAll('trace-row').forEach((rowItem: any) => { let top = rowItem.offsetTop - (this.rowsEL?.offsetTop || 0); - if (top + rowItem.clientHeight > scrollTop && top + rowItem.clientHeight < scrollTop + scrollHeight + rowItem.clientHeight) { + if ( + top + rowItem.clientHeight > scrollTop && + top + rowItem.clientHeight < scrollTop + scrollHeight + rowItem.clientHeight + ) { (rowItem as TraceRow).dataListCache.length = 0; } }); @@ -312,7 +315,10 @@ export class SpRecyclerSystemTrace extends BaseElement { let scrollHeight = this.rowsEL?.clientHeight || 0; this.rowsEL?.querySelectorAll('trace-row').forEach((item: any) => { let top = item.offsetTop - (this.rowsEL?.offsetTop || 0); - if (top + item.clientHeight > scrollTop && top + item.clientHeight < scrollTop + scrollHeight + item.clientHeight) { + if ( + top + item.clientHeight > scrollTop && + top + item.clientHeight < scrollTop + scrollHeight + item.clientHeight + ) { (item as TraceRow).dataListCache.length = 0; } }); diff --git a/ide/src/trace/component/SpSystemTrace.ts b/ide/src/trace/component/SpSystemTrace.ts index 55419edf9b0cdbc4d3cd25b575a47b640b904de2..4c434a1cf1b2ddc05628bc92c50666c030c451d6 100644 --- a/ide/src/trace/component/SpSystemTrace.ts +++ b/ide/src/trace/component/SpSystemTrace.ts @@ -295,7 +295,7 @@ export class SpSystemTrace extends BaseElement { let cpuFavoriteRow: any = this.shadowRoot?.querySelector>( `trace-row[row-type='cpu-data'][row-id='${wakeupCpuLists[i]}']` ); - if (!cpuFavoriteRow){ + if (!cpuFavoriteRow) { return; } cpuFavoriteRow!.setAttribute('collect-type', ''); @@ -436,10 +436,10 @@ export class SpSystemTrace extends BaseElement { replaceRow.setAttribute('type', 'replaceRow'); replaceRow.setAttribute('row-parent-id', currentRow.rowParentId); replaceRow.style.display = 'none'; - if (!currentRow.hasAttribute('scene')){ - currentRow.setAttribute('row-hidden','') + if (!currentRow.hasAttribute('scene')) { + currentRow.setAttribute('row-hidden', ''); } else { - currentRow.removeAttribute('row-hidden') + currentRow.removeAttribute('row-hidden'); } // 添加收藏时,在线程名前面追加父亲ID let rowParentId = currentRow.rowParentId; @@ -458,13 +458,8 @@ export class SpSystemTrace extends BaseElement { } }); } - if (this.rowsEL!.contains(currentRow)) { + if (!currentRow.hasParentRowEl) { this.rowsEL!.replaceChild(replaceRow, currentRow); - } else { - if (currentRow.hasParentRowEl) { - let parent = currentRow.parentRowEl; - parent!.replaceTraceRow(replaceRow, currentRow); - } } this.favoriteChartListEL?.insertRow(currentRow, this.currentCollectGroup, event.detail.type !== 'auto-collect'); } else { @@ -483,24 +478,28 @@ export class SpSystemTrace extends BaseElement { row = parent; } for (let index: number = allowExpansionRow.length - 1; index >= 0; index--) { - if (!allowExpansionRow[index]?.expansion && allowExpansionRow[index]?.hasAttribute('scene')) { - allowExpansionRow[index].expansion = true; + if (allowExpansionRow[index]?.hasAttribute('scene')) { + if (allowExpansionRow[index]!.expansion) { + allowExpansionRow[index].updateChildRowStatus(); + } else { + allowExpansionRow[index].expansion = true; + } } } allowExpansionRow.length = 0; let replaceRow = this.rowsEL!.querySelector( `div[row-id='${currentRow.rowId}-${currentRow.rowType}']` ); + // 取消收藏时,删除父亲ID + let rowNameArr = currentRow.name.split('('); + if (rowNameArr.length > 1) { + let tempName = ''; + tempName += rowNameArr[0]; + currentRow.name = tempName; + } else { + currentRow.name = rowNameArr[0]; + } if (replaceRow != null) { - // 取消收藏时,删除父亲ID - let rowNameArr = currentRow.name.split('('); - if (rowNameArr.length > 1) { - let tempName = ''; - tempName += rowNameArr[0]; - currentRow.name = tempName; - } else { - currentRow.name = rowNameArr[0]; - } this.rowsEL!.replaceChild(currentRow, replaceRow); currentRow.style.boxShadow = `0 10px 10px #00000000`; } @@ -954,6 +953,13 @@ export class SpSystemTrace extends BaseElement { (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; + } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { + selection.gpu.graph = + item.dataList.filter( + (it) => + (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || + (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) + ).length > 0; } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { selection.gpu.gpuTotal = item.dataList.filter( @@ -1009,6 +1015,13 @@ export class SpSystemTrace extends BaseElement { (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; + } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { + selection.gpu.graph = + th.dataList.filter( + (it) => + (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || + (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) + ).length > 0; } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { selection.gpu.gpuTotal = th.dataList.filter( @@ -1036,6 +1049,13 @@ export class SpSystemTrace extends BaseElement { (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; + } else if (it.rowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { + selection.gpu.graph = + it.dataList.filter( + (it) => + (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || + (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) + ).length > 0; } else if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { selection.gpu.gpuTotal = it.dataList.filter( @@ -1323,11 +1343,12 @@ export class SpSystemTrace extends BaseElement { window.subscribe(window.SmartEvent.UI.CollapseAllLane, (collapse: boolean) => { if (!collapse) { // 一键折叠之前,记录当前打开的泳道图 - this.expandRowList = Array.from(this.rowsEL!.querySelectorAll>(`trace-row[folder][expansion]`)) || []; + this.expandRowList = + Array.from(this.rowsEL!.querySelectorAll>(`trace-row[folder][expansion]`)) || []; } this.collapseAll = true; this.setAttribute('disable', ''); - this.expandRowList!.forEach((it) => it.expansion = collapse); + this.expandRowList!.forEach((it) => (it.expansion = collapse)); this.collapseAll = false; this.removeAttribute('disable'); this.refreshCanvas(true); @@ -1362,15 +1383,15 @@ export class SpSystemTrace extends BaseElement { } } - getCollectRows(condition: string) { + getCollectRows(condition: string): Array> { return this.favoriteChartListEL!.getCollectRows(condition); } - getAllCollectRows(){ + getAllCollectRows(): Array> { return this.favoriteChartListEL!.getCollectRows('trace-row'); } - getAllSelectCollectRows(){ + getAllSelectCollectRows(): Array> { return this.favoriteChartListEL!.getCollectRows("trace-row[check-type='2']"); } @@ -1666,8 +1687,19 @@ export class SpSystemTrace extends BaseElement { // Draw the connection curve if (this.linkNodes) { - drawLinkLines(this.canvasPanelCtx!, this.linkNodes, this.timerShaftEL!, false, this.favoriteChartListEL!.clientHeight); - this.favoriteChartListEL?.drawLinkLines(this.linkNodes, this.timerShaftEL!, true, this.favoriteChartListEL!.clientHeight); + drawLinkLines( + this.canvasPanelCtx!, + this.linkNodes, + this.timerShaftEL!, + false, + this.favoriteChartListEL!.clientHeight + ); + this.favoriteChartListEL?.drawLinkLines( + this.linkNodes, + this.timerShaftEL!, + true, + this.favoriteChartListEL!.clientHeight + ); } } @@ -2447,6 +2479,10 @@ export class SpSystemTrace extends BaseElement { TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER, () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], + [ + TraceRow.ROW_TYPE_GPU_RESOURCE_VMTRACKER, + () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + ], [ TraceRow.ROW_TYPE_VMTRACKER_SHM, () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, @@ -2965,6 +3001,9 @@ export class SpSystemTrace extends BaseElement { SnapshotStruct.selectSnapshotStruct.startNs, gpuMemoryVmTracker!.dataList ); + } else if (clickRowType === TraceRow.ROW_TYPE_GPU_RESOURCE_VMTRACKER && SnapshotStruct.hoverSnapshotStruct) { + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + this.traceSheetEL?.displayGpuResourceVmTracker(SnapshotStruct.selectSnapshotStruct.startNs); } else { if (!JankStruct.hoverJankStruct && JankStruct.delJankLineFlag) { this.removeLinkLinesByBusinessType('janks'); diff --git a/ide/src/trace/component/Utils.ts b/ide/src/trace/component/Utils.ts index bd5854ea34b948c723ea3bf31bcb32dc3d1dc673..7c34052ec27f36c858c1bd933bfa899c4fa8b8f3 100644 --- a/ide/src/trace/component/Utils.ts +++ b/ide/src/trace/component/Utils.ts @@ -12,15 +12,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { JsCpuProfilerChartFrame } from '../bean/JsStruct.js'; -import { SnapshotStruct } from '../database/ui-worker/ProcedureWorkerSnapshot.js'; -import { RangeSelectStruct, TraceRow } from './trace/base/TraceRow.js'; +import { type JsCpuProfilerChartFrame } from '../bean/JsStruct.js'; +import { type SnapshotStruct } from '../database/ui-worker/ProcedureWorkerSnapshot.js'; +import { type RangeSelectStruct, TraceRow } from './trace/base/TraceRow.js'; export function setSelectState( data: JsCpuProfilerChartFrame, frameSelectDataIdArr: Array, parent?: JsCpuProfilerChartFrame -) { +): void { if (TraceRow.rangeSelectObject?.startNS && TraceRow.rangeSelectObject?.endNS) { let startTime = 0; let endTime = 0; @@ -51,9 +51,10 @@ export function setSelectState( } } -export function intersectData(row:TraceRow) { - let isIntersect = (snapshotStruct: SnapshotStruct, rangeSelectStruct: RangeSelectStruct) => - Math.max(snapshotStruct.startNs! + snapshotStruct.dur!, rangeSelectStruct!.endNS || 0) - Math.min(snapshotStruct.startNs!, rangeSelectStruct!.startNS || 0) < +export function intersectData(row: TraceRow): any[] { + let isIntersect = (snapshotStruct: SnapshotStruct, rangeSelectStruct: RangeSelectStruct): boolean => + Math.max(snapshotStruct.startNs! + snapshotStruct.dur!, rangeSelectStruct!.endNS || 0) - + Math.min(snapshotStruct.startNs!, rangeSelectStruct!.startNS || 0) < snapshotStruct.dur! + (rangeSelectStruct!.endNS || 0) - (rangeSelectStruct!.startNS || 0); let intersectData = row.dataList.filter((struct: SnapshotStruct) => { return isIntersect(struct, TraceRow.rangeSelectObject!); diff --git a/ide/src/trace/component/chart/SpAbilityMonitorChart.ts b/ide/src/trace/component/chart/SpAbilityMonitorChart.ts index 683d84cda6815ec1b10bc8accb1d66b6d4077ea5..0cdc8127182fa4ef38af0ee6bcfe689ad7b1c96c 100644 --- a/ide/src/trace/component/chart/SpAbilityMonitorChart.ts +++ b/ide/src/trace/component/chart/SpAbilityMonitorChart.ts @@ -41,8 +41,8 @@ import { import { info } from '../../../log/Log.js'; import { TraceRow } from '../trace/base/TraceRow.js'; import { Utils } from '../trace/base/Utils.js'; -import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js'; -import { ProcessStruct } from '../../database/ui-worker/ProcedureWorkerProcess.js'; +import { type EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js'; +import { type ProcessStruct } from '../../database/ui-worker/ProcedureWorkerProcess.js'; import { CpuAbilityMonitorStruct, CpuAbilityRender } from '../../database/ui-worker/ProcedureWorkerCpuAbility.js'; import { MemoryAbilityMonitorStruct, @@ -57,7 +57,7 @@ import { NetworkAbilityRender, } from '../../database/ui-worker/ProcedureWorkerNetworkAbility.js'; import { renders } from '../../database/ui-worker/ProcedureWorker.js'; -import { SnapshotRender, SnapshotStruct } from '../../database/ui-worker/ProcedureWorkerSnapshot.js'; +import { type SnapshotRender, SnapshotStruct } from '../../database/ui-worker/ProcedureWorkerSnapshot.js'; export class SpAbilityMonitorChart { private trace: SpSystemTrace; @@ -835,7 +835,7 @@ export class SpAbilityMonitorChart { info('The time to load the Ability Network is: ', durTime); }; - private initPurgeableAbility = async (processRow: TraceRow) => { + private initPurgeableAbility = async (processRow: TraceRow): Promise => { let time = new Date().getTime(); let purgeableTotalData = await queryPurgeableSysData(); if (purgeableTotalData.length > 0) { @@ -854,8 +854,8 @@ export class SpAbilityMonitorChart { totalTraceRow.setAttribute('children', ''); totalTraceRow.name = `Purgeable Total`; totalTraceRow.addTemplateTypes('Memory'); - totalTraceRow.supplier = () => new Promise>((resolve) => resolve(purgeableTotalData)); - totalTraceRow.focusHandler = (ev) => { + totalTraceRow.supplier = () => new Promise>((resolve): void => resolve(purgeableTotalData)); + totalTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( totalTraceRow, SnapshotStruct.hoverSnapshotStruct, @@ -863,10 +863,10 @@ export class SpAbilityMonitorChart { Value: ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}` ); }; - totalTraceRow.findHoverStruct = () => { + totalTraceRow.findHoverStruct = (): void => { SnapshotStruct.hoverSnapshotStruct = totalTraceRow.getHoverStruct(); }; - totalTraceRow.onThreadHandler = (useCache) => { + totalTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (totalTraceRow.currentContext) { context = totalTraceRow.currentContext; @@ -874,7 +874,7 @@ export class SpAbilityMonitorChart { context = totalTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } totalTraceRow.canvasSave(context); - (renders['snapshot'] as SnapshotRender).renderMainThread( + (renders.snapshot as SnapshotRender).renderMainThread( { context: context, useCache: useCache, @@ -902,8 +902,8 @@ export class SpAbilityMonitorChart { pinTraceRow.selectChangeHandler = this.trace.selectChangeHandler; pinTraceRow.setAttribute('children', ''); pinTraceRow.name = `Purgeable Pin`; - pinTraceRow.supplier = () => new Promise>((resolve) => resolve(purgeablePinData)); - pinTraceRow.focusHandler = (ev) => { + pinTraceRow.supplier = () => new Promise>((resolve): void => resolve(purgeablePinData)); + pinTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( pinTraceRow, SnapshotStruct.hoverSnapshotStruct, @@ -914,7 +914,7 @@ export class SpAbilityMonitorChart { pinTraceRow.findHoverStruct = () => { SnapshotStruct.hoverSnapshotStruct = pinTraceRow.getHoverStruct(); }; - pinTraceRow.onThreadHandler = (useCache) => { + pinTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (pinTraceRow.currentContext) { context = pinTraceRow.currentContext; @@ -922,7 +922,7 @@ export class SpAbilityMonitorChart { context = pinTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } pinTraceRow.canvasSave(context); - (renders['snapshot'] as SnapshotRender).renderMainThread( + (renders.snapshot as SnapshotRender).renderMainThread( { context: context, useCache: useCache, @@ -943,7 +943,7 @@ export class SpAbilityMonitorChart { * DMA * @param processRow */ - private initDmaAbility = async (processRow: TraceRow) => { + private initDmaAbility = async (processRow: TraceRow): Promise => { let dmaAbilityData = await queryDmaAbilityData(); for (let i = 0; i < dmaAbilityData.length; i++) { dmaAbilityData[i].name = 'snapshot' + i; @@ -961,9 +961,9 @@ export class SpAbilityMonitorChart { dmaTraceRow.setAttribute('children', ''); dmaTraceRow.name = 'DMA'; dmaTraceRow.addTemplateTypes('Memory'); - dmaTraceRow.supplier = () => new Promise>((resolve) => resolve(dmaAbilityData)); + dmaTraceRow.supplier = (): Promise => new Promise>((resolve): void => resolve(dmaAbilityData)); //文字悬浮提示 - dmaTraceRow.focusHandler = (ev) => { + dmaTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( dmaTraceRow, SnapshotStruct.hoverSnapshotStruct, @@ -971,10 +971,10 @@ export class SpAbilityMonitorChart { ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}` ); }; - dmaTraceRow.findHoverStruct = () => { + dmaTraceRow.findHoverStruct = (): void => { SnapshotStruct.hoverSnapshotStruct = dmaTraceRow.getHoverStruct(); }; - dmaTraceRow.onThreadHandler = (useCache) => { + dmaTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (dmaTraceRow.currentContext) { context = dmaTraceRow.currentContext; @@ -1001,7 +1001,7 @@ export class SpAbilityMonitorChart { * Skia Gpu Memory * @param processRow */ - private initGpuMemoryAbility = async (processRow: TraceRow) => { + private initGpuMemoryAbility = async (processRow: TraceRow): Promise => { let gpuMemoryAbilityData = await queryGpuMemoryAbilityData(); for (let i = 0; i < gpuMemoryAbilityData.length; i++) { gpuMemoryAbilityData[i].name = 'snapshot' + i; @@ -1019,9 +1019,10 @@ export class SpAbilityMonitorChart { gpuMemoryTraceRow.setAttribute('children', ''); gpuMemoryTraceRow.name = 'Skia Gpu Memory'; gpuMemoryTraceRow.addTemplateTypes('Memory'); - gpuMemoryTraceRow.supplier = () => new Promise>((resolve) => resolve(gpuMemoryAbilityData)); + gpuMemoryTraceRow.supplier = (): Promise => + new Promise>((resolve): void => resolve(gpuMemoryAbilityData)); //文字悬浮提示 - gpuMemoryTraceRow.focusHandler = (ev) => { + gpuMemoryTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( gpuMemoryTraceRow, SnapshotStruct.hoverSnapshotStruct, @@ -1029,7 +1030,7 @@ export class SpAbilityMonitorChart { ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}` ); }; - gpuMemoryTraceRow.findHoverStruct = () => { + gpuMemoryTraceRow.findHoverStruct = (): void => { SnapshotStruct.hoverSnapshotStruct = gpuMemoryTraceRow.getHoverStruct(); }; gpuMemoryTraceRow.onThreadHandler = (useCache) => { diff --git a/ide/src/trace/component/chart/SpArkTsChart.ts b/ide/src/trace/component/chart/SpArkTsChart.ts index d2f745343b5e86e3d529cd6b478ecd7da9f9bc0b..e3c1c500d6598c451414332aae9646bc0fe16637 100644 --- a/ide/src/trace/component/chart/SpArkTsChart.ts +++ b/ide/src/trace/component/chart/SpArkTsChart.ts @@ -16,16 +16,16 @@ import { SpSystemTrace } from '../SpSystemTrace.js'; import { TraceRow } from '../trace/base/TraceRow.js'; import { info } from '../../../log/Log.js'; import { renders } from '../../database/ui-worker/ProcedureWorker.js'; -import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js'; -import { HeapTimelineRender, HeapTimelineStruct } from '../../database/ui-worker/ProcedureWorkerHeapTimeline.js'; -import { HeapDataInterface, ParseListener } from '../../../js-heap/HeapDataInterface.js'; +import { type EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js'; +import { type HeapTimelineRender, HeapTimelineStruct } from '../../database/ui-worker/ProcedureWorkerHeapTimeline.js'; +import { HeapDataInterface, type ParseListener } from '../../../js-heap/HeapDataInterface.js'; import { LoadDatabase } from '../../../js-heap/LoadDatabase.js'; -import { FileInfo } from '../../../js-heap/model/UiStruct.js'; -import { HeapSnapshotRender, HeapSnapshotStruct } from '../../database/ui-worker/ProcedureWorkerHeapSnapshot.js'; +import { type FileInfo } from '../../../js-heap/model/UiStruct.js'; +import { type HeapSnapshotRender, HeapSnapshotStruct } from '../../database/ui-worker/ProcedureWorkerHeapSnapshot.js'; import { procedurePool } from '../../database/Procedure.js'; import { Utils } from '../trace/base/Utils.js'; -import { JsCpuProfilerChartFrame } from '../../bean/JsStruct.js'; -import { JsCpuProfilerRender, JsCpuProfilerStruct } from '../../database/ui-worker/ProcedureWorkerCpuProfiler.js'; +import { type JsCpuProfilerChartFrame } from '../../bean/JsStruct.js'; +import { type JsCpuProfilerRender, JsCpuProfilerStruct } from '../../database/ui-worker/ProcedureWorkerCpuProfiler.js'; import { ns2s } from '../../database/ui-worker/ProcedureWorkerCommon.js'; import { queryJsCpuProfilerConfig, queryJsCpuProfilerData, queryJsMemoryData } from '../../database/SqlLite.js'; const TYPE_SNAPSHOT = 0; @@ -71,7 +71,7 @@ export class SpArkTsChart implements ParseListener { if (this.folderRow!.expansion) { this.trace.canvasPanelCtx?.clearRect(0, 0, this.folderRow!.frame.width, this.folderRow!.frame.height); } else { - (renders['empty'] as EmptyRender).renderMainThread( + (renders.empty as EmptyRender).renderMainThread( { context: this.trace.canvasPanelCtx, useCache: useCache, @@ -173,9 +173,9 @@ export class SpArkTsChart implements ParseListener { this.heapTimelineRow!.supplier = (): Promise => new Promise((resolve) => resolve(samples)); this.heapTimelineRow!.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; - if(this.heapTimelineRow?.currentContext){ + if (this.heapTimelineRow?.currentContext) { context = this.heapTimelineRow!.currentContext; - }else{ + } else { context = this.heapTimelineRow!.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } this.heapTimelineRow!.canvasSave(context); @@ -195,9 +195,9 @@ export class SpArkTsChart implements ParseListener { new Promise>((resolve) => resolve(heapFile)); this.heapSnapshotRow!.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; - if(this.heapSnapshotRow?.currentContext){ + if (this.heapSnapshotRow?.currentContext) { context = this.heapSnapshotRow!.currentContext; - }else{ + } else { context = this.heapSnapshotRow!.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } this.heapSnapshotRow!.canvasSave(context); @@ -215,7 +215,7 @@ export class SpArkTsChart implements ParseListener { } } - private async initJsCpuProfilerChartData(): Promise { + private async initJsCpuProfilerChartData() { procedurePool.submitWithName( 'logic1', 'jsCpuProfiler-init', @@ -267,10 +267,10 @@ export class SpArkTsChart implements ParseListener { JsCpuProfilerStruct.hoverJsCpuProfilerStruct = this.jsCpuProfilerRow!.getHoverStruct(); }; this.jsCpuProfilerRow.onThreadHandler = (useCache): void => { - let context:CanvasRenderingContext2D; - if(this.jsCpuProfilerRow?.currentContext){ + let context: CanvasRenderingContext2D; + if (this.jsCpuProfilerRow?.currentContext) { context = this.jsCpuProfilerRow!.currentContext; - }else{ + } else { context = this.jsCpuProfilerRow!.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } this.jsCpuProfilerRow!.canvasSave(context); diff --git a/ide/src/trace/component/chart/SpChartManager.ts b/ide/src/trace/component/chart/SpChartManager.ts index cf5b22a5464ddca4375ad0a48992a9c601e1e44b..122a11805304663f8aa4443dc5d8483a15b9650d 100644 --- a/ide/src/trace/component/chart/SpChartManager.ts +++ b/ide/src/trace/component/chart/SpChartManager.ts @@ -99,7 +99,7 @@ export class SpChartManager { let dict = await queryDataDICT(); if (FlagsConfig.getFlagsConfigEnableStatus('AppStartup')) { let appStartUpPids = await queryAppStartupProcessIds(); - appStartUpPids.forEach(it => SpChartManager.APP_STARTUP_PID_ARR.push(it.pid)); + appStartUpPids.forEach((it) => SpChartManager.APP_STARTUP_PID_ARR.push(it.pid)); } await this.initTraceConfig(); dict.map((d) => SpSystemTrace.DATA_DICT.set(d['id'], d['data'])); diff --git a/ide/src/trace/component/chart/SpClockChart.ts b/ide/src/trace/component/chart/SpClockChart.ts index 036bf421cfdeab785cbb3e1dfbbbc9c939e65545..2da72725a03bb5580195e5c636f4486f722dae8f 100644 --- a/ide/src/trace/component/chart/SpClockChart.ts +++ b/ide/src/trace/component/chart/SpClockChart.ts @@ -104,11 +104,11 @@ export class SpClockChart { ClockStruct.hoverClockStruct = traceRow.getHoverStruct(); }; traceRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(traceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (traceRow.currentContext) { context = traceRow.currentContext; - } else{ - context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } traceRow.canvasSave(context); (renders['clock'] as ClockRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpCpuChart.ts b/ide/src/trace/component/chart/SpCpuChart.ts index 6f9392af781e5e3cd8ea0359c8adf23865587ca8..995c3849df6953ac2e7b892095a4863b8335a73c 100644 --- a/ide/src/trace/component/chart/SpCpuChart.ts +++ b/ide/src/trace/component/chart/SpCpuChart.ts @@ -105,11 +105,11 @@ export class SpCpuChart { CpuStruct.hoverCpuStruct = traceRow.getHoverStruct(); }; traceRow.onThreadHandler = (useCache: boolean, buf: ArrayBuffer | undefined | null) => { - let context:CanvasRenderingContext2D; - if(traceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (traceRow.currentContext) { context = traceRow.currentContext; - } else{ - context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } traceRow.canvasSave(context); (renders['cpu-data'] as CpuRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpFileSystemChart.ts b/ide/src/trace/component/chart/SpFileSystemChart.ts index 5888ad3897faf60cddde12ef1a8b998ae6674ea7..458cf57c5e7ff55e10e80b630d75b9ddbb117f9f 100644 --- a/ide/src/trace/component/chart/SpFileSystemChart.ts +++ b/ide/src/trace/component/chart/SpFileSystemChart.ts @@ -116,14 +116,14 @@ export class SpFileSystemChart { logicalReadRow.selectChangeHandler = this.trace.selectChangeHandler; logicalReadRow.focusHandler = () => this.focusHandler(logicalReadRow); logicalReadRow.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = logicalReadRow.getHoverStruct() + FileSysChartStruct.hoverFileSysStruct = logicalReadRow.getHoverStruct(false); }; logicalReadRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(logicalReadRow.currentContext){ + let context: CanvasRenderingContext2D; + if (logicalReadRow.currentContext) { context = logicalReadRow.currentContext; - } else{ - context = logicalReadRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = logicalReadRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } logicalReadRow.canvasSave(context); (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( @@ -155,14 +155,14 @@ export class SpFileSystemChart { logicalWriteRow.selectChangeHandler = this.trace.selectChangeHandler; logicalWriteRow.focusHandler = () => this.focusHandler(logicalWriteRow); logicalWriteRow.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = logicalWriteRow.getHoverStruct() + FileSysChartStruct.hoverFileSysStruct = logicalWriteRow.getHoverStruct(false); }; logicalWriteRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(logicalWriteRow.currentContext){ + let context: CanvasRenderingContext2D; + if (logicalWriteRow.currentContext) { context = logicalWriteRow.currentContext; - } else{ - context = logicalWriteRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = logicalWriteRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } logicalWriteRow.canvasSave(context); (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( @@ -195,14 +195,14 @@ export class SpFileSystemChart { diskIoRow.selectChangeHandler = this.trace.selectChangeHandler; diskIoRow.focusHandler = () => this.focusHandler(diskIoRow); diskIoRow.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = diskIoRow.getHoverStruct() + FileSysChartStruct.hoverFileSysStruct = diskIoRow.getHoverStruct(false); }; diskIoRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(diskIoRow.currentContext){ + let context: CanvasRenderingContext2D; + if (diskIoRow.currentContext) { context = diskIoRow.currentContext; - } else{ - context = diskIoRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = diskIoRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } diskIoRow.canvasSave(context); (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( @@ -238,14 +238,14 @@ export class SpFileSystemChart { rowRead.selectChangeHandler = this.trace.selectChangeHandler; rowRead.focusHandler = () => this.focusHandler(rowRead); rowRead.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = rowRead.getHoverStruct() + FileSysChartStruct.hoverFileSysStruct = rowRead.getHoverStruct(false); }; rowRead.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(rowRead.currentContext){ + let context: CanvasRenderingContext2D; + if (rowRead.currentContext) { context = rowRead.currentContext; - } else{ - context = rowRead.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = rowRead.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } rowRead.canvasSave(context); (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( @@ -275,14 +275,14 @@ export class SpFileSystemChart { rowWrite.selectChangeHandler = this.trace.selectChangeHandler; rowWrite.focusHandler = () => this.focusHandler(rowWrite); rowWrite.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = rowWrite.getHoverStruct() + FileSysChartStruct.hoverFileSysStruct = rowWrite.getHoverStruct(false); }; rowWrite.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(rowWrite.currentContext){ + let context: CanvasRenderingContext2D; + if (rowWrite.currentContext) { context = rowWrite.currentContext; - } else{ - context = rowWrite.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = rowWrite.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } rowWrite.canvasSave(context); (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( @@ -317,14 +317,14 @@ export class SpFileSystemChart { vmTraceRow.selectChangeHandler = this.trace.selectChangeHandler; vmTraceRow.focusHandler = () => this.focusHandler(vmTraceRow); vmTraceRow.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = vmTraceRow.getHoverStruct() + FileSysChartStruct.hoverFileSysStruct = vmTraceRow.getHoverStruct(false); }; vmTraceRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(vmTraceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (vmTraceRow.currentContext) { context = vmTraceRow.currentContext; - } else{ - context = vmTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = vmTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } vmTraceRow.canvasSave(context); (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpFpsChart.ts b/ide/src/trace/component/chart/SpFpsChart.ts index cf77b8f8d98b69c786b1ef15c1d204950f01b345..3a403662981d505826d1eec3f2a9f0be601327a6 100644 --- a/ide/src/trace/component/chart/SpFpsChart.ts +++ b/ide/src/trace/component/chart/SpFpsChart.ts @@ -51,14 +51,14 @@ export class SpFpsChart { this.trace?.displayTip(fpsRow, FpsStruct.hoverFpsStruct, tip); }; fpsRow.findHoverStruct = () => { - FpsStruct.hoverFpsStruct = fpsRow.getHoverStruct() + FpsStruct.hoverFpsStruct = fpsRow.getHoverStruct(); }; fpsRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(fpsRow.currentContext){ + let context: CanvasRenderingContext2D; + if (fpsRow.currentContext) { context = fpsRow.currentContext; - } else{ - context = fpsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = fpsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } fpsRow.canvasSave(context); (renders['fps'] as FpsRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpFrameTimeChart.ts b/ide/src/trace/component/chart/SpFrameTimeChart.ts index a71c4cc6915477fb98e9b155487e00cd824febf4..6984178deb0154f91cd4437f8e6a48c22b075c09 100644 --- a/ide/src/trace/component/chart/SpFrameTimeChart.ts +++ b/ide/src/trace/component/chart/SpFrameTimeChart.ts @@ -25,27 +25,18 @@ import { queryFrameDynamicData, queryFrameSpacing, queryFrameTimeData, - queryPhysicalData + queryPhysicalData, } from '../../database/SqlLite.js'; import { JanksStruct } from '../../bean/JanksStruct.js'; -import { ns2xByTimeShaft, PairPoint } from '../../database/ui-worker/ProcedureWorkerCommon.js'; -import { LitPopover } from '../../../base-ui/popover/LitPopoverV.js'; -import { - FrameDynamicRender, - FrameDynamicStruct -} from '../../database/ui-worker/ProcedureWorkerFrameDynamic.js'; -import { - FrameAnimationRender, - FrameAnimationStruct -} from '../../database/ui-worker/ProcedureWorkerFrameAnimation.js'; -import { BaseStruct } from '../../bean/BaseStruct.js'; -import { - FrameSpacingRender, - FrameSpacingStruct -} from '../../database/ui-worker/ProcedureWorkerFrameSpacing.js'; -import { FlagsConfig, Params } from '../SpFlags.js'; -import { AnimationRanges, DeviceStruct } from '../../bean/FrameComponentBean.js'; -import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js'; +import { ns2xByTimeShaft, type PairPoint } from '../../database/ui-worker/ProcedureWorkerCommon.js'; +import { type LitPopover } from '../../../base-ui/popover/LitPopoverV.js'; +import { FrameDynamicRender, FrameDynamicStruct } from '../../database/ui-worker/ProcedureWorkerFrameDynamic.js'; +import { FrameAnimationRender, FrameAnimationStruct } from '../../database/ui-worker/ProcedureWorkerFrameAnimation.js'; +import { type BaseStruct } from '../../bean/BaseStruct.js'; +import { FrameSpacingRender, FrameSpacingStruct } from '../../database/ui-worker/ProcedureWorkerFrameSpacing.js'; +import { FlagsConfig, type Params } from '../SpFlags.js'; +import { type AnimationRanges, type DeviceStruct } from '../../bean/FrameComponentBean.js'; +import { type EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js'; export class SpFrameTimeChart { private trace: SpSystemTrace; @@ -74,32 +65,36 @@ export class SpFrameTimeChart { frameTimeLineRow.folder = true; frameTimeLineRow.name = 'FrameTimeline'; frameTimeLineRow.setAttribute('children', ''); - frameTimeLineRow.supplier = (): Promise => new Promise((resolve) => { - resolve([]); - }); + frameTimeLineRow.supplier = (): Promise => + new Promise((resolve) => { + resolve([]); + }); frameTimeLineRow.addTemplateTypes('AppStartup'); frameTimeLineRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; frameTimeLineRow.selectChangeHandler = this.trace.selectChangeHandler; frameTimeLineRow.onThreadHandler = (useCache: boolean): void => { - let context:CanvasRenderingContext2D; - if(frameTimeLineRow.currentContext){ + let context: CanvasRenderingContext2D; + if (frameTimeLineRow.currentContext) { context = frameTimeLineRow.currentContext; - } else{ - context = frameTimeLineRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = frameTimeLineRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } frameTimeLineRow!.canvasSave(context); - (renders.jank as JankRender).renderMainThread({ - context: context, useCache: useCache, type: 'expected_frame_timeline_slice' - }, frameTimeLineRow!); + (renders.jank as JankRender).renderMainThread( + { + context: context, + useCache: useCache, + type: 'expected_frame_timeline_slice', + }, + frameTimeLineRow! + ); frameTimeLineRow!.canvasRestore(context); }; this.trace.rowsEL?.appendChild(frameTimeLineRow); return frameTimeLineRow; } - async initExpectedChart( - frameTimeLineRow: TraceRow - ): Promise { + async initExpectedChart(frameTimeLineRow: TraceRow): Promise { let frameExpectedData = await this.getExpectedFrameDate(); let unitIndex: number = 1; let unitHeight: number = 20; @@ -117,30 +112,34 @@ export class SpFrameTimeChart { expectedTimeLineRow.addTemplateTypes('FrameTimeline'); expectedTimeLineRow.setAttribute('height', `${maxHeight}`); expectedTimeLineRow.setAttribute('children', ''); - expectedTimeLineRow.supplier = (): Promise => new Promise((resolve): void => { - resolve(frameExpectedData); - }); + expectedTimeLineRow.supplier = (): Promise => + new Promise((resolve): void => { + resolve(frameExpectedData); + }); expectedTimeLineRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; expectedTimeLineRow.selectChangeHandler = this.trace.selectChangeHandler; expectedTimeLineRow.onThreadHandler = (useCache: boolean): void => { - let context:CanvasRenderingContext2D; - if(expectedTimeLineRow.currentContext){ + let context: CanvasRenderingContext2D; + if (expectedTimeLineRow.currentContext) { context = expectedTimeLineRow.currentContext; - } else{ - context = expectedTimeLineRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = expectedTimeLineRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } expectedTimeLineRow!.canvasSave(context); - (renders.jank as JankRender).renderMainThread({ - context: context, useCache: useCache, type: 'expected_frame_timeline_slice' - }, expectedTimeLineRow!); + (renders.jank as JankRender).renderMainThread( + { + context: context, + useCache: useCache, + type: 'expected_frame_timeline_slice', + }, + expectedTimeLineRow! + ); expectedTimeLineRow!.canvasRestore(context); }; frameTimeLineRow.addChildTraceRow(expectedTimeLineRow); } - async initActualChart( - frameTimeLineRow: TraceRow - ): Promise { + async initActualChart(frameTimeLineRow: TraceRow): Promise { let frameActualData = await this.getActualFrameDate(); let unitIndex: number = 1; let unitHeight: number = 20; @@ -157,22 +156,28 @@ export class SpFrameTimeChart { actualTimeLineRow.setAttribute('height', `${maxHeight}`); actualTimeLineRow.setAttribute('children', ''); actualTimeLineRow.dataList = frameActualData; - actualTimeLineRow.supplier = (): Promise => new Promise((resolve): void => { - resolve(frameActualData); - }); + actualTimeLineRow.supplier = (): Promise => + new Promise((resolve): void => { + resolve(frameActualData); + }); actualTimeLineRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; actualTimeLineRow.selectChangeHandler = this.trace.selectChangeHandler; actualTimeLineRow.onThreadHandler = (useCache: boolean): void => { - let context:CanvasRenderingContext2D; - if(actualTimeLineRow.currentContext){ + let context: CanvasRenderingContext2D; + if (actualTimeLineRow.currentContext) { context = actualTimeLineRow.currentContext; - } else{ - context = actualTimeLineRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = actualTimeLineRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } actualTimeLineRow!.canvasSave(context); - (renders.jank as JankRender).renderMainThread({ - context: context, useCache: useCache, type: 'expected_frame_timeline_slice' - }, actualTimeLineRow!); + (renders.jank as JankRender).renderMainThread( + { + context: context, + useCache: useCache, + type: 'expected_frame_timeline_slice', + }, + actualTimeLineRow! + ); actualTimeLineRow!.canvasRestore(context); }; frameTimeLineRow.addChildTraceRow(actualTimeLineRow); @@ -192,14 +197,15 @@ export class SpFrameTimeChart { async initAnimatedScenesChart( processRow: TraceRow, - process: { pid: number | null; processName: string | null; }, + process: { pid: number | null; processName: string | null }, firstRow: TraceRow ): Promise { this.flagConfig = FlagsConfig.getFlagsConfig('AnimationAnalysis'); if (this.flagConfig?.AnimationAnalysis === 'Enabled') { if (process.processName?.startsWith('render_service')) { - let targetRowList = processRow.childrenList.filter(childRow => - childRow.rowType === 'thread' && childRow.name.startsWith('render_service')); + let targetRowList = processRow.childrenList.filter( + (childRow) => childRow.rowType === 'thread' && childRow.name.startsWith('render_service') + ); let nameArr: { name: string }[] = await queryFrameApp(); if (nameArr && nameArr.length > 0) { let currentName = nameArr[0].name; @@ -218,6 +224,8 @@ export class SpFrameTimeChart { nameArr: { name: string }[] ): Promise> { let frameChart: TraceRow = TraceRow.skeleton(); + let labelName = frameChart.shadowRoot?.querySelector('.name') as HTMLLabelElement; + labelName.style.marginRight = '77px'; let systemPopover = this.addSystemConfigButton(frameChart, nameArr); systemPopover.style.zIndex = '101'; let radioList = systemPopover.querySelectorAll('.radio'); @@ -228,7 +236,7 @@ export class SpFrameTimeChart { if (radioList[index]) { radioList[index].checked = true; frameChart.name = radioList[index].value; - frameChart.childrenList.forEach(childrenRow => { + frameChart.childrenList.forEach((childrenRow) => { childrenRow.setAttribute('model-name', `${radioList[index].value}`); }); systemPopover.blur(); @@ -247,18 +255,25 @@ export class SpFrameTimeChart { frameChart.folder = true; frameChart.name = nameArr[0].name; frameChart.setAttribute('children', ''); - frameChart.supplier = (): Promise => new Promise((resolve) => { - resolve([]); - }); + frameChart.supplier = (): Promise => + new Promise((resolve) => { + resolve([]); + }); frameChart.favoriteChangeHandler = this.trace.favoriteChangeHandler; frameChart.selectChangeHandler = this.trace.selectChangeHandler; frameChart.onThreadHandler = (useCache: boolean): void => { - let context: CanvasRenderingContext2D = frameChart!.collect ? this.trace.canvasFavoritePanelCtx! : - this.trace.canvasPanelCtx!; + let context: CanvasRenderingContext2D = frameChart!.collect + ? this.trace.canvasFavoritePanelCtx! + : this.trace.canvasPanelCtx!; frameChart!.canvasSave(context); - (renders.empty as EmptyRender).renderMainThread({ - context: context, useCache: useCache, type: 'frame' - }, frameChart!); + (renders.empty as EmptyRender).renderMainThread( + { + context: context, + useCache: useCache, + type: 'frame', + }, + frameChart! + ); frameChart!.canvasRestore(context); }; this.trace.rowsEL?.appendChild(frameChart); @@ -272,17 +287,18 @@ export class SpFrameTimeChart { let frameAnimationData: FrameAnimationStruct[] = await queryFrameAnimationData(); let animationRanges: AnimationRanges[] = []; if (frameAnimationData.length > 0) { - frameAnimationData.forEach(data => { + frameAnimationData.forEach((data) => { if (data.status === 'Completion delay') { animationRanges.push({ - start: data.startTs, end: data.endTs + start: data.startTs, + end: data.endTs, }); } data.dur = data.endTs - data.startTs; }); let unitIndex: number = 1; - let isIntersect = (a: FrameAnimationStruct, b: FrameAnimationStruct): boolean => Math.max(a.startTs! + a.dur!, b.startTs! + b.dur!) - - Math.min(a.startTs!, b.startTs!) < a.dur! + b.dur!; + let isIntersect = (a: FrameAnimationStruct, b: FrameAnimationStruct): boolean => + Math.max(a.startTs! + a.dur!, b.startTs! + b.dur!) - Math.min(a.startTs!, b.startTs!) < a.dur! + b.dur!; let depths = []; for (let i: number = 0; i < frameAnimationData.length; i++) { if (!frameAnimationData[i].dur || frameAnimationData[i].dur < 0) { @@ -326,18 +342,25 @@ export class SpFrameTimeChart { frameAnimationRow.setAttribute('height', `${maxHeight}`); frameAnimationRow.addTemplateTypes('Animation Effect'); frameAnimationRow.setAttribute('children', ''); - frameAnimationRow.supplier = (): Promise => new Promise((resolve) => { - resolve(frameAnimationData); - }); + frameAnimationRow.supplier = (): Promise => + new Promise((resolve) => { + resolve(frameAnimationData); + }); frameAnimationRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; frameAnimationRow.selectChangeHandler = this.trace.selectChangeHandler; frameAnimationRow.onThreadHandler = (useCache): void => { - let context: CanvasRenderingContext2D = frameAnimationRow!.collect ? this.trace.canvasFavoritePanelCtx! : - this.trace.canvasPanelCtx!; + let context: CanvasRenderingContext2D = frameAnimationRow!.collect + ? this.trace.canvasFavoritePanelCtx! + : this.trace.canvasPanelCtx!; frameAnimationRow!.canvasSave(context); - (renders.frameAnimation as FrameAnimationRender).renderMainThread({ - context: context, useCache: useCache, type: 'frameAnimation' - }, frameAnimationRow!); + (renders.frameAnimation as FrameAnimationRender).renderMainThread( + { + context: context, + useCache: useCache, + type: 'frameAnimation', + }, + frameAnimationRow! + ); frameAnimationRow!.canvasRestore(context); }; processRow.addChildTraceRowBefore(frameAnimationRow, firstRow); @@ -351,8 +374,8 @@ export class SpFrameTimeChart { ): Promise { let frameDynamicCurveData: FrameDynamicStruct[] = await queryFrameDynamicData(); let systemConfigList: { - name: string - }[] = [{name: 'x'}, {name: 'y'}, {name: 'width'}, {name: 'height'}, {name: 'alpha'}]; + name: string; + }[] = [{ name: 'x' }, { name: 'y' }, { name: 'width' }, { name: 'height' }, { name: 'alpha' }]; let dynamicCurveRow: TraceRow = TraceRow.skeleton(); let systemPopover = this.addSystemConfigButton(dynamicCurveRow, systemConfigList); this.initSystemConfig(systemPopover, dynamicCurveRow); @@ -371,32 +394,34 @@ export class SpFrameTimeChart { dynamicCurveRow.setAttribute('children', ''); dynamicCurveRow.setAttribute('model-type', systemConfigList[0].name); dynamicCurveRow.setAttribute('model-name', name); - dynamicCurveRow.supplier = (): Promise => new Promise((resolve): void => { - resolve(frameDynamicCurveData); - }); + dynamicCurveRow.supplier = (): Promise => + new Promise((resolve): void => { + resolve(frameDynamicCurveData); + }); dynamicCurveRow.favoriteChangeHandler = (): void => { this.favoriteSelect(systemPopover, dynamicCurveRow); }; dynamicCurveRow.selectChangeHandler = this.trace.selectChangeHandler; dynamicCurveRow.onThreadHandler = (useCache: boolean): void => { - let context: CanvasRenderingContext2D = dynamicCurveRow!.collect ? this.trace.canvasFavoritePanelCtx! : - this.trace.canvasPanelCtx!; + let context: CanvasRenderingContext2D = dynamicCurveRow!.collect + ? this.trace.canvasFavoritePanelCtx! + : this.trace.canvasPanelCtx!; dynamicCurveRow!.canvasSave(context); - (renders.frameDynamicCurve as FrameDynamicRender).renderMainThread({ - context: context, - useCache: useCache, - type: 'dynamicEffectCurve', - animationRanges: animationRanges - }, dynamicCurveRow!); + (renders.frameDynamicCurve as FrameDynamicRender).renderMainThread( + { + context: context, + useCache: useCache, + type: 'dynamicEffectCurve', + animationRanges: animationRanges, + }, + dynamicCurveRow! + ); dynamicCurveRow!.canvasRestore(context); }; frameChart.addChildTraceRow(dynamicCurveRow); } - private initSystemConfig( - systemPopover: LitPopover, - dynamicCurveRow: TraceRow - ): void { + private initSystemConfig(systemPopover: LitPopover, dynamicCurveRow: TraceRow): void { let radioList = systemPopover.querySelectorAll('.radio'); let divElement = systemPopover.querySelectorAll('.option'); radioList[0].checked = true; @@ -415,10 +440,7 @@ export class SpFrameTimeChart { }); } - private favoriteSelect( - systemPopover: LitPopover, - dynamicCurveRow: TraceRow - ): void { + private favoriteSelect(systemPopover: LitPopover, dynamicCurveRow: TraceRow): void { let popover = systemPopover.querySelector('.dynamicPopover') as HTMLDivElement; if (dynamicCurveRow.collect) { systemPopover.setAttribute('placement', 'right'); @@ -441,7 +463,7 @@ export class SpFrameTimeChart { let frameResultData: FrameSpacingStruct[] = []; for (let index = 0; index < nameArr.length; index++) { let appName: string = nameArr[index].name; - let filterData = frameData.filter(spacingData => spacingData.nameId === appName); + let filterData = frameData.filter((spacingData) => spacingData.nameId === appName); this.dataProcessing(filterData, deviceStruct); frameResultData.push(...filterData); } @@ -457,30 +479,31 @@ export class SpFrameTimeChart { frameSpacingRow.setAttribute('height', '140'); frameSpacingRow.setAttribute('children', ''); frameSpacingRow.setAttribute('model-name', name); - frameSpacingRow.supplier = (): Promise => new Promise((resolve): void => { - resolve(frameResultData); - }); + frameSpacingRow.supplier = (): Promise => + new Promise((resolve): void => { + resolve(frameResultData); + }); frameSpacingRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; frameSpacingRow.selectChangeHandler = this.trace.selectChangeHandler; frameSpacingRow.onThreadHandler = (useCache: boolean): void => { let context = frameSpacingRow!.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; frameSpacingRow!.canvasSave(context); - (renders.frameSpacing as FrameSpacingRender).renderMainThread({ - context: context, - useCache: useCache, - type: 'frame_spacing_slice', - frameRate: deviceStruct.physicalFrameRate, - animationRanges: animationRanges - }, frameSpacingRow!); + (renders.frameSpacing as FrameSpacingRender).renderMainThread( + { + context: context, + useCache: useCache, + type: 'frame_spacing_slice', + frameRate: deviceStruct.physicalFrameRate, + animationRanges: animationRanges, + }, + frameSpacingRow! + ); frameSpacingRow!.canvasRestore(context); }; frameChart.addChildTraceRow(frameSpacingRow); } - dataProcessing( - frameData: FrameSpacingStruct[], - deviceStruct: DeviceStruct - ): void { + dataProcessing(frameData: FrameSpacingStruct[], deviceStruct: DeviceStruct): void { let unitIndex: number = 1; let secondToNanosecond: number = 1000_000_000; let physicalWidth = Number(this.flagConfig!.physicalWidth); @@ -516,10 +539,7 @@ export class SpFrameTimeChart { } } - addSystemConfigButton( - systemTraceRow: TraceRow, - systemConfigList: { name: string }[] - ): LitPopover { + addSystemConfigButton(systemTraceRow: TraceRow, systemConfigList: { name: string }[]): LitPopover { let rowContent: HTMLDivElement = systemTraceRow.shadowRoot?.querySelector('.describe') as HTMLDivElement; let systemPopover: LitPopover = document.createElement('lit-popover') as LitPopover; systemPopover.style.zIndex = '100'; @@ -531,10 +551,14 @@ export class SpFrameTimeChart { systemPopover.setAttribute('haveRadio', 'true'); systemPopover.innerHTML = `
    - ${systemConfigList.map((it): string => ` + ${systemConfigList + .map( + (it): string => `
    ${it.name}
    `).join('')} + style="margin-right: 10px;"/>${it.name}
    ` + ) + .join('')}
    `; rowContent.appendChild(systemPopover); @@ -543,10 +567,10 @@ export class SpFrameTimeChart { private frameNoExpandTimeOut( event: CustomEventInit<{ - expansion: boolean, - rowType: string, - rowId: string, - rowParentId: string + expansion: boolean; + rowType: string; + rowId: string; + rowParentId: string; }>, frameTimeLineRow: TraceRow ): number { @@ -592,7 +616,7 @@ export class SpFrameTimeChart { } private frameExpandTimeOut( - event: CustomEventInit<{ expansion: boolean, rowType: string, rowId: string, rowParentId: string }>, + event: CustomEventInit<{ expansion: boolean; rowType: string; rowId: string; rowParentId: string }>, actualTimeLineRow: TraceRow ): number { let topPadding: number = 195; @@ -643,8 +667,8 @@ export class SpFrameTimeChart { let frameExpectedData = await queryExpectedFrameDate(); if (frameExpectedData.length > 0) { let unitIndex: number = 1; - let isIntersect = (a: JanksStruct, b: JanksStruct): boolean => Math.max(a.ts! + a.dur!, b.ts! + b.dur!) - - Math.min(a.ts!, b.ts!) < a.dur! + b.dur!; + let isIntersect = (a: JanksStruct, b: JanksStruct): boolean => + Math.max(a.ts! + a.dur!, b.ts! + b.dur!) - Math.min(a.ts!, b.ts!) < a.dur! + b.dur!; let depths = []; for (let i: number = 0; i < frameExpectedData.length; i++) { let it = frameExpectedData[i]; @@ -683,7 +707,8 @@ export class SpFrameTimeChart { let unitIndex: number = 1; let isIntersect = (leftStruct: JanksStruct, rightStruct: JanksStruct): boolean => Math.max(leftStruct.ts! + leftStruct.dur!, rightStruct.ts! + rightStruct.dur!) - - Math.min(leftStruct.ts!, rightStruct.ts!) < leftStruct.dur! + rightStruct.dur!; + Math.min(leftStruct.ts!, rightStruct.ts!) < + leftStruct.dur! + rightStruct.dur!; let depthArray = []; for (let index: number = 0; index < frameActualData.length; index++) { let it = frameActualData[index]; diff --git a/ide/src/trace/component/chart/SpFreqChart.ts b/ide/src/trace/component/chart/SpFreqChart.ts index 41298338d82e57708d958978e21fdeb9f637b3d4..7836fb63bbbd07d174051848c963768afc89c95e 100644 --- a/ide/src/trace/component/chart/SpFreqChart.ts +++ b/ide/src/trace/component/chart/SpFreqChart.ts @@ -80,11 +80,11 @@ export class SpFreqChart { CpuFreqStruct.hoverCpuFreqStruct = traceRow.getHoverStruct(); }; traceRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(traceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (traceRow.currentContext) { context = traceRow.currentContext; - } else{ - context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } traceRow.canvasSave(context); (renders['freq'] as FreqRender).renderMainThread( @@ -129,11 +129,11 @@ export class SpFreqChart { CpuStateStruct.hoverStateStruct = cpuStateRow.getHoverStruct(); }; cpuStateRow.onThreadHandler = (useCache: boolean) => { - let context:CanvasRenderingContext2D; - if(cpuStateRow.currentContext){ + let context: CanvasRenderingContext2D; + if (cpuStateRow.currentContext) { context = cpuStateRow.currentContext; - } else{ - context = cpuStateRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = cpuStateRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } cpuStateRow.canvasSave(context); (renders['cpu-state'] as CpuStateRender).renderMainThread( @@ -182,11 +182,11 @@ export class SpFreqChart { CpuFreqLimitsStruct.hoverCpuFreqLimitsStruct = cpuFreqLimitRow.getHoverStruct(); }; cpuFreqLimitRow.onThreadHandler = (useCache: boolean) => { - let context:CanvasRenderingContext2D; - if(cpuFreqLimitRow.currentContext){ + let context: CanvasRenderingContext2D; + if (cpuFreqLimitRow.currentContext) { context = cpuFreqLimitRow.currentContext; - } else{ - context = cpuFreqLimitRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = cpuFreqLimitRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } cpuFreqLimitRow.canvasSave(context); (renders['cpu-limit-freq'] as CpuFreqLimitRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpHiPerf.ts b/ide/src/trace/component/chart/SpHiPerf.ts index d5d4483cce14cfd1d41c5243a046802dc88f1c60..6058aee8c386d07a023cffceea5d896983c17b63 100644 --- a/ide/src/trace/component/chart/SpHiPerf.ts +++ b/ide/src/trace/component/chart/SpHiPerf.ts @@ -35,7 +35,7 @@ import { HiPerfEventStruct } from '../../database/ui-worker/ProcedureWorkerHiPer import { perfDataQuery } from './PerfDataQuery.js'; import { renders } from '../../database/ui-worker/ProcedureWorker.js'; import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js'; -import { HiPerfReportStruct } from '../../database/ui-worker/ProcedureWorkerHiPerfReport.js'; +import { type HiPerfReportStruct } from '../../database/ui-worker/ProcedureWorkerHiPerfReport.js'; import { SpChartManager } from './SpChartManager.js'; export interface ResultData { @@ -163,14 +163,14 @@ export class SpHiPerf { cpuMergeRow.supplier = () => queryHiPerfCpuMergeData(); cpuMergeRow.focusHandler = () => this.hoverTip(cpuMergeRow, HiPerfCpuStruct.hoverStruct); cpuMergeRow.findHoverStruct = () => { - HiPerfCpuStruct.hoverStruct = cpuMergeRow.getHoverStruct(); + HiPerfCpuStruct.hoverStruct = cpuMergeRow.getHoverStruct(false, (TraceRow.range?.scale || 50) <= 30_000_000); }; cpuMergeRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(cpuMergeRow.currentContext){ + let context: CanvasRenderingContext2D; + if (cpuMergeRow.currentContext) { context = cpuMergeRow.currentContext; - } else{ - context = cpuMergeRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = cpuMergeRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } cpuMergeRow.canvasSave(context); (renders['HiPerf-Cpu'] as HiperfCpuRender).renderMainThread( @@ -208,14 +208,14 @@ export class SpHiPerf { perfCpuRow.supplier = () => queryHiPerfCpuData(i); perfCpuRow.focusHandler = () => this.hoverTip(perfCpuRow, HiPerfCpuStruct.hoverStruct); perfCpuRow.findHoverStruct = () => { - HiPerfCpuStruct.hoverStruct = perfCpuRow.getHoverStruct(); + HiPerfCpuStruct.hoverStruct = perfCpuRow.getHoverStruct(false, (TraceRow.range?.scale || 50) <= 30_000_000); }; perfCpuRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(perfCpuRow.currentContext){ + let context: CanvasRenderingContext2D; + if (perfCpuRow.currentContext) { context = perfCpuRow.currentContext; - } else{ - context = perfCpuRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = perfCpuRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } perfCpuRow.canvasSave(context); (renders['HiPerf-Cpu'] as HiperfCpuRender).renderMainThread( @@ -248,7 +248,7 @@ export class SpHiPerf { row.rowParentId = 'HiPerf'; row.rowHidden = !this.rowFolder.expansion; row.folder = true; - if (SpChartManager.APP_STARTUP_PID_ARR.find(pid => pid === process.pid) !== undefined) { + if (SpChartManager.APP_STARTUP_PID_ARR.find((pid) => pid === process.pid) !== undefined) { row.addTemplateTypes('AppStartup'); } row.addTemplateTypes('HiPerf'); @@ -260,14 +260,14 @@ export class SpHiPerf { row.supplier = () => queryHiPerfProcessData(process.pid); row.focusHandler = () => this.hoverTip(row, HiPerfProcessStruct.hoverStruct); row.findHoverStruct = () => { - HiPerfProcessStruct.hoverStruct = row.getHoverStruct(); + HiPerfProcessStruct.hoverStruct = row.getHoverStruct(false, (TraceRow.range?.scale || 50) <= 30_000_000); }; row.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(row.currentContext){ + let context: CanvasRenderingContext2D; + if (row.currentContext) { context = row.currentContext; - } else{ - context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } row.canvasSave(context); if (row.expansion) { @@ -306,14 +306,14 @@ export class SpHiPerf { thread.supplier = () => queryHiPerfThreadData(thObj.tid); thread.focusHandler = () => this.hoverTip(thread, HiPerfThreadStruct.hoverStruct); thread.findHoverStruct = () => { - HiPerfThreadStruct.hoverStruct = thread.getHoverStruct(); + HiPerfThreadStruct.hoverStruct = thread.getHoverStruct(false, (TraceRow.range?.scale || 50) <= 30_000_000); }; thread.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(thread.currentContext){ + let context: CanvasRenderingContext2D; + if (thread.currentContext) { context = thread.currentContext; - } else{ - context = thread.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = thread.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } thread.canvasSave(context); (renders['HiPerf-Thread'] as HiperfThreadRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpHiSysEventChart.ts b/ide/src/trace/component/chart/SpHiSysEventChart.ts index d5614239ea39b72182e005c5c1510013fade5d59..f3dc1727c6702244da46d56fe8b659626f275124 100644 --- a/ide/src/trace/component/chart/SpHiSysEventChart.ts +++ b/ide/src/trace/component/chart/SpHiSysEventChart.ts @@ -191,11 +191,11 @@ export class SpHiSysEventChart { EnergyAnomalyStruct.hoverEnergyAnomalyStruct = anomalyTraceRow.getHoverStruct(); }; anomalyTraceRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(anomalyTraceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (anomalyTraceRow.currentContext) { context = anomalyTraceRow.currentContext; - } else{ - context = anomalyTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = anomalyTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } anomalyTraceRow.canvasSave(context); (renders['energyAnomaly'] as EnergyAnomalyRender).renderMainThread( @@ -255,11 +255,11 @@ export class SpHiSysEventChart { EnergySystemStruct.hoverEnergySystemStruct = systemTraceRow.getHoverStruct(); }; systemTraceRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(systemTraceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (systemTraceRow.currentContext) { context = systemTraceRow.currentContext; - } else{ - context = systemTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = systemTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } systemTraceRow.canvasSave(context); (renders['energySystem'] as EnergySystemRender).renderMainThread( @@ -469,11 +469,11 @@ export class SpHiSysEventChart { ); }; powerTraceRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(powerTraceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (powerTraceRow.currentContext) { context = powerTraceRow.currentContext; - } else{ - context = powerTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = powerTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } powerTraceRow.canvasSave(context); (renders['energyPower'] as EnergyPowerRender).renderMainThread( @@ -636,11 +636,11 @@ export class SpHiSysEventChart { this.trace?.displayTip(stateTraceRow, EnergyStateStruct.hoverEnergyStateStruct, tip); }; stateTraceRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(stateTraceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (stateTraceRow.currentContext) { context = stateTraceRow.currentContext; - } else{ - context = stateTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = stateTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } stateTraceRow.canvasSave(context); (renders['energyState'] as EnergyStateRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpIrqChart.ts b/ide/src/trace/component/chart/SpIrqChart.ts index 4b468d77431840a49c8205ee45ea872224460156..b28001936a87bf5fd0dbd884877de2db2830f5b1 100644 --- a/ide/src/trace/component/chart/SpIrqChart.ts +++ b/ide/src/trace/component/chart/SpIrqChart.ts @@ -65,11 +65,11 @@ export class SpIrqChart { IrqStruct.hoverIrqStruct = traceRow.getHoverStruct(); }; traceRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(traceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (traceRow.currentContext) { context = traceRow.currentContext; - } else{ - context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } traceRow.canvasSave(context); (renders['irq'] as IrqRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpLogChart.ts b/ide/src/trace/component/chart/SpLogChart.ts index b73ba522c8e495f9dafd851109a99aa966cbe569..b59ae39867c703a26744bf2755589075ce717971 100644 --- a/ide/src/trace/component/chart/SpLogChart.ts +++ b/ide/src/trace/component/chart/SpLogChart.ts @@ -54,11 +54,11 @@ export class SpLogChart { resolve(dataArray); }); logsRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(logsRow.currentContext){ + let context: CanvasRenderingContext2D; + if (logsRow.currentContext) { context = logsRow.currentContext; - } else{ - context = logsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = logsRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } logsRow.canvasSave(context); (renders.logs as LogRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpNativeMemoryChart.ts b/ide/src/trace/component/chart/SpNativeMemoryChart.ts index da2778a063e00552a7695a38e16231678df6b799..334bb4852fc5e5345e932ce65b92d1ea8e399929 100644 --- a/ide/src/trace/component/chart/SpNativeMemoryChart.ts +++ b/ide/src/trace/component/chart/SpNativeMemoryChart.ts @@ -80,16 +80,16 @@ export class SpNativeMemoryChart { }, { key: '1', - title: 'Native Memory Density' - } - ] + title: 'Native Memory Density', + }, + ]; nativeRow.onRowSettingChangeHandler = (value) => { nativeRow.childrenList.forEach((row) => (row.drawType = parseInt(value[0]))); this.trace.getCollectRows(`trace-row[row-type='heap']`).forEach((it) => { it.drawType = parseInt(value[0]); }); this.trace.refreshCanvas(false); - } + }; nativeRow.supplier = () => new Promise>((resolve) => resolve([])); nativeRow.onThreadHandler = (useCache) => { nativeRow.canvasSave(this.trace.canvasPanelCtx!); @@ -149,11 +149,11 @@ export class SpNativeMemoryChart { : this.getNativeMemoryStatisticByChartType(i - 1); }; allHeapRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(allHeapRow.currentContext){ + let context: CanvasRenderingContext2D; + if (allHeapRow.currentContext) { context = allHeapRow.currentContext; - } else{ - context = allHeapRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = allHeapRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } allHeapRow.canvasSave(context); (renders['heap'] as HeapRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpProcessChart.ts b/ide/src/trace/component/chart/SpProcessChart.ts index 8066dd4b50e03d62b7969d1636a9ea9a13b8df17..9ac49f49ff3f84db229e6c16b64edd884f32d438 100644 --- a/ide/src/trace/component/chart/SpProcessChart.ts +++ b/ide/src/trace/component/chart/SpProcessChart.ts @@ -35,7 +35,7 @@ import { queryProcessThreads, queryProcessThreadsByTable, queryStartupPidArray, - queryThreadData + queryThreadData, } from '../../database/SqlLite.js'; import { Utils } from '../trace/base/Utils.js'; import { info } from '../../../log/Log.js'; @@ -293,7 +293,7 @@ export class SpProcessChart { let isIntersect = (a: JanksStruct, b: JanksStruct): boolean => Math.max(a.ts! + a.dur!, b.ts! + b.dur!) - Math.min(a.ts!, b.ts!) < a.dur! + b.dur!; let depthArray: any = []; - for (let j = 0 ; j < expectedData.length ; j++) { + for (let j = 0; j < expectedData.length; j++) { let expectedItem = expectedData[j]; if (expectedItem.cmdline != 'render_service') { expectedItem.frame_type = 'app'; @@ -322,15 +322,15 @@ export class SpProcessChart { let maxHeight = max * 20; expectedRow = TraceRow.skeleton(); let timeLineType = expectedData[0].type; - expectedRow.rowId = `${ timeLineType }-${ it.pid }`; + expectedRow.rowId = `${timeLineType}-${it.pid}`; expectedRow.asyncFuncName = it.processName; expectedRow.asyncFuncNamePID = it.pid; expectedRow.rowType = TraceRow.ROW_TYPE_JANK; - expectedRow.rowParentId = `${ it.pid }`; + expectedRow.rowParentId = `${it.pid}`; expectedRow.rowHidden = !processRow.expansion; expectedRow.style.width = '100%'; - expectedRow.style.height = `${ maxHeight }px`; - expectedRow.setAttribute('height', `${ maxHeight }`); + expectedRow.style.height = `${maxHeight}px`; + expectedRow.setAttribute('height', `${maxHeight}`); expectedRow.setAttribute('frame_type', expectedData[0].frame_type); expectedRow.name = 'Expected Timeline'; expectedRow.addTemplateTypes('FrameTimeline'); @@ -360,7 +360,7 @@ export class SpProcessChart { let isIntersect = (a: any, b: any): boolean => Math.max(a.ts + a.dur, b.ts + b.dur) - Math.min(a.ts, b.ts) < a.dur + b.dur; let depthArray: any = []; - for (let j = 0 ; j < actualData.length ; j++) { + for (let j = 0; j < actualData.length; j++) { let actualItem = actualData[j]; if (actualItem.cmdline != 'render_service') { actualItem.frame_type = 'app'; @@ -392,13 +392,13 @@ export class SpProcessChart { let maxHeight = max * 20; actualRow = TraceRow.skeleton(); let timeLineType = actualData[0].type; - actualRow.rowId = `${ timeLineType }-${ it.pid }`; + actualRow.rowId = `${timeLineType}-${it.pid}`; actualRow.rowType = TraceRow.ROW_TYPE_JANK; - actualRow.rowParentId = `${ it.pid }`; + actualRow.rowParentId = `${it.pid}`; actualRow.rowHidden = !processRow.expansion; actualRow.style.width = '100%'; - actualRow.style.height = `${ maxHeight }px`; - actualRow.setAttribute('height', `${ maxHeight }`); + actualRow.style.height = `${maxHeight}px`; + actualRow.setAttribute('height', `${maxHeight}`); actualRow.name = 'Actual Timeline'; actualRow.addTemplateTypes('FrameTimeline'); actualRow.setAttribute('frame_type', actualData[0].frame_type); @@ -517,7 +517,7 @@ export class SpProcessChart { Math.max(a.startTs + a.dur, b.startTs + b.dur) - Math.min(a.startTs, b.startTs) < a.dur + b.dur; let depthArray: any = []; asyncFunctions.forEach((it, i) => { - if (it.dur == -1) { + if (it.dur === -1) { it.dur = (TraceRow.range?.endNS || 0) - it.startTs; it.flag = 'Did not end'; } @@ -557,7 +557,7 @@ export class SpProcessChart { context = funcRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } funcRow.canvasSave(context); - (renders['func'] as FuncRender).renderMainThread( + (renders.func as FuncRender).renderMainThread( { context: context, useCache: cacheFlag, @@ -595,14 +595,14 @@ export class SpProcessChart { ); }; row.findHoverStruct = () => { - ProcessMemStruct.hoverProcessMemStruct = row.getHoverStruct(); + ProcessMemStruct.hoverProcessMemStruct = row.getHoverStruct(false); }; row.supplier = (): Promise> => queryProcessMemData(mem.trackId).then((resultProcess) => { let maxValue = Math.max(...resultProcess.map((it) => it.value || 0)); for (let j = 0; j < resultProcess.length; j++) { resultProcess[j].maxValue = maxValue; - if (j == resultProcess.length - 1) { + if (j === resultProcess.length - 1) { resultProcess[j].duration = (TraceRow.range?.totalNS || 0) - (resultProcess[j].startTime || 0); } else { resultProcess[j].duration = (resultProcess[j + 1].startTime || 0) - (resultProcess[j].startTime || 0); @@ -623,7 +623,7 @@ export class SpProcessChart { context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } row.canvasSave(context); - (renders['mem'] as MemRender).renderMainThread( + (renders.mem as MemRender).renderMainThread( { context: context, useCache: useCache, @@ -727,7 +727,7 @@ export class SpProcessChart { funs.forEach((fun) => { if (isBinder(fun)) { } else { - if (fun.dur == -1) { + if (fun.dur === -1) { fun.dur = (TraceRow.range?.totalNS || 0) - (fun.startTs || 0); fun.flag = 'Did not end'; } @@ -749,7 +749,7 @@ export class SpProcessChart { context = funcRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } funcRow.canvasSave(context); - (renders['func'] as FuncRender).renderMainThread( + (renders.func as FuncRender).renderMainThread( { context: context, useCache: useCache, diff --git a/ide/src/trace/component/chart/SpSdkChart.ts b/ide/src/trace/component/chart/SpSdkChart.ts index 0b9f8bbe6bff7deea58d1d418d83199e512f3ebb..7a04c1b5bc00dc198749ea47b7dd3d8d9b2b9ba2 100644 --- a/ide/src/trace/component/chart/SpSdkChart.ts +++ b/ide/src/trace/component/chart/SpSdkChart.ts @@ -248,11 +248,11 @@ export class SpSdkChart { let maxList = await queryCounterMax(sqlMap.maxSql, result.counter_id, componentId); let maxCounter = maxList[0].max_value; traceRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(traceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (traceRow.currentContext) { context = traceRow.currentContext; - } else{ - context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } traceRow.canvasSave(context); (renders[TraceRow.ROW_TYPE_SDK_COUNTER] as SdkCounterRender).renderMainThread( @@ -374,11 +374,11 @@ export class SpSdkChart { SdkSliceStruct.hoverSdkSliceStruct = traceRow.getHoverStruct(); }; traceRow.onThreadHandler = (useCache: boolean) => { - let context:CanvasRenderingContext2D; - if(traceRow.currentContext){ + let context: CanvasRenderingContext2D; + if (traceRow.currentContext) { context = traceRow.currentContext; - } else{ - context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } traceRow.canvasSave(context); (renders[TraceRow.ROW_TYPE_SDK_SLICE] as SdkSliceRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpVirtualMemChart.ts b/ide/src/trace/component/chart/SpVirtualMemChart.ts index fb1e22ee4b507760a82f40ee1a23859dc8a92ced..5a2bab89935d8cc22a6ef5ebded9636766cd7d00 100644 --- a/ide/src/trace/component/chart/SpVirtualMemChart.ts +++ b/ide/src/trace/component/chart/SpVirtualMemChart.ts @@ -103,11 +103,11 @@ export class SpVirtualMemChart { VirtualMemoryStruct.hoverStruct = virtualMemoryRow.getHoverStruct(); }; virtualMemoryRow.onThreadHandler = (useCache) => { - let context:CanvasRenderingContext2D; - if(virtualMemoryRow.currentContext){ + let context: CanvasRenderingContext2D; + if (virtualMemoryRow.currentContext) { context = virtualMemoryRow.currentContext; - } else{ - context = virtualMemoryRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } else { + context = virtualMemoryRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } virtualMemoryRow.canvasSave(context); (renders['virtual-memory-cell'] as VirtualMemoryRender).renderMainThread( diff --git a/ide/src/trace/component/chart/SpVmTrackerChart.ts b/ide/src/trace/component/chart/SpVmTrackerChart.ts index a4147b8afb1d52e4ab367c661c4b3f371539af6e..e0e8f81722da0bc3455328d6fafdad8d20c3dd88 100644 --- a/ide/src/trace/component/chart/SpVmTrackerChart.ts +++ b/ide/src/trace/component/chart/SpVmTrackerChart.ts @@ -21,21 +21,23 @@ import { querySmapsExits, queryVmTrackerShmData, queryPurgeableProcessData, - queryGpuGLData, queryGpuTotalData, queryGpuTotalType, queryGpuWindowData, queryGpuWindowType, + queryGpuData, + queryGpuResourceData, } from '../../database/SqlLite.js'; import { TraceRow } from '../trace/base/TraceRow.js'; -import { BaseStruct } from '../../bean/BaseStruct.js'; +import { type BaseStruct } from '../../bean/BaseStruct.js'; import { renders } from '../../database/ui-worker/ProcedureWorker.js'; import { Utils } from '../trace/base/Utils.js'; -import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js'; +import { type EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU.js'; import { info } from '../../../log/Log.js'; -import { SnapshotRender, SnapshotStruct } from '../../database/ui-worker/ProcedureWorkerSnapshot.js'; -import { TreeItemData } from '../../../base-ui/tree/LitTree.js'; +import { type SnapshotRender, SnapshotStruct } from '../../database/ui-worker/ProcedureWorkerSnapshot.js'; +import { type TreeItemData } from '../../../base-ui/tree/LitTree.js'; import { MemoryConfig } from '../../bean/MemoryConfig.js'; +import { TabPaneSmapsRecord } from '../trace/sheet/smaps/TabPaneSmapsRecord.js'; export class VmTrackerChart { private trace: SpSystemTrace; @@ -46,11 +48,24 @@ export class VmTrackerChart { static gpuTotalModule: number | null = null; //ns static gpuWindow: number | null = null; //ns static gpuWindowModule: number | null = null; //ns + private smapsRecordTab: TabPaneSmapsRecord | undefined | null; + private scratchId = -1; constructor(trace: SpSystemTrace) { this.trace = trace; } async init(): Promise { + this.smapsRecordTab = this.trace + .shadowRoot!.querySelector('div > trace-sheet')! + .shadowRoot!.querySelector('#box-smaps-record > tabpane-smaps-record'); + if (this.scratchId == -1) { + for (let [key, value] of SpSystemTrace.DATA_DICT) { + if (value === 'Scratch') { + this.scratchId = key; + break; + } + } + } const result = await querySmapsExits(); if (result.length <= 0) { return; @@ -65,7 +80,14 @@ export class VmTrackerChart { await this.initPurgeableVM(); await this.initDmaRow(); const gpuMemoryData = await queryGpuMemoryData(this.memoryConfig.iPid); - const glArr = await queryGpuGLData(MemoryConfig.getInstance().iPid).then((res) => { + const gpuResource = await queryGpuResourceData(this.scratchId); + const graphArr = await queryGpuData(MemoryConfig.getInstance().iPid, "'mem.graph_pss'").then((res) => { + res.forEach((graph, index) => { + (graph as any).name = `SnapShot ${index}`; + }); + return res as SnapshotStruct[]; + }); + const glArr = await queryGpuData(MemoryConfig.getInstance().iPid, "'mem.gl_pss'").then((res) => { res.forEach((gl, index) => { (gl as any).name = `SnapShot ${index}`; }); @@ -76,6 +98,13 @@ export class VmTrackerChart { if (gpuMemoryData.length > 0) { await this.initGpuMemoryRow(gpuMemoryData); } + if (gpuResource.length > 0) { + await this.initGpuResourceRow(gpuResource); + } else { + this.smapsRecordTab!.GLESHostCache = []; + } + + await this.addGpuGraphRow(graphArr); await this.addGpuGLRow(glArr); if (glArr.length > 0) { await this.addGpuTotalRow(); @@ -312,12 +341,38 @@ export class VmTrackerChart { this.gpuFolder.addChildTraceRow(gpuMemoryTraceRow); }; + private initGpuResourceRow = async (gpuResourceData: Array): Promise => { + for (let i = 0; i < gpuResourceData.length; i++) { + gpuResourceData[i].name = `Snapshot${i}`; + } + // 将泳道图数据传递给Smaps Record Tab页 + this.smapsRecordTab!.GLESHostCache = gpuResourceData; + let gpuMemoryTraceRow = this.initTraceRow( + 'Gpu Resource', + TraceRow.ROW_TYPE_GPU_RESOURCE_VMTRACKER, + this.gpuFolder.rowId! + ); + gpuMemoryTraceRow.rowHidden = !this.gpuFolder.expansion; + gpuMemoryTraceRow.folderTextLeft = 40; + gpuMemoryTraceRow.supplier = (): Promise> => + new Promise>((resolve) => resolve(gpuResourceData)); + this.gpuFolder.addChildTraceRow(gpuMemoryTraceRow); + }; + + private async addGpuGraphRow(graphArr: Array): Promise { + let graphRow = this.initTraceRow('Graph', TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH, this.gpuFolder.rowId!); + graphRow.addTemplateTypes('sys-memory'); + graphRow.folderTextLeft = 40; + graphRow.supplier = () => new Promise((resolve) => resolve(graphArr)); + this.gpuFolder.addChildTraceRow(graphRow); + } + private async addGpuGLRow(glArr: Array): Promise { if (glArr.length > 0) { let glRow = this.initTraceRow('GL', TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL, this.gpuFolder.rowId!); glRow.addTemplateTypes('sys-memory'); glRow.folderTextLeft = 40; - glRow.supplier = () => new Promise((resolve) => resolve(glArr)); + glRow.supplier = (): Promise => new Promise((resolve) => resolve(glArr)); this.gpuFolder.addChildTraceRow(glRow); } } @@ -341,14 +396,21 @@ export class VmTrackerChart { title: 'Total', checked: true, }, - ...types.map((it) => { - return { - key: `${it.id}`, - title: it.data, - }; - }), + ...types.map( + ( + it + ): { + key: string; + title: string; + } => { + return { + key: `${it.id}`, + title: it.data, + }; + } + ), ]; - gpuTotalRow.onRowSettingChangeHandler = (setting) => { + gpuTotalRow.onRowSettingChangeHandler = (setting): void => { if (setting && setting.length > 0) { gpuTotalRow.dataListCache = []; gpuTotalRow.dataList = []; @@ -416,7 +478,10 @@ export class VmTrackerChart { } }; gpuWindowRow.supplier = () => { - return queryGpuWindowData(VmTrackerChart.gpuWindow!, VmTrackerChart.gpuWindowModule).then((res) => { + return queryGpuWindowData( + VmTrackerChart.gpuWindow!, + VmTrackerChart.gpuWindowModule + ).then((res) => { res.forEach((window, index) => { (window as any).name = `SnapShot ${index}`; }); diff --git a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts index 9df7992e24e2624f9e15999ec198e700ed9a8266..cdfa3eaf20aa8ce77d8a40df8ad2a2b2761dd0f2 100644 --- a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts +++ b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts @@ -76,7 +76,8 @@ export class TabCpuDetailsThreads extends BaseElement { } init(cpu: number, it: any) { - this.shadowRoot!.querySelector('.cpu-thread-subheading')!.textContent = 'Threads in Freq ' + it.value; + this.shadowRoot!.querySelector('.cpu-thread-subheading')!.textContent = + 'Threads in Freq ' + it.value; this.progress!.loading = true; procedurePool.submitWithName( 'logic1', diff --git a/ide/src/trace/component/schedulingAnalysis/Top20FrequencyThread.ts b/ide/src/trace/component/schedulingAnalysis/Top20FrequencyThread.ts index a73b6f56e48298f438a9f31e371001e54039bbf3..355a2ac66ce38f3eaf47bc6a1d1eb9595293ce8d 100644 --- a/ide/src/trace/component/schedulingAnalysis/Top20FrequencyThread.ts +++ b/ide/src/trace/component/schedulingAnalysis/Top20FrequencyThread.ts @@ -82,7 +82,7 @@ export class Top20FrequencyThread extends BaseElement { } this.frequencyThreadPie?.showHover(); }); - this.frequencyThreadTbl!.itemTextHandleMap.set('freq',(value) => value === -1 ? 'unknown' : value); + this.frequencyThreadTbl!.itemTextHandleMap.set('freq', (value) => (value === -1 ? 'unknown' : value)); } sortByColumn(detail: any) { @@ -168,14 +168,14 @@ export class Top20FrequencyThread extends BaseElement { data: this.getPieChartData(res), angleField: 'time', colorField: 'freq', - colorFieldTransferHandler: (value) => value === -1 ? 'unknown' : value, + colorFieldTransferHandler: (value) => (value === -1 ? 'unknown' : value), radius: 0.8, label: { type: 'outer', }, tip: (obj) => { return `
    -
    freq:${obj.obj.freq===-1 ? 'unknown' : obj.obj.freq}
    +
    freq:${obj.obj.freq === -1 ? 'unknown' : obj.obj.freq}
    cpu:${obj.obj.cpu}
    time:${obj.obj.timeStr}
    ratio:${obj.obj.ratio}%
    diff --git a/ide/src/trace/component/setting/SpAllocations.ts b/ide/src/trace/component/setting/SpAllocations.ts index 417fb833db24d8079c114468b6193f2686db6cb3..159369a5d8281195ecb0bf36e4ffb298858d5d06 100644 --- a/ide/src/trace/component/setting/SpAllocations.ts +++ b/ide/src/trace/component/setting/SpAllocations.ts @@ -196,7 +196,7 @@ export class SpAllocations extends BaseElement { }; this.intervalResultInput!.style.color = 'var(--dark-color1,#000000)'; if (this.recordStatisticsResult!.hasAttribute('percent')) { - let step = Number(this.recordStatisticsResult!.getAttribute('percent')) / 450; + let step = Math.round(Number(this.recordStatisticsResult!.getAttribute('percent')) / 450); this.recordStatisticsResult!.setAttribute('percentValue', stepValue[step] + ''); this.intervalResultInput!.value = stepValue[step] + ''; } @@ -255,7 +255,7 @@ export class SpAllocations extends BaseElement { this.statisticsSlider.shadowRoot?.querySelector('#slider')!.addEventListener('mouseup', (ev) => { setTimeout(() => { let percentValue = this.recordStatisticsResult!.getAttribute('percent'); - let index = Number(percentValue) / 450; + let index = Math.round(Number(percentValue) / 450); index = index < 1 ? 0 : index; this.intervalResultInput!.value = stepValue[index] + ''; this.recordStatisticsResult!.setAttribute('percentValue', stepValue[index] + ''); @@ -299,9 +299,9 @@ export class SpAllocations extends BaseElement { } this.processId!.removeAttribute('disabled'); let inputBoxes = this.shadowRoot?.querySelectorAll('.inputBoxes'); - inputBoxes!.forEach((item) =>{ + inputBoxes!.forEach((item) => { item.disabled = false; - }) + }); this.statisticsSlider!.disabled = false; } @@ -319,11 +319,11 @@ export class SpAllocations extends BaseElement { if (this.offlineSymbol) { this.offlineSymbol.disabled = true; } - this.processId!.setAttribute('disabled',''); + this.processId!.setAttribute('disabled', ''); let inputBoxes = this.shadowRoot?.querySelectorAll('.inputBoxes'); - inputBoxes!.forEach((item) =>{ + inputBoxes!.forEach((item) => { item.disabled = true; - }) + }); this.statisticsSlider!.disabled = true; } diff --git a/ide/src/trace/component/setting/SpArkTs.ts b/ide/src/trace/component/setting/SpArkTs.ts index 84c007ac3f0d85e5032c0408e9867bc581ff70e8..c081c43d803cc0f519b9e3ece0972c9e560f1cdb 100644 --- a/ide/src/trace/component/setting/SpArkTs.ts +++ b/ide/src/trace/component/setting/SpArkTs.ts @@ -23,6 +23,7 @@ import { Cmd } from '../../../command/Cmd.js'; import { LitRadioBox } from '../../../base-ui/radiobox/LitRadioBox.js'; import { SpCheckDesBox } from './SpCheckDesBox.js'; import LitSwitch from '../../../base-ui/switch/lit-switch.js'; +import { SpApplication } from '../../SpApplication.js'; @element('sp-ark-ts') export class SpArkTs extends BaseElement { @@ -257,6 +258,16 @@ export class SpArkTs extends BaseElement { }); } + connectedCallback(): void { + let traceMode = this.shadowRoot!.querySelector('#traceMode') as HTMLDivElement; + let isLongTrace = SpApplication.isLongTrace; + if (isLongTrace) { + traceMode!.style.display = 'block'; + } else { + traceMode!.style.display = 'none'; + } + } + initHtml(): string { return `
    +
    + Long trace mode! If current data Trace is too large, it may not open! +
    Start Ark Ts Record diff --git a/ide/src/trace/component/setting/SpFileSystem.ts b/ide/src/trace/component/setting/SpFileSystem.ts index e8d1c66a541f025cae88f70610fc63a219062b3a..5f1092d5d689a5773f39bcd6c2ba3eef94b9d120 100644 --- a/ide/src/trace/component/setting/SpFileSystem.ts +++ b/ide/src/trace/component/setting/SpFileSystem.ts @@ -25,6 +25,7 @@ import { SpRecordTrace } from '../SpRecordTrace.js'; import { Cmd } from '../../../command/Cmd.js'; import { CmdConstant } from '../../../command/CmdConstant.js'; import { HdcDeviceManager } from '../../../hdc/HdcDeviceManager.js'; +import { SpApplication } from '../../SpApplication.js'; @element('sp-file-system') export class SpFileSystem extends BaseElement { @@ -202,6 +203,16 @@ export class SpFileSystem extends BaseElement { }); } + connectedCallback(): void { + let traceMode = this.shadowRoot!.querySelector('#traceMode') as HTMLDivElement; + let isLongTrace = SpApplication.isLongTrace; + if (isLongTrace) { + traceMode!.style.display = 'block'; + } else { + traceMode!.style.display = 'none'; + } + } + initHtml(): string { return `
    +
    + Long trace mode! If current data Trace is too large, it may not open! +
    Start FileSystem Record diff --git a/ide/src/trace/component/setting/SpHilogRecord.ts b/ide/src/trace/component/setting/SpHilogRecord.ts index c18badb3605d5cb7b214c7130c3098f0b3a8aa60..91ab78ddf9593ded7e048535ae9e0b457617250a 100644 --- a/ide/src/trace/component/setting/SpHilogRecord.ts +++ b/ide/src/trace/component/setting/SpHilogRecord.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import {BaseElement, element} from '../../../base-ui/BaseElement.js'; +import { BaseElement, element } from '../../../base-ui/BaseElement.js'; import LitSwitch from '../../../base-ui/switch/lit-switch.js'; import '../../../base-ui/select/LitAllocationSelect.js'; diff --git a/ide/src/trace/component/setting/SpProbesConfig.ts b/ide/src/trace/component/setting/SpProbesConfig.ts index f7192cfe8c8b9629c3f3be808d48c8e4d1387779..a3c86def33f7aaf8074562b4b8b4bf43b1b1e0ae 100644 --- a/ide/src/trace/component/setting/SpProbesConfig.ts +++ b/ide/src/trace/component/setting/SpProbesConfig.ts @@ -233,13 +233,13 @@ export class SpProbesConfig extends BaseElement { { value: 'usb', isSelect: false }, { value: 'ufs', isSelect: false }, { value: 'useriam', isSelect: false }, + { value: 'virse', isSelect: false }, { value: 'window', isSelect: true }, { value: 'workq', isSelect: true }, { value: 'zaudio', isSelect: true }, { value: 'zcamera', isSelect: true }, { value: 'zimage', isSelect: true }, { value: 'zmedia', isSelect: true }, - { value: 'virse', isSelect: false } ]; this.hitrace = this.shadowRoot?.getElementById('hitrace') as SpCheckDesBox; let parent = this.shadowRoot?.querySelector('.user-events') as Element; diff --git a/ide/src/trace/component/setting/SpRecordPerf.ts b/ide/src/trace/component/setting/SpRecordPerf.ts index 28658908de9160d05317c4fd960899dba6e674db..42c147eeea581496eb3407a505a44ba68c3e2049 100644 --- a/ide/src/trace/component/setting/SpRecordPerf.ts +++ b/ide/src/trace/component/setting/SpRecordPerf.ts @@ -650,6 +650,16 @@ export class SpRecordPerf extends BaseElement { ]; } + connectedCallback(): void { + let traceMode = this.shadowRoot!.querySelector('#traceMode') as HTMLDivElement; + let isLongTrace = SpApplication.isLongTrace; + if (isLongTrace) { + traceMode!.style.display = 'block'; + } else { + traceMode!.style.display = 'none'; + } + } + initHtml(): string { return `
    -
    -
    - +
    + Long trace mode! If current data Trace is too large, it may not open! +
    +
    +
    +
    `; } diff --git a/ide/src/trace/component/setting/SpRecordSetting.ts b/ide/src/trace/component/setting/SpRecordSetting.ts index 1d0127f3d9d5416a7ee998792bbb7855b8394f2a..f2f36f848fbc9bb6cfffe0011934b4251779c077 100644 --- a/ide/src/trace/component/setting/SpRecordSetting.ts +++ b/ide/src/trace/component/setting/SpRecordSetting.ts @@ -20,17 +20,28 @@ import '../../../base-ui/slider/LitSlider.js'; import { LitSlider } from '../../../base-ui/slider/LitSlider.js'; import '../../../base-ui/popover/LitPopover.js'; import { info } from '../../../log/Log.js'; +import { SpApplication } from '../../SpApplication.js'; @element('record-setting') export class SpRecordSetting extends BaseElement { private memoryBufferSlider: LitSlider | undefined; private maxDurationSliders: LitSlider | undefined; private radioBox: LitRadioBox | undefined; + private longTraceRadio: LitRadioBox | undefined; private bufferNumber: HTMLElement | undefined; private durationNumber: HTMLElement | undefined; private outputPath: HTMLInputElement | undefined; private lastMemoryValue: string | undefined; private lastDurationValue: string | undefined; + isRecordTemplate: boolean = false; + + get longTraceSingleFileMaxSize(): number { + let maxFileSizeEl = this.shadowRoot?.querySelector('.max_size_result'); + if (maxFileSizeEl) { + return Number(maxFileSizeEl.value); + } + return 200; + } get recordMod(): boolean { if (this.radioBox) { @@ -39,11 +50,25 @@ export class SpRecordSetting extends BaseElement { return false; } + get longOutPath(): string { + if (this.outputPath && this.outputPath.value !== '' && this.outputPath.value !== 'long_trace/') { + return `/data/local/tmp/${this.outputPath.value}/`; + } + return '/data/local/tmp/long_trace/'; + } + get output(): string { - if (this.outputPath && this.outputPath.value != '') { - return '/data/local/tmp/' + this.outputPath.value; + if (SpApplication.isLongTrace && !this.isRecordTemplate) { + if (this.outputPath && this.outputPath.value !== 'long_trace/' && this.outputPath.value !== '') { + return `/data/local/tmp/${this.outputPath.value}/hiprofiler_data.htrace`; + } + return '/data/local/tmp/long_trace/hiprofiler_data.htrace'; + } else { + if (this.outputPath && this.outputPath.value !== '') { + return `/data/local/tmp/${this.outputPath.value}`; + } + return '/data/local/tmp/hiprofiler_data.htrace'; } - return '/data/local/tmp/hiprofiler_data.htrace'; } get bufferSize(): number { @@ -66,19 +91,19 @@ export class SpRecordSetting extends BaseElement { let bufferInput = this.shadowRoot?.querySelector('.memory_buffer_result') as HTMLInputElement; let parentElement = this.memoryBufferSlider!.parentNode as Element; if (bufferInput.style.color != 'var(--dark-color1,#000000)' && this.lastMemoryValue) { - bufferInput.value = this.lastMemoryValue + ''; - this.memoryBufferSlider!.percent = this.lastMemoryValue + ''; + bufferInput.value = `${this.lastMemoryValue}`; + this.memoryBufferSlider!.percent = `${this.lastMemoryValue}`; this.memoryBufferSlider!.sliderStyle = { minRange: 4, maxRange: 512, - defaultValue: this.lastMemoryValue + '', + defaultValue: `${this.lastMemoryValue}`, resultUnit: 'MB', stepSize: 2, lineColor: 'var(--dark-color3,#46B1E3)', buttonColor: '#999999', }; - parentElement.setAttribute('percent', this.lastMemoryValue + ''); - this.lastMemoryValue = this.lastMemoryValue + ''; + parentElement.setAttribute('percent', `${this.lastMemoryValue}`); + this.lastMemoryValue = `${this.lastMemoryValue}`; bufferInput.style.color = 'var(--dark-color1,#000000)'; } @@ -116,11 +141,80 @@ export class SpRecordSetting extends BaseElement { button.style.backgroundColor = '#E4E3E9'; }); }); - this.radioBox = this.shadowRoot?.querySelector('#litradio') as LitRadioBox; + this.addLongTraceConfig(); + this.initLitSlider(); + } + + private addLongTraceConfig() { + this.longTraceRadio = this.shadowRoot?.querySelector('#longTraceRadio') as LitRadioBox; this.outputPath = this.shadowRoot?.querySelector('#trace_path') as HTMLInputElement; + let rootEl = this.shadowRoot?.querySelector('.root') as HTMLDivElement; + let longTraceMaxSlide = document.createElement('div'); + longTraceMaxSlide.innerHTML = `
    +
    + Single file max size + (single file size after cutting is 200MB - 400MB) +
    + + +
    + + MB +
    +
    `; - this.initLitSlider(); + let maxSingleFileEl = longTraceMaxSlide.querySelector('.max-single-file-size'); + let maxSizeSliders = longTraceMaxSlide.querySelector('#max-size') as LitSlider; + let maxSizeInput = longTraceMaxSlide.querySelector('.max_size_result') as HTMLInputElement; + let maxSizeParentElement = maxSizeSliders.parentNode as Element; + maxSizeSliders.sliderStyle = { + minRange: 200, + maxRange: 400, + defaultValue: '200', + resultUnit: 'MB', + stepSize: 2, + lineColor: 'var(--dark-color3,#46B1E3)', + buttonColor: '#999999', + }; + maxSizeSliders.addEventListener('input', () => { + if (maxSingleFileEl?.hasAttribute('percent')) { + maxSizeInput.value = `${maxSingleFileEl?.getAttribute('percent')}`; + } else { + maxSizeInput.value = maxSizeSliders.sliderStyle.defaultValue; + } + }); + maxSizeInput.value = maxSizeSliders.sliderStyle.defaultValue; + maxSizeParentElement.setAttribute('percent', '50'); + maxSizeInput.style.color = 'var(--dark-color1,#000000)'; + maxSizeInput.addEventListener('input', (ev) => { + maxSizeSliders!.percent = maxSizeInput.value; + let htmlInputElement = maxSizeSliders!.shadowRoot?.querySelector('#slider') as HTMLInputElement; + htmlInputElement.value = maxSizeInput.value; + maxSizeSliders!.sliderStyle = { + minRange: 200, + maxRange: 400, + defaultValue: maxSizeInput.value, + resultUnit: 'MB', + stepSize: 2, + lineColor: 'var(--dark-color3,#46B1E3)', + buttonColor: '#999999', + }; + maxSizeParentElement.setAttribute('percent', maxSizeInput.value); + }); + + this.radioBox!.addEventListener('click', () => { + SpApplication.isLongTrace = false; + if (rootEl.lastChild === longTraceMaxSlide) { + rootEl.removeChild(longTraceMaxSlide); + } + this.outputPath!.value = 'hiprofiler_data.htrace'; + }); + this.longTraceRadio.addEventListener('click', () => { + SpApplication.isLongTrace = true; + rootEl.appendChild(longTraceMaxSlide); + this.outputPath!.value = 'long_trace/'; + }); } initLitSlider() { @@ -221,7 +315,7 @@ export class SpRecordSetting extends BaseElement { durationParentElement.setAttribute('percent', '30'); return; } - let regExpMatch = durationInput.value.trim().match(`^\\d{1,2}\\:\\d{1,2}\\:\\d{1,2}$`); + let regExpMatch = durationInput.value.trim().match('^\\d{1,2}\\:\\d{1,2}\\:\\d{1,2}$'); if (regExpMatch) { let durationList = regExpMatchArray.split(':'); let resultDuration = Number(durationList[0]) * 3600 + Number(durationList[1]) * 60 + Number(durationList[2]); @@ -239,11 +333,11 @@ export class SpRecordSetting extends BaseElement { durationInput.parentElement!.style.backgroundColor = 'var(--dark-background5,#F2F2F2)'; durationInput.style.backgroundColor = 'var(--dark-background5,#F2F2F2)'; let htmlInputElement = this.maxDurationSliders!.shadowRoot?.querySelector('#slider') as HTMLInputElement; - htmlInputElement.value = resultDuration + ''; + htmlInputElement.value = `${resultDuration}`; this.maxDurationSliders!.sliderStyle = { minRange: 10, maxRange: 3600, - defaultValue: Number(durationList[0]) + ':' + Number(durationList[1]) + ':' + Number(durationList[2]), + defaultValue: `${Number(durationList[0])}:${Number(durationList[1])}:${Number(durationList[2])}`, resultUnit: 'h:m:s', stepSize: 1, lineColor: 'var(--dark-color4,#61CFBE)', @@ -289,6 +383,12 @@ export class SpRecordSetting extends BaseElement { width: 100%; height: 100%; } + #longTraceRadio{ + display: none; + } + :host([trace_config]) #longTraceRadio{ + display: block; + } .record-mode{ font-family: Helvetica-Bold; font-size: 16px; @@ -331,7 +431,7 @@ export class SpRecordSetting extends BaseElement { grid-template-columns: 1fr min-content; } - .max-duration{ + .max-duration, .max-single-file-size{ height: min-content; display: grid; grid-template-rows: 1fr 1fr; @@ -346,6 +446,7 @@ export class SpRecordSetting extends BaseElement { text-align: left; line-height: 16px; font-weight: 400; + margin-right: 20px; } button{ @@ -369,7 +470,7 @@ export class SpRecordSetting extends BaseElement { vertical-align: middle; } - .max_duration_result, .memory_buffer_result{ + .max_duration_result, .memory_buffer_result, .max_size_result{ background-color: var(--dark-background5,#F2F2F2); color:var(--dark-color,#6a6f77); border: none; @@ -396,7 +497,7 @@ export class SpRecordSetting extends BaseElement { border:1px solid var(--dark-border,#c8cccf); } - #memory-buffer, #max-duration { + #memory-buffer, #max-duration, #max-size { margin: 0 8px; grid-column: span 2; } @@ -419,7 +520,10 @@ export class SpRecordSetting extends BaseElement {
    Record mode - Normal Mode +
    + Normal Mode + Long Trace Mode +
    output file path diff --git a/ide/src/trace/component/setting/SpRecordTemplate.ts b/ide/src/trace/component/setting/SpRecordTemplate.ts index 72893e42b21a0c8b309f3303e336a69423f77f8a..f90a38958a6b2f5f97f4f69864f42ba4abc403b6 100644 --- a/ide/src/trace/component/setting/SpRecordTemplate.ts +++ b/ide/src/trace/component/setting/SpRecordTemplate.ts @@ -76,7 +76,8 @@ export class SpRecordTemplate extends BaseElement { 'zimage', 'zmedia', ]; - static HIPERF_DEFAULT_RECORD_ARGS = '-f 1000 -a --cpu-limit 100 -e hw-cpu-cycles,sched:sched_waking' + + static HIPERF_DEFAULT_RECORD_ARGS = + '-f 1000 -a --cpu-limit 100 -e hw-cpu-cycles,sched:sched_waking' + ' --call-stack dwarf --clockid monotonic --offcpu -m 256'; private frameTimeline: LitSwitch | undefined | null; private schedulingAnalysis: LitSwitch | undefined | null; @@ -90,18 +91,23 @@ export class SpRecordTemplate extends BaseElement { this.appStartup = this.shadowRoot?.querySelector('#app_startup'); this.taskPoolEl = this.shadowRoot?.querySelector('#task_pool'); this.dynamicEffectEl = this.shadowRoot?.querySelector('#dynamic_effect'); - this.addProbeListener(this.frameTimeline!, this.schedulingAnalysis!, this.appStartup!, this.taskPoolEl!, this.dynamicEffectEl!); + this.addProbeListener( + this.frameTimeline!, + this.schedulingAnalysis!, + this.appStartup!, + this.taskPoolEl!, + this.dynamicEffectEl! + ); } addProbeListener(...elements: HTMLElement[]) { - elements.forEach(element => { + elements.forEach((element) => { element.addEventListener('change', (event: CustomEventInit) => { let detail = event.detail; if (detail!.checked) { - this.dispatchEvent(new CustomEvent('addProbe', - { detail: { 'elementId': element.getAttribute('name') } })); } else { - this.dispatchEvent(new CustomEvent('delProbe', - {detail: {'elementId': element.getAttribute('name')}})); + this.dispatchEvent(new CustomEvent('addProbe', { detail: { elementId: element.getAttribute('name') } })); + } else { + this.dispatchEvent(new CustomEvent('delProbe', { detail: { elementId: element.getAttribute('name') } })); } }); }); diff --git a/ide/src/trace/component/setting/SpWebHdcShell.ts b/ide/src/trace/component/setting/SpWebHdcShell.ts index 4cf510625cfc0e6c5e0a404d28fc26c095f2766f..78fe917cafdcf432edcd051515ccc68e07be2399 100644 --- a/ide/src/trace/component/setting/SpWebHdcShell.ts +++ b/ide/src/trace/component/setting/SpWebHdcShell.ts @@ -170,12 +170,13 @@ export class SpWebHdcShell extends BaseElement { index++; if (index === 1) { if (depth > 1) { - selectedText += line.slice( - this.getCurrentLineBackSize(line, startX - x, true)) + (endX < x + w ? '\n' : ''); + selectedText += + line.slice(this.getCurrentLineBackSize(line, startX - x, true)) + (endX < x + w ? '\n' : ''); } else { selectedText += `${line.slice( this.getCurrentLineBackSize(line, startX - x, true), - this.getCurrentLineBackSize(line, endX - x, false))}\n`; + this.getCurrentLineBackSize(line, endX - x, false) + )}\n`; } } else if (index === depth) { selectedText += `${line.slice(0, this.getCurrentLineBackSize(line, endX - x, false))}\n`; @@ -229,16 +230,18 @@ export class SpWebHdcShell extends BaseElement { } } } - this.points = {startX: startPointX, startY: startPointY, endX: endPointX, endY: endPointY}; + this.points = { startX: startPointX, startY: startPointY, endX: endPointX, endY: endPointY }; } - getCurrentLineBackSize(currentLine: string, maxBackSize: number, isStart: boolean): number{ + getCurrentLineBackSize(currentLine: string, maxBackSize: number, isStart: boolean): number { let fillText = ''; let strings = currentLine.split(''); for (let index = 0; index < strings.length; index++) { let text = strings[index]; - if (this.shellCanvasCtx!.measureText(fillText).width < maxBackSize && - this.shellCanvasCtx!.measureText(fillText + text).width >= maxBackSize) { + if ( + this.shellCanvasCtx!.measureText(fillText).width < maxBackSize && + this.shellCanvasCtx!.measureText(fillText + text).width >= maxBackSize + ) { if (!isStart) { fillText += text; } @@ -281,7 +284,7 @@ export class SpWebHdcShell extends BaseElement { } } } - this.points = {startX: startPointX, startY: startPointY, endX: endPointX, endY: endPointY}; + this.points = { startX: startPointX, startY: startPointY, endX: endPointX, endY: endPointY }; } private singleLineToMultiLine(shellStr: string, foundationWidth: number, maxWidth: number): string[] { @@ -341,8 +344,8 @@ export class SpWebHdcShell extends BaseElement { textY = SpWebHdcShell.TOP_OFFSET + index * 16; this.shellCanvasCtx!.fillText(shellStr, SpWebHdcShell.LEFT_OFFSET, textY); } - shellStrLength = this.shellCanvasCtx!.measureText( - this.cursorRow.slice(0, this.cursorIndex)).width + SpWebHdcShell.LEFT_OFFSET; + shellStrLength = + this.shellCanvasCtx!.measureText(this.cursorRow.slice(0, this.cursorIndex)).width + SpWebHdcShell.LEFT_OFFSET; if (scroller) { if (textY > this.shellDiv!.clientHeight) { this.shellDiv!.scrollTop = textY - this.shellDiv!.clientHeight + 3; @@ -364,8 +367,7 @@ export class SpWebHdcShell extends BaseElement { } }, 500); } - } catch (e) { - } + } catch (e) {} } public initHtml(): string { @@ -474,10 +476,14 @@ export class SpWebHdcShell extends BaseElement { this.realTimeResult = ''; } else if (this.isStartWidthArrayBuffer(arrayA, this.startRealTimeFlag)) { let lastIndex = this.getLastRestorationIndex(arrayA, this.endRealTimeFlag); - this.realTimeResult = this.removeTextAndColorSequenceStr(this.textDecoder.decode(arrayA.slice(lastIndex, arrayA.length))); + this.realTimeResult = this.removeTextAndColorSequenceStr( + this.textDecoder.decode(arrayA.slice(lastIndex, arrayA.length)) + ); this.startRealTime = true; } else if (this.isStartWidthArrayBuffer(arrayA, this.clearRealTimeFlag)) { - this.realTimeResult = this.removeTextAndColorSequenceStr(this.textDecoder.decode(arrayA.slice(6, arrayA.length))); + this.realTimeResult = this.removeTextAndColorSequenceStr( + this.textDecoder.decode(arrayA.slice(6, arrayA.length)) + ); this.startRealTime = true; } else { if (this.isStartWidthArrayBuffer(arrayA, this.ctrlCFlag)) { diff --git a/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts b/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts index f2bf3a275114d7241e888906a009c140c1e82b5c..df54b7b8241a68ebe44a6cec04a556d60ac75cb1 100644 --- a/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts +++ b/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts @@ -27,7 +27,9 @@ export enum ProfilerSessionConfigBufferConfigPolicy { export interface ProfilerSessionConfig { buffers: ProfilerSessionConfigBufferConfig[]; sessionMode: ProfilerSessionConfigMode; - + splitFile?: boolean; + splitFileMaxSizeMb?: number; + splitFileMaxNum?: number; /** for OFFLINE mode, result file max size in KB */ resultMaxSize: number; /** if set to non-zero value, session will auto-destroyed after CreateSession in ms */ @@ -82,9 +84,10 @@ export interface ProfilerPluginConfig { protobuf_serialize?: boolean; } -export interface FileSystemConfig { +export interface HiebpfConfig { cmdLine: string; outfileName: string; + splitOutfileName?: string; } export interface MemoryConfig { @@ -897,6 +900,7 @@ export interface HiperfPluginConfig { isRoot: boolean; outfileName: string; recordArgs: string; + splitOutfileName?: string; } export interface HiSystemEventConfig { @@ -912,4 +916,5 @@ export interface ArkTSConfig { track_allocations: boolean; enable_cpu_profiler: boolean; cpu_profiler_interval: number; + splitOutfileName?: string; } diff --git a/ide/src/trace/component/trace/SpChartList.ts b/ide/src/trace/component/trace/SpChartList.ts index 6f268d69a7e278f13e2d7026495e8ff4ed3602e3..91c17108a09d894d5b935f9540b7ef64a838ecfc 100644 --- a/ide/src/trace/component/trace/SpChartList.ts +++ b/ide/src/trace/component/trace/SpChartList.ts @@ -34,11 +34,13 @@ import { LitIcon } from '../../../base-ui/icon/LitIcon.js'; const maxScale = 0.8; //收藏最大高度为界面最大高度的80% const topHeight = 150; // 顶部cpu使用率部分高度固定为150px -const minHeight = 20; //泳道最低高度为20 -const mouseMoveRange = 5 +const minHeight = 40; //泳道最低高度为40 +const mouseMoveRange = 5; @element('sp-chart-list') export class SpChartList extends BaseElement { + private static COLLECT_G1 = '1'; + private static COLLECT_G2 = '2'; private collectEl1: HTMLDivElement | null | undefined; private collectEl2: HTMLDivElement | null | undefined; private groupTitle1: HTMLDivElement | null | undefined; @@ -142,11 +144,16 @@ export class SpChartList extends BaseElement { return (this.parentElement!.clientHeight - topHeight) * maxScale; } - getCollectRows(condition: string) { - return this.rootEl?.querySelectorAll>(condition) || []; + getCollectRows(condition: string): Array> | [] { + const result = this.rootEl?.querySelectorAll>(condition); + if (result) { + return Array.from(result); + } else { + return []; + } } - getCollectRow(condition: string) { + getCollectRow(condition: string): TraceRow | null { return this.rootEl!.querySelector>(condition); } @@ -154,24 +161,24 @@ export class SpChartList extends BaseElement { return [...this.collectRowList1, ...this.collectRowList2]; } - getAllSelectCollectRows(): Array>{ + getAllSelectCollectRows(): Array> { const rows: Array> = []; - for(const row of this.collectRowList1){ - if (row.checkType === '2'){ + for (const row of this.collectRowList1) { + if (row.checkType === '2') { rows.push(row); } } - for(const row of this.collectRowList2){ - if (row.checkType === '2'){ + for (const row of this.collectRowList2) { + if (row.checkType === '2') { rows.push(row); } } return rows; } - insertRowBefore(node: Node, child: Node) { + insertRowBefore(node: Node, child: Node): void { if (child === null || (child as TraceRow).collectGroup === (node as TraceRow).collectGroup) { - if ((node as TraceRow).collectGroup === '1') { + if ((node as TraceRow).collectGroup === SpChartList.COLLECT_G1) { this.collectEl1!.insertBefore(node, child); this.collectRowList1 = Array.from(this.collectEl1!.children) as TraceRow[]; } else { @@ -181,7 +188,7 @@ export class SpChartList extends BaseElement { } } - reset() { + reset(): void { this.maxHeight = 0; this.style.height = 'auto'; this.clearRect(); @@ -204,15 +211,15 @@ export class SpChartList extends BaseElement { }); } - context() { + context(): CanvasRenderingContext2D | undefined | null { return this.canvasCtx; } - getCanvas() { + getCanvas(): HTMLCanvasElement | null | undefined { return this.canvas; } - connectedCallback() { + connectedCallback(): void { super.connectedCallback(); window.addEventListener('mousedown', this.onMouseDown); window.addEventListener('mouseup', this.onMouseUp); @@ -220,7 +227,7 @@ export class SpChartList extends BaseElement { this.addEventListener('scroll', this.onScroll, { passive: true }); } - disconnectedCallback() { + disconnectedCallback(): void { super.disconnectedCallback(); window.removeEventListener('mousedown', this.onMouseDown); window.removeEventListener('mouseup', this.onMouseUp); @@ -228,7 +235,7 @@ export class SpChartList extends BaseElement { this.removeEventListener('scroll', this.onScroll); } - onScroll = (ev: Event) => { + onScroll = (ev: Event): void => { this.canvas!.style.transform = `translateY(${this.scrollTop}px)`; if (this.scrollTimer) { clearTimeout(this.scrollTimer); @@ -240,13 +247,13 @@ export class SpChartList extends BaseElement { window.publish(window.SmartEvent.UI.RefreshCanvas, {}); }; - onMouseDown = (ev: MouseEvent) => { + onMouseDown = (ev: MouseEvent): void => { this.isPress = true; this.startPageY = ev.pageY; this.startClientHeight = this.clientHeight; if (this.containPoint(ev)) { if ( - this.getBoundingClientRect().bottom > ev.pageY - mouseMoveRange&& + this.getBoundingClientRect().bottom > ev.pageY - mouseMoveRange && this.getBoundingClientRect().bottom < ev.pageY + mouseMoveRange ) { this.style.cursor = 'row-resize'; @@ -258,7 +265,7 @@ export class SpChartList extends BaseElement { } }; - onMouseMove = (ev: MouseEvent) => { + onMouseMove = (ev: MouseEvent): void => { if (this.containPoint(ev)) { if ( this.getBoundingClientRect().bottom > ev.pageY - mouseMoveRange && @@ -280,10 +287,10 @@ export class SpChartList extends BaseElement { if (newHeight > this.maxHeight || newHeight > this.getMaxLimitHeight() || newHeight < minHeight) { // 超出最大最小高度时触发mouseup事件 const mouseUpEvent = new MouseEvent('mouseup', { - bubbles: true, - cancelable: true, + bubbles: true, + cancelable: true, view: window, - button: 0, + button: 0, buttons: 0, clientX: ev.clientX, // 鼠标在窗口中的水平坐标 clientY: ev.clientY, // 鼠标在窗口中的垂直坐标 @@ -302,17 +309,23 @@ export class SpChartList extends BaseElement { } }; - onMouseUp = (ev: MouseEvent) => { + onMouseUp = (ev: MouseEvent): void => { this.isPress = false; this.canResize = false; (window as any).rowResize = false; this.refreshFavoriteCanvas(); }; - insertRow(row: TraceRow, group: string, updateGroup: boolean) { + insertRow(row: TraceRow, group: string, updateGroup: boolean): void { this.style.display = 'flex'; let collectGroup = !updateGroup && row.collectGroup ? row.collectGroup : group; - if (collectGroup === '1') { + if (row.collectGroup !== SpChartList.COLLECT_G1 && row.collectGroup !== SpChartList.COLLECT_G2) { + row.collectGroup = group; + } + if (updateGroup) { + row.collectGroup = group; + } + if (collectGroup === SpChartList.COLLECT_G1) { if (!this.collect1Expand) { this.collect1Expand = true; this.icon1!.style.transform = 'rotateZ(0deg)'; @@ -337,9 +350,6 @@ export class SpChartList extends BaseElement { } this.collectEl2!.appendChild(this.fragmentGroup2); } - if (updateGroup) { - row.collectGroup = group; - } this.updateGroupDisplay(); this.resizeHeight(); this.scrollTo({ top: this.scrollHeight }); @@ -347,8 +357,8 @@ export class SpChartList extends BaseElement { row.currentContext = this.canvasCtx; } - deleteRow(row: TraceRow, clearCollectGroup: boolean) { - if (row.collectGroup === '1') { + deleteRow(row: TraceRow, clearCollectGroup: boolean): void { + if (row.collectGroup === SpChartList.COLLECT_G1) { this.collectRowList1.splice(this.collectRowList1.indexOf(row), 1); if (!this.fragmentGroup1.contains(row)) { this.fragmentGroup1.appendChild(row); @@ -376,20 +386,24 @@ export class SpChartList extends BaseElement { } } - updateGroupDisplay() { + updateGroupDisplay(): void { this.groupTitle1!.style.display = this.collectRowList1.length === 0 ? 'none' : 'flex'; this.groupTitle2!.style.display = this.collectRowList2.length === 0 ? 'none' : 'flex'; } - clearRect() { + clearRect(): void { this.canvasCtx?.clearRect(0, 0, this.canvas?.clientWidth ?? 0, this.canvas?.clientHeight ?? 0); } - drawLines(xs: number[] | undefined, color: string) { + drawLines(xs: number[] | undefined, color: string): void { drawLines(this.canvasCtx!, xs ?? [], this.clientHeight, color); } - drawFlagLineSegment(hoverFlag: Flag | undefined | null, selectFlag: Flag | undefined | null, tse: TimerShaftElement) { + drawFlagLineSegment( + hoverFlag: Flag | undefined | null, + selectFlag: Flag | undefined | null, + tse: TimerShaftElement + ): void { drawFlagLineSegment( this.canvasCtx, hoverFlag, @@ -404,7 +418,7 @@ export class SpChartList extends BaseElement { ); } - drawWakeUp() { + drawWakeUp(): void { drawWakeUp( this.canvasCtx, CpuStruct.wakeupBean, @@ -420,7 +434,7 @@ export class SpChartList extends BaseElement { ); } - drawWakeUpList(bean: WakeupBean) { + drawWakeUpList(bean: WakeupBean): void { drawWakeUpList(this.canvasCtx, bean, TraceRow.range!.startNS, TraceRow.range!.endNS, TraceRow.range!.totalNS, { x: 0, y: 0, @@ -428,7 +442,8 @@ export class SpChartList extends BaseElement { height: this.canvas!.clientHeight!, } as Rect); } - drawLogsLineSegment(bean: Flag | null | undefined, timeShaft: TimerShaftElement) { + + drawLogsLineSegment(bean: Flag | null | undefined, timeShaft: TimerShaftElement): void { drawLogsLineSegment( this.canvasCtx, bean, @@ -442,11 +457,11 @@ export class SpChartList extends BaseElement { ); } - drawLinkLines(nodes: PairPoint[][], tse: TimerShaftElement, isFavorite: boolean, favoriteHeight: number) { + drawLinkLines(nodes: PairPoint[][], tse: TimerShaftElement, isFavorite: boolean, favoriteHeight: number): void { drawLinkLines(this.canvasCtx!, nodes, tse, isFavorite, favoriteHeight); } - refreshFavoriteCanvas() { + refreshFavoriteCanvas(): void { this.canvas!.style.width = `${this.clientWidth - 248}px`; this.canvas!.style.left = `248px`; this.canvas!.width = this.canvas?.clientWidth! * dpr(); diff --git a/ide/src/trace/component/trace/TimerShaftElement.ts b/ide/src/trace/component/trace/TimerShaftElement.ts index 2838dfd42c5d6cc84826bc90a4fdfe86774287a3..cc618b7c1b3ca019a74266d0eab1de82579755a9 100644 --- a/ide/src/trace/component/trace/TimerShaftElement.ts +++ b/ide/src/trace/component/trace/TimerShaftElement.ts @@ -23,8 +23,8 @@ import { Flag } from './timer-shaft/Flag.js'; import { info } from '../../../log/Log.js'; import { TraceSheet } from './base/TraceSheet.js'; import { SelectionParam } from '../../bean/BoxSelection.js'; -import { SpSystemTrace, CurrentSlicesTime } from '../SpSystemTrace.js'; -import './timer-shaft/CollapseButton.js' +import { type SpSystemTrace, CurrentSlicesTime } from '../SpSystemTrace.js'; +import './timer-shaft/CollapseButton.js'; //随机生成十六位进制颜色 export function randomRgbColor() { const letters = '0123456789ABCDEF'; @@ -76,7 +76,7 @@ export function ns2UnitS(ns: number, scale: number): string { return result; } -export function ns2x(ns: number, startNS: number, endNS: number, duration: number, rect: Rect) { +export function ns2x(ns: number, startNS: number, endNS: number, duration: number, rect: Rect): number { if (endNS == 0) { endNS = duration; } @@ -228,7 +228,7 @@ export class TimerShaftElement extends BaseElement { return this._rangeRuler; } - connectedCallback() { + connectedCallback(): RangeRuler | undefined { if (this.canvas) { if (this.isOffScreen) { // @ts-ignore @@ -299,7 +299,7 @@ export class TimerShaftElement extends BaseElement { this.timeRuler.frame.width = width; } - setRangeNS(startNS: number, endNS: number) { + setRangeNS(startNS: number, endNS: number): void { info('set startNS values :' + startNS + 'endNS values : ' + endNS); this._rangeRuler?.setRangeNS(startNS, endNS); } @@ -308,7 +308,7 @@ export class TimerShaftElement extends BaseElement { return this._rangeRuler?.getRange(); } - updateWidth(width: number) { + updateWidth(width: number): void { this.dpr = window.devicePixelRatio || 1; this.canvas!.width = width - (this.totalEL?.clientWidth || 0); this.canvas!.height = this.shadowRoot!.host.clientHeight || 0; @@ -327,18 +327,18 @@ export class TimerShaftElement extends BaseElement { this.render(); } - documentOnMouseDown = (ev: MouseEvent) => { + documentOnMouseDown = (ev: MouseEvent): void => { if ((window as any).isSheetMove) return; this._rangeRuler?.mouseDown(ev); }; - documentOnMouseUp = (ev: MouseEvent) => { + documentOnMouseUp = (ev: MouseEvent): void => { if ((window as any).isSheetMove) return; this._rangeRuler?.mouseUp(ev); this.sportRuler?.mouseUp(ev); }; - documentOnMouseMove = (ev: MouseEvent, trace: SpSystemTrace) => { + documentOnMouseMove = (ev: MouseEvent, trace: SpSystemTrace): void => { trace.style.cursor = 'default'; let x = ev.offsetX - (this.canvas?.offsetLeft || 0); // 鼠标的x轴坐标 let y = ev.offsetY; // 鼠标的y轴坐标 @@ -358,33 +358,33 @@ export class TimerShaftElement extends BaseElement { } }; - documentOnMouseOut = (ev: MouseEvent) => { + documentOnMouseOut = (ev: MouseEvent): void => { this._rangeRuler?.mouseOut(ev); this.sportRuler?.mouseOut(ev); }; - documentOnKeyPress = (ev: KeyboardEvent, currentSlicesTime?: CurrentSlicesTime) => { + documentOnKeyPress = (ev: KeyboardEvent, currentSlicesTime?: CurrentSlicesTime): void => { if ((window as any).isSheetMove) return; if ((window as any).flagInputFocus) return; this._rangeRuler?.keyPress(ev, currentSlicesTime); this.sportRuler?.clearHoverFlag(); }; - documentOnKeyUp = (ev: KeyboardEvent) => { + documentOnKeyUp = (ev: KeyboardEvent): void => { if ((window as any).isSheetMove) return; if ((window as any).flagInputFocus) return; this._rangeRuler?.keyUp(ev); }; - disconnectedCallback() {} + disconnectedCallback(): void { } firstRender = true; - lineColor() { + lineColor(): string { return window.getComputedStyle(this.canvas!, null).getPropertyValue('color'); } - render() { + render(): void { this.dpr = window.devicePixelRatio || 1; if (this.ctx) { this.ctx.fillStyle = 'transparent'; @@ -419,30 +419,30 @@ export class TimerShaftElement extends BaseElement { } } - modifyFlagList(flag: Flag | null | undefined) { + modifyFlagList(flag: Flag | null | undefined): void { this._sportRuler?.modifyFlagList(flag); } - modifySlicesList(slicestime: SlicesTime | null | undefined) { + modifySlicesList(slicestime: SlicesTime | null | undefined): void { this._sportRuler?.modifySicesTimeList(slicestime); } - cancelPressFrame() { + cancelPressFrame(): void { this._rangeRuler?.cancelPressFrame(); } - cancelUpFrame() { + cancelUpFrame(): void { this._rangeRuler?.cancelUpFrame(); } - stopWASD(ev: any) { + stopWASD(ev: any): void { this._rangeRuler?.keyUp(ev); } - drawTriangle(time: number, type: string) { + drawTriangle(time: number, type: string): number | undefined { return this._sportRuler?.drawTriangle(time, type); } - removeTriangle(type: string) { + removeTriangle(type: string): void { this._sportRuler?.removeTriangle(type); } @@ -467,7 +467,7 @@ export class TimerShaftElement extends BaseElement { return sliceTime; } - displayCollect(showCollect: boolean) { + displayCollect(showCollect: boolean): void { if (showCollect) { this.collecBtn!.style.display = 'flex'; } else { diff --git a/ide/src/trace/component/trace/base/CommonSql.ts b/ide/src/trace/component/trace/base/CommonSql.ts index 5685b998d47ed85e60a1980b5d10ae642cf80383..9b9de777a64fe9872dcaac8ae8681841b22e24c0 100644 --- a/ide/src/trace/component/trace/base/CommonSql.ts +++ b/ide/src/trace/component/trace/base/CommonSql.ts @@ -13,189 +13,260 @@ * limitations under the License. */ -const cpuSql: Array = [{ - sql: 'SELECT B.pid AS processId,B.cpu,B.tid,B.itid AS id,B.dur,B.ts - TR.start_ts AS startTime,B.arg_setid AS ' + - 'argSetID FROM thread_state AS B LEFT JOIN trace_range AS TR WHERE B.itid IS NOT NULL;', - title: 'Cpu chart' -},{ - sql: 'SELECT cpu,value,IFNULL(dur,tb.end_ts - c.ts) dur,ts-tb.start_ts AS startNS FROM measure c,trace_range tb ' + - 'INNER JOIN cpu_measure_filter t ON c.filter_id = t.id WHERE (name = \'cpufreq\' OR name=\'cpu_frequency\');', - title: 'Cpu Frequency chart' -},{ - sql: 'SELECT (A.ts - B.start_ts) AS startTs,IFNULL(dur,B.end_ts - A.ts) dur,value FROM measure A,trace_range B;', - title: 'Cpu State chart' -},{ - sql: 'SELECT ts - T.start_ts AS startNs,dur,max(value) AS max,min(value) AS min FROM measure,trace_range ' + - 'T GROUP BY ts;', - title: 'Cpu Freq Limit chart' -},{ - sql: 'SELECT TS.pid AS pid,TS.tid AS tid,TS.cpu,SUM((TS.ts - TR.start_ts + TS.dur) - (TS.ts - TR.start_ts)) ' + - 'wallDuration,count(TS.tid) AS occurrences FROM thread_state AS TS LEFT JOIN trace_range AS TR GROUP BY TS.cpu,' + - 'TS.pid,TS.tid ORDER BY wallDuration DESC;', - title: 'CPU By Thread table' -},{ - sql: 'SELECT B.pid AS pid, SUM(B.dur) AS wallDuration,AVG(B.dur) AS avgDuration,count(B.tid) AS occurrences FROM ' + - 'thread_state AS B LEFT JOIN trace_range AS TR GROUP BY B.pid ORDER BY wallDuration DESC;', - title: 'CPU By Process table' -},{ - sql: 'SELECT cpu,SUM(A.dur) / CAST(B.end_ts - B.start_ts AS float) AS usage FROM thread_state A,trace_range B ' + - 'WHERE (A.ts - B.start_ts) > 0 AND A.dur > 0 GROUP BY cpu;', - title: 'CPU Usage table' -},{ - sql: 'SELECT B.pid,B.tid,B.state,SUM(B.dur) AS wallDuration,AVG(IFNULL(B.dur,0)) AS ' + - 'avgDuration,count(B.tid) AS occurrences FROM thread_state AS B LEFT JOIN trace_range AS TR ' + - 'GROUP BY B.pid, B.tid, B.state ORDER BY wallDuration DESC;', - title: 'Thread States table' -},{ - sql: 'SELECT value, filter_id AS filterId, ts, f.cpu FROM measure LEFT JOIN cpu_measure_filter AS f ON ' + - 'f.id=filter_id ORDER BY ts ASC;', - title: 'Cpu State/Cpu Frequency table' -}]; +const cpuSql: Array = [ + { + sql: + 'SELECT B.pid AS processId,B.cpu,B.tid,B.itid AS id,B.dur,B.ts - TR.start_ts AS startTime,B.arg_setid AS ' + + 'argSetID FROM thread_state AS B LEFT JOIN trace_range AS TR WHERE B.itid IS NOT NULL;', + title: 'Cpu chart', + }, + { + sql: + 'SELECT cpu,value,IFNULL(dur,tb.end_ts - c.ts) dur,ts-tb.start_ts AS startNS FROM measure c,trace_range tb ' + + "INNER JOIN cpu_measure_filter t ON c.filter_id = t.id WHERE (name = 'cpufreq' OR name='cpu_frequency');", + title: 'Cpu Frequency chart', + }, + { + sql: 'SELECT (A.ts - B.start_ts) AS startTs,IFNULL(dur,B.end_ts - A.ts) dur,value FROM measure A,trace_range B;', + title: 'Cpu State chart', + }, + { + sql: + 'SELECT ts - T.start_ts AS startNs,dur,max(value) AS max,min(value) AS min FROM measure,trace_range ' + + 'T GROUP BY ts;', + title: 'Cpu Freq Limit chart', + }, + { + sql: + 'SELECT TS.pid AS pid,TS.tid AS tid,TS.cpu,SUM((TS.ts - TR.start_ts + TS.dur) - (TS.ts - TR.start_ts)) ' + + 'wallDuration,count(TS.tid) AS occurrences FROM thread_state AS TS LEFT JOIN trace_range AS TR GROUP BY TS.cpu,' + + 'TS.pid,TS.tid ORDER BY wallDuration DESC;', + title: 'CPU By Thread table', + }, + { + sql: + 'SELECT B.pid AS pid, SUM(B.dur) AS wallDuration,AVG(B.dur) AS avgDuration,count(B.tid) AS occurrences FROM ' + + 'thread_state AS B LEFT JOIN trace_range AS TR GROUP BY B.pid ORDER BY wallDuration DESC;', + title: 'CPU By Process table', + }, + { + sql: + 'SELECT cpu,SUM(A.dur) / CAST(B.end_ts - B.start_ts AS float) AS usage FROM thread_state A,trace_range B ' + + 'WHERE (A.ts - B.start_ts) > 0 AND A.dur > 0 GROUP BY cpu;', + title: 'CPU Usage table', + }, + { + sql: + 'SELECT B.pid,B.tid,B.state,SUM(B.dur) AS wallDuration,AVG(IFNULL(B.dur,0)) AS ' + + 'avgDuration,count(B.tid) AS occurrences FROM thread_state AS B LEFT JOIN trace_range AS TR ' + + 'GROUP BY B.pid, B.tid, B.state ORDER BY wallDuration DESC;', + title: 'Thread States table', + }, + { + sql: + 'SELECT value, filter_id AS filterId, ts, f.cpu FROM measure LEFT JOIN cpu_measure_filter AS f ON ' + + 'f.id=filter_id ORDER BY ts ASC;', + title: 'Cpu State/Cpu Frequency table', + }, +]; -const threadSql: Array = [{ - sql: 'SELECT ta.cpu,dur, ts-TR.start_ts AS startTime FROM thread_state ta LEFT JOIN trace_range AS TR ' + - 'WHERE ta.cpu IS NOT NULL;', - title: 'Process chart' -}]; +const threadSql: Array = [ + { + sql: + 'SELECT ta.cpu,dur, ts-TR.start_ts AS startTime FROM thread_state ta LEFT JOIN trace_range AS TR ' + + 'WHERE ta.cpu IS NOT NULL;', + title: 'Process chart', + }, +]; -const memory: Array = [{ - sql: 'SELECT startNs, SUM( value ) AS value FROM ( SELECT m.ts - tr.start_ts AS startNs,SUM( m.value ) AS value ' + - 'FROM sys_mem_measure m,trace_range tr LEFT JOIN sys_event_filter f ON f.id = m.filter_id WHERE m.ts < tr.end_ts ' + - 'GROUP BY m.ts UNION ALL SELECT a.ts - tr.start_ts AS startNs,SUM( a.size ) AS value FROM memory_ashmem a,' + - 'trace_range tr WHERE a.ts < tr.end_ts AND a.flag = 0 GROUP BY a.ts) GROUP BY startNs;', - title: 'Ability Monitor purgeable chart' -},{ - sql: 'SELECT (A.ts - B.start_ts) AS startNs,SUM(A.size) AS value,E.data AS expTaskComm, A.flag AS flag ' + - 'FROM memory_dma A,trace_range B LEFT JOIN data_dict AS E ON E.id=A.exp_task_comm_id WHERE A.flag = 0 ' + - 'AND A.ts < B.end_ts GROUP BY A.ts;', - title: 'Ability Monitor DMA chart' -},{ - sql: 'SELECT (A.ts - B.start_ts) AS startNs, SUM(A.used_gpu_size) AS value FROM memory_process_gpu A,trace_range B ' + - 'WHERE A.ts < B.end_ts GROUP BY A.ts;', - title: 'Ability Monitor gpu memory chart' -},{ - sql: 'SELECT (A.timestamp - B.start_ts) AS startNs, SUM(dirty) * 1024 AS value, \'dirty\' AS name ' + - 'FROM smaps A,trace_range B WHERE A.timestamp < B.end_ts GROUP BY A.timestamp;', - title: 'VM Tracker Smaps chart(dirty)' -},{ - sql: 'SELECT (A.timestamp - B.start_ts) AS startNs, SUM(swapped) * 1024 AS value, \'swapped\' AS name ' + - 'FROM smaps A,trace_range B WHERE A.timestamp < B.end_ts GROUP BY A.timestamp;', - title: 'VM Tracker Smaps chart(swapped)' -},{ - sql: 'SELECT (A.timestamp - B.start_ts) AS startNs, SUM(resident_size) * 1024 AS value, \'resident_size\' AS name ' + - 'FROM smaps A,trace_range B WHERE A.timestamp < B.end_ts GROUP BY A.timestamp;', - title: 'VM Tracker Smaps chart(resident_size)' -},{ - sql: 'SELECT (A.timestamp - B.start_ts) AS startNs, SUM(pss) * 1024 AS value, \'pss\' AS name ' + - 'FROM smaps A,trace_range B WHERE A.timestamp < B.end_ts GROUP BY A.timestamp;', - title: 'VM Tracker Smaps chart(pss)' -},{ - sql: 'SELECT (A.timestamp - B.start_ts) AS startNs, SUM(private_clean + private_dirty) * 1024 AS value,' + - '\'private_clean + private_dirty\' AS name FROM smaps A,trace_range B WHERE A.timestamp ' + - '< B.end_ts GROUP BY A.timestamp;', - title: 'VM Tracker Smaps chart(private_clean + private_dirty)' -},{ - sql: 'SELECT (A.ts - B.start_ts) AS startNs,SUM(A.size) AS value FROM memory_ashmem A,trace_range B ' + - 'WHERE A.ts < B.end_ts AND flag = 0 GROUP BY A.ts;', - title: 'VM Tracker SHM chart' -},{ - sql: 'SELECT (A.ts - B.start_ts) AS startNs,SUM(A.size) AS value,A.flag AS flag,A.ipid AS ipid,E.data AS ' + - 'expTaskComm FROM memory_dma A,trace_range B LEFT JOIN data_dict AS E ON E.id=A.exp_task_comm_id ' + - 'WHERE A.flag = 0 AND A.ts < B.end_ts GROUP BY A.ts;', - title: 'VM Tracker Dma chart' -},{ - sql: 'SELECT startNs, SUM( value ) AS value FROM (SELECT m.ts - tr.start_ts AS startNs,SUM(m.value) AS value ' + - 'FROM process_measure m, trace_range tr LEFT JOIN process_measure_filter f ON f.id = m.filter_id ' + - 'WHERE m.ts < tr.end_ts GROUP BY m.ts UNION ALL SELECT a.ts - tr.start_ts AS startNs,SUM( a.pss ) AS value ' + - 'FROM memory_ashmem a,trace_range tr WHERE a.ts < tr.end_ts AND a.flag = 0 GROUP BY a.ts) GROUP BY startNs;', - title: 'VM Tracker purgeable chart' -},{ - sql: 'SELECT (ts - start_ts) startNs,SUM(value) value FROM process_measure, trace_range ' + - 'WHERE filter_id = (SELECT id FROM process_measure_filter WHERE name = \'mem.gl_pss\')AND ts ' + - 'BETWEEN start_ts AND end_ts GROUP BY ts;', - title: 'VM Tracker gpu GL chart' -},{ - sql: 'SELECT (A.ts - B.start_ts) AS startNs,SUM(A.used_gpu_size) AS value,A.ipid AS ipid ' + - 'FROM memory_process_gpu A,trace_range B WHERE A.ts < B.end_ts GROUP BY A.ts;', - title: 'VM Tracker gpu memory chart' -},{ - sql: 'SELECT DISTINCT module_name_id id,data FROM memory_window_gpu A, trace_range TR LEFT JOIN data_dict B ' + - 'ON A.module_name_id = B.id WHERE window_name_id = 0 AND A.ts < TR.end_ts;', - title: 'VM Tracker gpu total type chart' -},{ - sql: 'SELECT DISTINCT A.window_name_id AS id,B.data, NULL AS pid FROM memory_window_gpu A, trace_range tr ' + - 'LEFT JOIN data_dict B ON A.window_name_id = B.id WHERE window_name_id != 0 AND A.ts < tr.end_ts UNION ALL ' + - 'SELECT DISTINCT A.module_name_id id, B.data, A.window_name_id pid FROM memory_window_gpu A, trace_range TR ' + - 'LEFT JOIN data_dict B ON A.module_name_id = B.id WHERE window_name_id != 0 AND A.ts < TR.end_ts;', - title: 'VM Tracker gpu window type chart' -}]; +const memory: Array = [ + { + sql: + 'SELECT startNs, SUM( value ) AS value FROM ( SELECT m.ts - tr.start_ts AS startNs,SUM( m.value ) AS value ' + + 'FROM sys_mem_measure m,trace_range tr LEFT JOIN sys_event_filter f ON f.id = m.filter_id WHERE m.ts < tr.end_ts ' + + 'GROUP BY m.ts UNION ALL SELECT a.ts - tr.start_ts AS startNs,SUM( a.size ) AS value FROM memory_ashmem a,' + + 'trace_range tr WHERE a.ts < tr.end_ts AND a.flag = 0 GROUP BY a.ts) GROUP BY startNs;', + title: 'Ability Monitor purgeable chart', + }, + { + sql: + 'SELECT (A.ts - B.start_ts) AS startNs,SUM(A.size) AS value,E.data AS expTaskComm, A.flag AS flag ' + + 'FROM memory_dma A,trace_range B LEFT JOIN data_dict AS E ON E.id=A.exp_task_comm_id WHERE A.flag = 0 ' + + 'AND A.ts < B.end_ts GROUP BY A.ts;', + title: 'Ability Monitor DMA chart', + }, + { + sql: + 'SELECT (A.ts - B.start_ts) AS startNs, SUM(A.used_gpu_size) AS value FROM memory_process_gpu A,trace_range B ' + + 'WHERE A.ts < B.end_ts GROUP BY A.ts;', + title: 'Ability Monitor gpu memory chart', + }, + { + sql: + "SELECT (A.timestamp - B.start_ts) AS startNs, SUM(dirty) * 1024 AS value, 'dirty' AS name " + + 'FROM smaps A,trace_range B WHERE A.timestamp < B.end_ts GROUP BY A.timestamp;', + title: 'VM Tracker Smaps chart(dirty)', + }, + { + sql: + "SELECT (A.timestamp - B.start_ts) AS startNs, SUM(swapped) * 1024 AS value, 'swapped' AS name " + + 'FROM smaps A,trace_range B WHERE A.timestamp < B.end_ts GROUP BY A.timestamp;', + title: 'VM Tracker Smaps chart(swapped)', + }, + { + sql: + "SELECT (A.timestamp - B.start_ts) AS startNs, SUM(resident_size) * 1024 AS value, 'resident_size' AS name " + + 'FROM smaps A,trace_range B WHERE A.timestamp < B.end_ts GROUP BY A.timestamp;', + title: 'VM Tracker Smaps chart(resident_size)', + }, + { + sql: + "SELECT (A.timestamp - B.start_ts) AS startNs, SUM(pss) * 1024 AS value, 'pss' AS name " + + 'FROM smaps A,trace_range B WHERE A.timestamp < B.end_ts GROUP BY A.timestamp;', + title: 'VM Tracker Smaps chart(pss)', + }, + { + sql: + 'SELECT (A.timestamp - B.start_ts) AS startNs, SUM(private_clean + private_dirty) * 1024 AS value,' + + "'private_clean + private_dirty' AS name FROM smaps A,trace_range B WHERE A.timestamp " + + '< B.end_ts GROUP BY A.timestamp;', + title: 'VM Tracker Smaps chart(private_clean + private_dirty)', + }, + { + sql: + 'SELECT (A.ts - B.start_ts) AS startNs,SUM(A.size) AS value FROM memory_ashmem A,trace_range B ' + + 'WHERE A.ts < B.end_ts AND flag = 0 GROUP BY A.ts;', + title: 'VM Tracker SHM chart', + }, + { + sql: + 'SELECT (A.ts - B.start_ts) AS startNs,SUM(A.size) AS value,A.flag AS flag,A.ipid AS ipid,E.data AS ' + + 'expTaskComm FROM memory_dma A,trace_range B LEFT JOIN data_dict AS E ON E.id=A.exp_task_comm_id ' + + 'WHERE A.flag = 0 AND A.ts < B.end_ts GROUP BY A.ts;', + title: 'VM Tracker Dma chart', + }, + { + sql: + 'SELECT startNs, SUM( value ) AS value FROM (SELECT m.ts - tr.start_ts AS startNs,SUM(m.value) AS value ' + + 'FROM process_measure m, trace_range tr LEFT JOIN process_measure_filter f ON f.id = m.filter_id ' + + 'WHERE m.ts < tr.end_ts GROUP BY m.ts UNION ALL SELECT a.ts - tr.start_ts AS startNs,SUM( a.pss ) AS value ' + + 'FROM memory_ashmem a,trace_range tr WHERE a.ts < tr.end_ts AND a.flag = 0 GROUP BY a.ts) GROUP BY startNs;', + title: 'VM Tracker purgeable chart', + }, + { + sql: + 'SELECT (ts - start_ts) startNs,SUM(value) value FROM process_measure, trace_range ' + + "WHERE filter_id = (SELECT id FROM process_measure_filter WHERE name = 'mem.gl_pss')AND ts " + + 'BETWEEN start_ts AND end_ts GROUP BY ts;', + title: 'VM Tracker gpu GL chart', + }, + { + sql: + 'SELECT (A.ts - B.start_ts) AS startNs,SUM(A.used_gpu_size) AS value,A.ipid AS ipid ' + + 'FROM memory_process_gpu A,trace_range B WHERE A.ts < B.end_ts GROUP BY A.ts;', + title: 'VM Tracker gpu memory chart', + }, + { + sql: + 'SELECT DISTINCT module_name_id id,data FROM memory_window_gpu A, trace_range TR LEFT JOIN data_dict B ' + + 'ON A.module_name_id = B.id WHERE window_name_id = 0 AND A.ts < TR.end_ts;', + title: 'VM Tracker gpu total type chart', + }, + { + sql: + 'SELECT DISTINCT A.window_name_id AS id,B.data, NULL AS pid FROM memory_window_gpu A, trace_range tr ' + + 'LEFT JOIN data_dict B ON A.window_name_id = B.id WHERE window_name_id != 0 AND A.ts < tr.end_ts UNION ALL ' + + 'SELECT DISTINCT A.module_name_id id, B.data, A.window_name_id pid FROM memory_window_gpu A, trace_range TR ' + + 'LEFT JOIN data_dict B ON A.module_name_id = B.id WHERE window_name_id != 0 AND A.ts < TR.end_ts;', + title: 'VM Tracker gpu window type chart', + }, +]; -const bioSql: Array = [{ - sql: 'SELECT name,B.ipid,pid FROM (SELECT DISTINCT ipid FROM bio_latency_sample A,trace_range B WHERE A.start_ts ' + - 'BETWEEN B.start_ts AND B.end_ts) A LEFT JOIN process B ON A.ipid = B.ipid;', - title: 'Disk IO process chart' -}, { - sql: 'SELECT (A.start_ts -B.start_ts) AS startNS,(A.start_ts - B.start_ts + A.latency_dur) AS endNS,latency_dur ' + - 'AS dur FROM bio_latency_sample A,trace_range B WHERE startNS > 0 ORDER BY A.start_ts;', - title: 'Disk IO latency chart' -}]; +const bioSql: Array = [ + { + sql: + 'SELECT name,B.ipid,pid FROM (SELECT DISTINCT ipid FROM bio_latency_sample A,trace_range B WHERE A.start_ts ' + + 'BETWEEN B.start_ts AND B.end_ts) A LEFT JOIN process B ON A.ipid = B.ipid;', + title: 'Disk IO process chart', + }, + { + sql: + 'SELECT (A.start_ts -B.start_ts) AS startNS,(A.start_ts - B.start_ts + A.latency_dur) AS endNS,latency_dur ' + + 'AS dur FROM bio_latency_sample A,trace_range B WHERE startNS > 0 ORDER BY A.start_ts;', + title: 'Disk IO latency chart', + }, +]; -const frameTimeSql: Array = [{ - sql: 'SELECT sf.id,\'frameTime\' AS frame_type,fs.ipid,fs.vsync AS name,fs.dur AS app_dur,(sf.ts + sf.dur - fs.ts) ' + - 'AS dur,(fs.ts - TR.start_ts) AS ts,fs.type,fs.flag,pro.pid,pro.name AS cmdline,(sf.ts - TR.start_ts) AS rs_ts,' + - 'sf.vsync AS rs_vsync,sf.dur AS rs_dur,sf.ipid AS rs_ipid,proc.pid AS rs_pid,proc.name AS rs_name FROM ' + - 'frame_slice AS fs LEFT JOIN process AS pro ON pro.id = fs.ipid LEFT JOIN frame_slice AS sf ON fs.dst = sf.id ' + - 'LEFT JOIN process AS proc ON proc.id = sf.ipid LEFT JOIN trace_range TR WHERE fs.dst IS NOT NULL AND fs.type ' + - '= 1 UNION SELECT -1 AS id,\'frameTime\' AS frame_type,fs.ipid,fs.vsync AS name,fs.dur AS app_dur,fs.dur,' + - '(fs.ts - TR.start_ts) AS ts,fs.type,fs.flag, pro.pid,pro.name AS cmdline,NULL AS rs_ts,NULL AS rs_vsync,' + - 'NULL AS rs_dur,NULL AS rs_ipid,NULL AS rs_pid,NULL AS rs_name FROM frame_slice AS fs LEFT JOIN process AS pro' + - ' ON pro.id = fs.ipid LEFT JOIN trace_range TR WHERE fs.dst IS NULL AND pro.name NOT LIKE \'%render_service%\' ' + - 'AND fs.type = 1 ORDER BY ts;', - title: 'Expected timeline chart' -}, { - sql: 'SELECT sf.id,\'frameTime\' AS frame_type,fs.ipid,fs.vsync AS name,fs.dur AS app_dur,(sf.ts + sf.dur - fs.ts) ' + - 'AS dur,(fs.ts - TR.start_ts) AS ts,fs.type,(CASE WHEN (sf.flag == 1 OR fs.flag == 1) THEN 1 WHEN (sf.flag == ' + - '3 OR fs.flag == 3 ) THEN 3 ELSE 0 end) AS jank_tag,pro.pid,pro.name AS cmdline,(sf.ts - TR.start_ts) ' + - 'AS rs_ts,sf.vsync AS rs_vsync,sf.dur AS rs_dur,sf.ipid AS rs_ipid,proc.pid AS rs_pid, proc.name AS rs_name ' + - 'FROM frame_slice AS fs LEFT JOIN process AS pro ON pro.id = fs.ipid LEFT JOIN frame_slice AS sf ON fs.dst = ' + - 'sf.id LEFT JOIN process AS proc ON proc.id = sf.ipid LEFT JOIN trace_range TR WHERE fs.dst IS NOT NULL AND ' + - 'fs.type = 0 AND fs.flag <> 2 UNION SELECT -1 AS id,\'frameTime\' AS frame_type,fs.ipid,fs.vsync AS name,' + - 'fs.dur AS app_dur,fs.dur,(fs.ts - TR.start_ts) AS ts,fs.type,fs.flag AS jank_tag,pro.pid,pro.name AS ' + - 'cmdline,NULL AS rs_ts,NULL AS rs_vsync,NULL AS rs_dur,NULL AS rs_ipid,NULL AS rs_pid,NULL AS rs_name FROM ' + - 'frame_slice AS fs LEFT JOIN process AS pro ON pro.id = fs.ipid LEFT JOIN trace_range TR WHERE fs.dst IS NULL ' + - 'AND pro.name NOT LIKE \'%render_service%\' AND fs.type = 0 AND fs.flag <> 2 ORDER BY ts;', - title: 'Actual timeline chart' -}]; +const frameTimeSql: Array = [ + { + sql: + "SELECT sf.id,'frameTime' AS frame_type,fs.ipid,fs.vsync AS name,fs.dur AS app_dur,(sf.ts + sf.dur - fs.ts) " + + 'AS dur,(fs.ts - TR.start_ts) AS ts,fs.type,fs.flag,pro.pid,pro.name AS cmdline,(sf.ts - TR.start_ts) AS rs_ts,' + + 'sf.vsync AS rs_vsync,sf.dur AS rs_dur,sf.ipid AS rs_ipid,proc.pid AS rs_pid,proc.name AS rs_name FROM ' + + 'frame_slice AS fs LEFT JOIN process AS pro ON pro.id = fs.ipid LEFT JOIN frame_slice AS sf ON fs.dst = sf.id ' + + 'LEFT JOIN process AS proc ON proc.id = sf.ipid LEFT JOIN trace_range TR WHERE fs.dst IS NOT NULL AND fs.type ' + + "= 1 UNION SELECT -1 AS id,'frameTime' AS frame_type,fs.ipid,fs.vsync AS name,fs.dur AS app_dur,fs.dur," + + '(fs.ts - TR.start_ts) AS ts,fs.type,fs.flag, pro.pid,pro.name AS cmdline,NULL AS rs_ts,NULL AS rs_vsync,' + + 'NULL AS rs_dur,NULL AS rs_ipid,NULL AS rs_pid,NULL AS rs_name FROM frame_slice AS fs LEFT JOIN process AS pro' + + " ON pro.id = fs.ipid LEFT JOIN trace_range TR WHERE fs.dst IS NULL AND pro.name NOT LIKE '%render_service%' " + + 'AND fs.type = 1 ORDER BY ts;', + title: 'Expected timeline chart', + }, + { + sql: + "SELECT sf.id,'frameTime' AS frame_type,fs.ipid,fs.vsync AS name,fs.dur AS app_dur,(sf.ts + sf.dur - fs.ts) " + + 'AS dur,(fs.ts - TR.start_ts) AS ts,fs.type,(CASE WHEN (sf.flag == 1 OR fs.flag == 1) THEN 1 WHEN (sf.flag == ' + + '3 OR fs.flag == 3 ) THEN 3 ELSE 0 end) AS jank_tag,pro.pid,pro.name AS cmdline,(sf.ts - TR.start_ts) ' + + 'AS rs_ts,sf.vsync AS rs_vsync,sf.dur AS rs_dur,sf.ipid AS rs_ipid,proc.pid AS rs_pid, proc.name AS rs_name ' + + 'FROM frame_slice AS fs LEFT JOIN process AS pro ON pro.id = fs.ipid LEFT JOIN frame_slice AS sf ON fs.dst = ' + + 'sf.id LEFT JOIN process AS proc ON proc.id = sf.ipid LEFT JOIN trace_range TR WHERE fs.dst IS NOT NULL AND ' + + "fs.type = 0 AND fs.flag <> 2 UNION SELECT -1 AS id,'frameTime' AS frame_type,fs.ipid,fs.vsync AS name," + + 'fs.dur AS app_dur,fs.dur,(fs.ts - TR.start_ts) AS ts,fs.type,fs.flag AS jank_tag,pro.pid,pro.name AS ' + + 'cmdline,NULL AS rs_ts,NULL AS rs_vsync,NULL AS rs_dur,NULL AS rs_ipid,NULL AS rs_pid,NULL AS rs_name FROM ' + + 'frame_slice AS fs LEFT JOIN process AS pro ON pro.id = fs.ipid LEFT JOIN trace_range TR WHERE fs.dst IS NULL ' + + "AND pro.name NOT LIKE '%render_service%' AND fs.type = 0 AND fs.flag <> 2 ORDER BY ts;", + title: 'Actual timeline chart', + }, +]; -const appStartUpSql: Array = [{ - sql: 'SELECT P.pid,A.tid,A.call_id AS itid,(CASE WHEN A.start_time < B.start_ts THEN 0 ELSE (A.start_time - ' + - 'B.start_ts) end) AS startTs,(CASE WHEN A.start_time < B.start_ts THEN (A.end_time - B.start_ts) WHEN ' + - 'A.end_time = -1 THEN 0 ELSE (A.end_time - A.start_time) end) AS dur,A.start_name AS startName FROM ' + - 'app_startup A,trace_range B LEFT JOIN process P ON A.ipid = P.ipid ORDER BY start_name;', - title: 'App start up chart' -}]; +const appStartUpSql: Array = [ + { + sql: + 'SELECT P.pid,A.tid,A.call_id AS itid,(CASE WHEN A.start_time < B.start_ts THEN 0 ELSE (A.start_time - ' + + 'B.start_ts) end) AS startTs,(CASE WHEN A.start_time < B.start_ts THEN (A.end_time - B.start_ts) WHEN ' + + 'A.end_time = -1 THEN 0 ELSE (A.end_time - A.start_time) end) AS dur,A.start_name AS startName FROM ' + + 'app_startup A,trace_range B LEFT JOIN process P ON A.ipid = P.ipid ORDER BY start_name;', + title: 'App start up chart', + }, +]; -const animationSql: Array = [{ - sql: 'SELECT a.id AS animationId,(CASE WHEN a.input_time NOT NULL THEN (a.input_time - R.start_ts) ' + - 'ELSE (a.start_point- R.start_ts) END) AS ts,(a.start_point - R.start_ts) AS dynamicStartTs,(a.end_point ' + - '- R.start_ts) AS dynamicEndTs FROM animation AS a,trace_range AS R ORDER BY ts;', - title: 'Animation chart' -}, { - sql: 'SELECT d.id,d.x,d.y,d.width,d.height,d.alpha,d.name AS appName,(d.end_time - R.start_ts) AS ts ' + - 'FROM dynamic_frame AS d,trace_range AS R ORDER BY d.end_time;', - title: 'Animation effect curve chart' -}, -{ - sql: 'SELECT d.id,d.width AS currentFrameWidth,d.height AS currentFrameHeight,d.name AS nameId,(d.end_time ' + - '- R.start_ts) AS currentTs,d.x,d.y FROM dynamic_frame AS d,trace_range AS R ORDER BY d.end_time;', - title: 'Frame spacing chart' -}]; +const animationSql: Array = [ + { + sql: + 'SELECT a.id AS animationId,(CASE WHEN a.input_time NOT NULL THEN (a.input_time - R.start_ts) ' + + 'ELSE (a.start_point- R.start_ts) END) AS ts,(a.start_point - R.start_ts) AS dynamicStartTs,(a.end_point ' + + '- R.start_ts) AS dynamicEndTs FROM animation AS a,trace_range AS R ORDER BY ts;', + title: 'Animation chart', + }, + { + sql: + 'SELECT d.id,d.x,d.y,d.width,d.height,d.alpha,d.name AS appName,(d.end_time - R.start_ts) AS ts ' + + 'FROM dynamic_frame AS d,trace_range AS R ORDER BY d.end_time;', + title: 'Animation effect curve chart', + }, + { + sql: + 'SELECT d.id,d.width AS currentFrameWidth,d.height AS currentFrameHeight,d.name AS nameId,(d.end_time ' + + '- R.start_ts) AS currentTs,d.x,d.y FROM dynamic_frame AS d,trace_range AS R ORDER BY d.end_time;', + title: 'Frame spacing chart', + }, +]; export function getAllSql(): Array { return [...cpuSql, ...threadSql, ...memory, ...bioSql, ...frameTimeSql, ...appStartUpSql, ...animationSql]; } export interface DebugSql { - sql: string - title: string + sql: string; + title: string; } diff --git a/ide/src/trace/component/trace/base/Extension.ts b/ide/src/trace/component/trace/base/Extension.ts index c8683d6a046ecf9fa14497288ee9c1e15fca825f..ab3cd8c4c8450e2487c4d0a1586d93d08dc0b561 100644 --- a/ide/src/trace/component/trace/base/Extension.ts +++ b/ide/src/trace/component/trace/base/Extension.ts @@ -53,8 +53,8 @@ declare global { Loading: string; // Upload so file Error: string; // load error CheckALL: string; // Check all child chart - CollapseAllLane:string //collapse/uncollapse all lane row - CollectGroupChange:string //collapse/uncollapse all lane row + CollapseAllLane: string; //collapse/uncollapse all lane row + CollectGroupChange: string; //collapse/uncollapse all lane row WakeupList: string; //show wakeup list table DeviceConnect: string; DeviceDisConnect: string; diff --git a/ide/src/trace/component/trace/base/RangeSelect.ts b/ide/src/trace/component/trace/base/RangeSelect.ts index 41d4288f0edc06abb8ad1cf83fb99b5eb3c99086..38521f8608a48b3f901c9782b63737b2d84b1722 100644 --- a/ide/src/trace/component/trace/base/RangeSelect.ts +++ b/ide/src/trace/component/trace/base/RangeSelect.ts @@ -27,10 +27,10 @@ export class RangeSelect { isMouseDown: boolean = false; public rangeTraceRow: Array> | undefined; public selectHandler: ((ds: Array>, refreshCheckBox: boolean) => void) | undefined; - private startPageX:number=0; - private startPageY:number = 0; - private endPageX:number = 0; - private endPageY:number = 0; + private startPageX: number = 0; + private startPageY: number = 0; + private endPageX: number = 0; + private endPageY: number = 0; private timerShaftEL: TimerShaftElement | null | undefined; private timerShaftDragEL: HTMLDivElement | null | undefined; private isHover: boolean = false; @@ -67,9 +67,9 @@ export class RangeSelect { this.isMouseDown = true; return; } - this.rangeTraceRow = []; - this.isMouseDown = true; - TraceRow.rangeSelectObject = undefined; + this.rangeTraceRow = []; + this.isMouseDown = true; + TraceRow.rangeSelectObject = undefined; } mouseUp(mouseEventUp: MouseEvent) { @@ -187,19 +187,21 @@ export class RangeSelect { } let rangeSelect: RangeSelectStruct | undefined; this.rangeTraceRow = rows.filter((it) => { - if (Rect.intersect(it.getBoundingClientRect(), { - x:Math.min(this.startPageX,this.endPageX), - y: Math.min(this.startPageY, this.endPageY), - width: Math.abs(this.startPageX - this.endPageX), - height: Math.abs(this.startPageY - this.endPageY), - } as Rect)) { + if ( + Rect.intersect(it.getBoundingClientRect(), { + x: Math.min(this.startPageX, this.endPageX), + y: Math.min(this.startPageY, this.endPageY), + width: Math.abs(this.startPageX - this.endPageX), + height: Math.abs(this.startPageY - this.endPageY), + } as Rect) + ) { if (!rangeSelect) { it.setTipLeft(0, null); rangeSelect = new RangeSelectStruct(); - let startX = Math.min(this.startPageX,this.endPageX)-it.describeEl!.getBoundingClientRect().right; - let endX = Math.max(this.startPageX,this.endPageX)-it.describeEl!.getBoundingClientRect().right; - if(startX<=0) startX = 0; - if(endX>it.frame.width) endX = it.frame.width; + let startX = Math.min(this.startPageX, this.endPageX) - it.describeEl!.getBoundingClientRect().right; + let endX = Math.max(this.startPageX, this.endPageX) - it.describeEl!.getBoundingClientRect().right; + if (startX <= 0) startX = 0; + if (endX > it.frame.width) endX = it.frame.width; rangeSelect.startX = startX; rangeSelect.endX = endX; rangeSelect.startNS = RangeSelect.SetNS(it, startX); diff --git a/ide/src/trace/component/trace/base/TraceRow.ts b/ide/src/trace/component/trace/base/TraceRow.ts index e62e7166b7fdd870d9a30503eb425b5f440375f3..35d2e6977745cd9ed863594ac6c45baa418811a7 100644 --- a/ide/src/trace/component/trace/base/TraceRow.ts +++ b/ide/src/trace/component/trace/base/TraceRow.ts @@ -29,7 +29,7 @@ import { info } from '../../../../log/Log.js'; import { ColorUtils } from './ColorUtils.js'; import { drawSelectionRange, isFrameContainPoint } from '../../../database/ui-worker/ProcedureWorkerCommon.js'; import { TraceRowConfig } from './TraceRowConfig.js'; -import { TreeItemData, LitTree } from '../../../../base-ui/tree/LitTree.js'; +import { type TreeItemData, LitTree } from '../../../../base-ui/tree/LitTree.js'; export class RangeSelectStruct { startX: number | undefined; @@ -88,12 +88,14 @@ export class TraceRow extends HTMLElement { static ROW_TYPE_STATE_ENERGY = 'state-energy'; static ROW_TYPE_SYS_MEMORY_GPU = 'sys-memory-gpu'; static ROW_TYPE_SYS_MEMORY_GPU_GL = 'sys-memory-gpu-gl'; + static ROW_TYPE_SYS_MEMORY_GPU_GRAPH = 'sys-memory-gpu-graph'; static ROW_TYPE_SYS_MEMORY_GPU_TOTAL = 'sys-memory-gpu-total'; static ROW_TYPE_SYS_MEMORY_GPU_WINDOW = 'sys-memory-gpu-window'; static ROW_TYPE_VM_TRACKER_SMAPS = 'smaps'; static ROW_TYPE_VM_TRACKER = 'VmTracker'; static ROW_TYPE_DMA_VMTRACKER = 'dma-vmTracker'; static ROW_TYPE_GPU_MEMORY_VMTRACKER = 'gpu-memory-vmTracker'; + static ROW_TYPE_GPU_RESOURCE_VMTRACKER = 'sys-memory-gpu-resource'; static ROW_TYPE_VMTRACKER_SHM = 'VmTracker-shm'; static ROW_TYPE_CLOCK_GROUP = 'clock-group'; static ROW_TYPE_COLLECT_GROUP = 'collect-group'; @@ -256,7 +258,7 @@ export class TraceRow extends HTMLElement { } } - get collectGroup() { + get collectGroup(): string | undefined { return this._collectGroup; } @@ -269,7 +271,7 @@ export class TraceRow extends HTMLElement { this.setAttribute('row-setting', value); } - get rowSetting() { + get rowSetting(): string { return this.getAttribute('row-setting') || 'disable'; } @@ -277,7 +279,7 @@ export class TraceRow extends HTMLElement { this.rowSettingPop!.placement = value; } - get rowSettingPopoverDirection() { + get rowSettingPopoverDirection(): string { return this.rowSettingPop?.placement || 'bottomLeft'; } @@ -286,11 +288,11 @@ export class TraceRow extends HTMLElement { this.rowSettingTree!.treeData = value || []; } - get rowSettingList() { + get rowSettingList(): TreeItemData[] | null | undefined { return this._rowSettingList; } - get collect() { + get collect(): boolean { return this.hasAttribute('collect-type'); } @@ -384,9 +386,9 @@ export class TraceRow extends HTMLElement { return; } if (value) { - this.insertAfter(this.fragment, this); + this.updateChildRowStatus(); } else { - this.isShowChildrenRow(this.childrenList); + this.childRowToFragment(false); } if (value) { this.setAttribute('expansion', ''); @@ -405,18 +407,26 @@ export class TraceRow extends HTMLElement { ); } - private isShowChildrenRow(childrenRowList: Array>): void { - for (const childrenRow of childrenRowList) { + childRowToFragment(expansion: boolean): void { + for (const childrenRow of this.childrenList) { if (!childrenRow.collect) { this.fragment.append(childrenRow); } - if (childrenRow.childrenList && childrenRow.expansion) { - this.isShowChildrenRow(childrenRow.childrenList); + if (!expansion) { + if (childrenRow.childrenList && childrenRow.folder && childrenRow.expansion) { + childrenRow.expansion = false; + } } } } - clearMemory() { + updateChildRowStatus(): void { + this.fragment = document.createDocumentFragment(); + this.childRowToFragment(true); + this.insertAfter(this.fragment, this); + } + + clearMemory(): void { this.dataList2 = []; this.dataList = []; this.dataListCache = []; @@ -433,21 +443,14 @@ export class TraceRow extends HTMLElement { } } - addTemplateTypes(...type: string[]) { + addTemplateTypes(...type: string[]): void { this.templateType.push(...type); if (this.hasParentRowEl) { this.toParentAddTemplateType(this); } } - replaceTraceRow(newNode: any, oldNode: any) { - let oldIndex = this.childrenList.indexOf(oldNode); - if (oldIndex != -1) { - this.childrenList.splice(oldIndex, 1, newNode); - } - } - - toParentAddTemplateType = (currentRowEl: TraceRow) => { + toParentAddTemplateType = (currentRowEl: TraceRow): void => { let parentRow = currentRowEl.parentRowEl; if (parentRow !== undefined) { parentRow.templateType.push(...currentRowEl.templateType); @@ -457,9 +460,11 @@ export class TraceRow extends HTMLElement { } }; - getHoverStruct() { + getHoverStruct(strict: boolean = true, offset: boolean = false): T | undefined { if (this.isHover) { - return this.dataListCache.find((re) => re.frame && isFrameContainPoint(re.frame, this.hoverX, this.hoverY)); + return this.dataListCache.find( + (re) => re.frame && isFrameContainPoint(re.frame, this.hoverX, this.hoverY, strict, offset) + ); } } @@ -473,11 +478,6 @@ export class TraceRow extends HTMLElement { this.fragment.appendChild(child); } - removeChildTraceRow(row: TraceRow) { - this.childrenList.splice(this.childrenList.indexOf(row), 1); - this.fragment.removeChild(row); - } - addChildTraceRowAfter(child: TraceRow, targetRow: TraceRow) { TraceRowConfig.allTraceRowList.push(child); child.parentRowEl = this; @@ -522,7 +522,7 @@ export class TraceRow extends HTMLElement { insertAfter(newEl: DocumentFragment, targetEl: HTMLElement) { let parentEl = targetEl.parentNode; if (parentEl) { - if (parentEl!.lastChild == targetEl) { + if (parentEl!.lastChild === targetEl) { parentEl!.appendChild(newEl); } else { parentEl!.insertBefore(newEl, targetEl.nextSibling); @@ -556,7 +556,7 @@ export class TraceRow extends HTMLElement { } set checkType(value: string) { - if (!value || value.length == 0) { + if (!value || value.length === 0) { this.removeAttribute('check-type'); return; } @@ -690,11 +690,12 @@ export class TraceRow extends HTMLElement { }); } }; - this.rowSettingTree!.onChange = (e: any) => { + this.rowSettingTree!.onChange = (e: any): void => { // @ts-ignore this.rowSettingPop!.visible = false; this.onRowSettingChangeHandler?.(this.rowSettingTree!.getCheckdKeys(), this.rowSettingTree!.getCheckdNodes()); }; + this.checkType = '-1'; } initCanvas(list: Array): void { @@ -704,15 +705,15 @@ export class TraceRow extends HTMLElement { .shadowRoot!.querySelector('div > timer-shaft-element'); let timerShaftCanvas = timerShaftEL!.shadowRoot!.querySelector('canvas'); let tempHeight: number = 0; - if (this.rowType == TraceRow.ROW_TYPE_FUNC) { + if (this.rowType === TraceRow.ROW_TYPE_FUNC) { tempHeight = 20; - } else if (this.rowType == TraceRow.ROW_TYPE_THREAD) { + } else if (this.rowType === TraceRow.ROW_TYPE_THREAD) { tempHeight = 30; - } else if (this.rowType == TraceRow.ROW_TYPE_SYSTEM_ENERGY) { + } else if (this.rowType === TraceRow.ROW_TYPE_SYSTEM_ENERGY) { tempHeight = 80; - } else if (this.rowType == TraceRow.ROW_TYPE_POWER_ENERGY) { + } else if (this.rowType === TraceRow.ROW_TYPE_POWER_ENERGY) { tempHeight = 200; - } else if (this.rowType == TraceRow.ROW_TYPE_ANOMALY_ENERGY) { + } else if (this.rowType === TraceRow.ROW_TYPE_ANOMALY_ENERGY) { tempHeight = 55; } else { tempHeight = 40; @@ -734,15 +735,15 @@ export class TraceRow extends HTMLElement { updateWidth(width: number) { this.dpr = window.devicePixelRatio || 1; let tempHeight: number = 0; - if (this.rowType == TraceRow.ROW_TYPE_FUNC) { + if (this.rowType === TraceRow.ROW_TYPE_FUNC) { tempHeight = 20; - } else if (this.rowType == TraceRow.ROW_TYPE_THREAD) { + } else if (this.rowType === TraceRow.ROW_TYPE_THREAD) { tempHeight = 30; - } else if (this.rowType == TraceRow.ROW_TYPE_SYSTEM_ENERGY) { + } else if (this.rowType === TraceRow.ROW_TYPE_SYSTEM_ENERGY) { tempHeight = 90; - } else if (this.rowType == TraceRow.ROW_TYPE_POWER_ENERGY) { + } else if (this.rowType === TraceRow.ROW_TYPE_POWER_ENERGY) { tempHeight = 200; - } else if (this.rowType == TraceRow.ROW_TYPE_ANOMALY_ENERGY) { + } else if (this.rowType === TraceRow.ROW_TYPE_ANOMALY_ENERGY) { tempHeight = 55; } else { tempHeight = 40; @@ -819,7 +820,7 @@ export class TraceRow extends HTMLElement { } collectList.splice(endDragNode, 0, ...collectList.splice(startDragNode, 1)); collectList.forEach((it, i) => { - if (i == 0) { + if (i === 0) { it.style.top = `${spacer.offsetTop + 48}px`; } else { it.style.top = `${collectList[i - 1].offsetTop + collectList[i - 1].offsetHeight}px`; @@ -881,7 +882,7 @@ export class TraceRow extends HTMLElement { } setTipLeft(x: number, struct: any) { - if (struct == null && this.tipEL) { + if (struct === null && this.tipEL) { this.tipEL.style.display = 'none'; return; } diff --git a/ide/src/trace/component/trace/base/TraceRowConfig.ts b/ide/src/trace/component/trace/base/TraceRowConfig.ts index 878b26aa5ccbb2fea148e18f236e2488401091d4..c56d3962a289ae06b58d1d38f1543bf2bbb967ec 100644 --- a/ide/src/trace/component/trace/base/TraceRowConfig.ts +++ b/ide/src/trace/component/trace/base/TraceRowConfig.ts @@ -21,7 +21,7 @@ import { SpSystemTrace } from '../../SpSystemTrace.js'; import { LitSearch } from '../search/Search.js'; import { TraceSheet } from './TraceSheet.js'; import { CpuStruct } from '../../../database/ui-worker/ProcedureWorkerCPU.js'; -import { BaseStruct } from '../../../bean/BaseStruct.js'; +import { type BaseStruct } from '../../../bean/BaseStruct.js'; @element('trace-row-config') export class TraceRowConfig extends BaseElement { @@ -64,9 +64,10 @@ export class TraceRowConfig extends BaseElement { this.chartTable!.innerHTML = ''; this.inputElement!.value = ''; this.spSystemTrace = this.parentElement!.querySelector('sp-system-trace'); - this.traceRowList = this.spSystemTrace!.shadowRoot?.querySelector('div[class=rows-pane]')!.querySelectorAll< - TraceRow - >("trace-row[row-parent-id='']"); + this.traceRowList = + this.spSystemTrace!.shadowRoot?.querySelector('div[class=rows-pane]')!.querySelectorAll>( + "trace-row[row-parent-id='']" + ); let allowSceneList: Array = []; TraceRowConfig.allTraceRowList.push(...this.traceRowList!); this.traceRowList!.forEach((traceRow: TraceRow) => { @@ -309,7 +310,7 @@ export class TraceRowConfig extends BaseElement { this.spSystemTrace!.selectFlag = undefined; } - initElements(): void {} + initElements(): void { } connectedCallback(): void { this.sceneTable = this.shadowRoot!.querySelector('#scene-select'); diff --git a/ide/src/trace/component/trace/base/TraceRowObject.ts b/ide/src/trace/component/trace/base/TraceRowObject.ts index c2654ea535035990ccad49c7e6f62e5bfe3da1b9..22cd59520af8c397d8cf5fb98d47c2e246e685e8 100644 --- a/ide/src/trace/component/trace/base/TraceRowObject.ts +++ b/ide/src/trace/component/trace/base/TraceRowObject.ts @@ -33,13 +33,31 @@ export class TraceRowObject { public color: string | undefined; public frame: Rect | undefined; public supplier: (() => Promise>) | undefined | null; - public onThreadHandler: | (( + public onThreadHandler: + | (( row: TraceRow, - ctx: | ImageBitmapRenderingContext | CanvasRenderingContext2D | WebGLRenderingContext | - WebGL2RenderingContext | null | undefined ) => void) | undefined | null; - public onDrawHandler: | (( - ctx: | ImageBitmapRenderingContext | CanvasRenderingContext2D | WebGLRenderingContext | - WebGL2RenderingContext | null | undefined) => void) | undefined | null; + ctx: + | ImageBitmapRenderingContext + | CanvasRenderingContext2D + | WebGLRenderingContext + | WebGL2RenderingContext + | null + | undefined + ) => void) + | undefined + | null; + public onDrawHandler: + | (( + ctx: + | ImageBitmapRenderingContext + | CanvasRenderingContext2D + | WebGLRenderingContext + | WebGL2RenderingContext + | null + | undefined + ) => void) + | undefined + | null; public top: number = 0; public rowIndex: number = 0; public preObject: TraceRowObject | undefined | null; diff --git a/ide/src/trace/component/trace/base/TraceSheet.ts b/ide/src/trace/component/trace/base/TraceSheet.ts index 479732cfea2d7ab2a07b5bb933f6bef2cb553ed8..7e882f80d4b622690f2ac625dc40dcd37dd3b56b 100644 --- a/ide/src/trace/component/trace/base/TraceSheet.ts +++ b/ide/src/trace/component/trace/base/TraceSheet.ts @@ -14,71 +14,72 @@ */ import { BaseElement, element } from '../../../../base-ui/BaseElement.js'; -import { LitTabs } from '../../../../base-ui/tabs/lit-tabs.js'; +import { type LitTabs } from '../../../../base-ui/tabs/lit-tabs.js'; import { LitTabpane } from '../../../../base-ui/tabs/lit-tabpane.js'; import { BoxJumpParam, SelectionParam } from '../../../bean/BoxSelection.js'; -import { TabPaneCurrentSelection } from '../sheet/TabPaneCurrentSelection.js'; -import { TabPaneFlag } from '../timer-shaft/TabPaneFlag.js'; -import { Flag } from '../timer-shaft/Flag.js'; -import { WakeupBean } from '../../../bean/WakeupBean.js'; -import { LitIcon } from '../../../../base-ui/icon/LitIcon.js'; +import { type TabPaneCurrentSelection } from '../sheet/TabPaneCurrentSelection.js'; +import { type TabPaneFlag } from '../timer-shaft/TabPaneFlag.js'; +import { type Flag } from '../timer-shaft/Flag.js'; +import { type WakeupBean } from '../../../bean/WakeupBean.js'; +import { type LitIcon } from '../../../../base-ui/icon/LitIcon.js'; import { tabConfig } from './TraceSheetConfig.js'; -import { TabPaneBoxChild } from '../sheet/cpu/TabPaneBoxChild.js'; -import { CpuStruct } from '../../../database/ui-worker/ProcedureWorkerCPU.js'; +import { type TabPaneBoxChild } from '../sheet/cpu/TabPaneBoxChild.js'; +import { type CpuStruct } from '../../../database/ui-worker/ProcedureWorkerCPU.js'; import { CpuFreqStruct } from '../../../database/ui-worker/ProcedureWorkerFreq.js'; import { CpuFreqLimitsStruct } from '../../../database/ui-worker/ProcedureWorkerCpuFreqLimits.js'; -import { ThreadStruct } from '../../../database/ui-worker/ProcedureWorkerThread.js'; -import { FuncStruct } from '../../../database/ui-worker/ProcedureWorkerFunc.js'; -import { ProcessMemStruct } from '../../../database/ui-worker/ProcedureWorkerMem.js'; +import { type ThreadStruct } from '../../../database/ui-worker/ProcedureWorkerThread.js'; +import { type FuncStruct } from '../../../database/ui-worker/ProcedureWorkerFunc.js'; +import { type ProcessMemStruct } from '../../../database/ui-worker/ProcedureWorkerMem.js'; import { CpuStateStruct } from '../../../database/ui-worker/ProcedureWorkerCpuState.js'; -import { ClockStruct } from '../../../database/ui-worker/ProcedureWorkerClock.js'; -import { IrqStruct } from '../../../database/ui-worker/ProcedureWorkerIrq.js'; -import { JankStruct } from '../../../database/ui-worker/ProcedureWorkerJank.js'; -import { HeapStruct } from '../../../database/ui-worker/ProcedureWorkerHeap.js'; -import { LitTable } from '../../../../base-ui/table/lit-table.js'; +import { type ClockStruct } from '../../../database/ui-worker/ProcedureWorkerClock.js'; +import { type IrqStruct } from '../../../database/ui-worker/ProcedureWorkerIrq.js'; +import { type JankStruct } from '../../../database/ui-worker/ProcedureWorkerJank.js'; +import { type HeapStruct } from '../../../database/ui-worker/ProcedureWorkerHeap.js'; +import { type LitTable } from '../../../../base-ui/table/lit-table.js'; import { queryNativeHookResponseTypes, threadPool } from '../../../database/SqlLite.js'; -import { HeapSnapshotStruct } from '../../../database/ui-worker/ProcedureWorkerHeapSnapshot.js'; -import { TabPaneNMStatisticAnalysis } from '../sheet/native-memory/TabPaneNMStatisticAnalysis.js'; -import { TabPaneCurrent } from '../sheet/TabPaneCurrent.js'; -import { SlicesTime } from '../timer-shaft/SportRuler.js'; -import { AppStartupStruct } from '../../../database/ui-worker/ProcedureWorkerAppStartup.js'; -import { SoStruct } from '../../../database/ui-worker/ProcedureWorkerSoInit.js'; -import { FrameAnimationStruct } from '../../../database/ui-worker/ProcedureWorkerFrameAnimation.js'; -import { TraceRow } from './TraceRow.js'; -import { FrameDynamicStruct } from '../../../database/ui-worker/ProcedureWorkerFrameDynamic.js'; -import { TabPaneFrameDynamic } from '../sheet/frame/TabPaneFrameDynamic.js'; -import { FrameSpacingStruct } from '../../../database/ui-worker/ProcedureWorkerFrameSpacing.js'; -import { TabFrameSpacing } from '../sheet/frame/TabFrameSpacing.js'; +import { type HeapSnapshotStruct } from '../../../database/ui-worker/ProcedureWorkerHeapSnapshot.js'; +import { type TabPaneNMStatisticAnalysis } from '../sheet/native-memory/TabPaneNMStatisticAnalysis.js'; +import { type TabPaneCurrent } from '../sheet/TabPaneCurrent.js'; +import { type SlicesTime } from '../timer-shaft/SportRuler.js'; +import { type AppStartupStruct } from '../../../database/ui-worker/ProcedureWorkerAppStartup.js'; +import { type SoStruct } from '../../../database/ui-worker/ProcedureWorkerSoInit.js'; +import { type FrameAnimationStruct } from '../../../database/ui-worker/ProcedureWorkerFrameAnimation.js'; +import { type TraceRow } from './TraceRow.js'; +import { type FrameDynamicStruct } from '../../../database/ui-worker/ProcedureWorkerFrameDynamic.js'; +import { type TabPaneFrameDynamic } from '../sheet/frame/TabPaneFrameDynamic.js'; +import { type FrameSpacingStruct } from '../../../database/ui-worker/ProcedureWorkerFrameSpacing.js'; +import { type TabFrameSpacing } from '../sheet/frame/TabFrameSpacing.js'; import { procedurePool } from '../../../database/Procedure.js'; -import { JsCpuProfilerChartFrame } from '../../../bean/JsStruct.js'; +import { type JsCpuProfilerChartFrame } from '../../../bean/JsStruct.js'; import { TabPaneJsCpuTopDown } from '../sheet/ark-ts/TabPaneJsCpuCallTree.js'; -import { TabPaneComparison } from '../sheet/ark-ts/TabPaneComparison.js'; -import { TabPaneSummary } from '../sheet/ark-ts/TabPaneSummary.js'; -import { TabPaneGpuClickSelect } from '../sheet/gpu/TabPaneGpuClickSelect.js'; -import { TabPanePurgTotalSelection } from '../sheet/ability/TabPanePurgTotalSelection.js'; -import { TabPanePurgPinSelection } from '../sheet/ability/TabPanePurgPinSelection.js'; -import { TabPaneVmTrackerShmSelection } from '../sheet/vmtracker/TabPaneVmTrackerShmSelection.js'; -import { TabPaneSmapsStatistics } from '../sheet/smaps/TabPaneSmapsStatistics.js'; -import { TabPaneSmapsComparison } from '../sheet/smaps/TabPaneSmapsComparison.js'; -import { SnapshotStruct } from '../../../database/ui-worker/ProcedureWorkerSnapshot.js'; -import { TabPaneDmaSelectAbility } from '../sheet/ability/TabPaneDmaSelectAbility.js'; -import { TabPaneGpuMemorySelectAbility } from '../sheet/ability/TabPaneGpuMemorySelectAbility.js'; -import { TabPaneDmaSelectVmTracker } from '../sheet/vmtracker/TabPaneDmaSelectVmTracker.js'; -import { TabPanePurgTotalComparisonAbility } from '../sheet/ability/TabPanePurgTotalComparisonAbility.js'; -import { TabPanePurgPinComparisonAbility } from '../sheet/ability/TabPanePurgPinComparisonAbility.js'; -import { TabPanePurgTotalComparisonVM } from '../sheet/vmtracker/TabPanePurgTotalComparisonVM.js'; -import { TabPanePurgPinComparisonVM } from '../sheet/vmtracker/TabPanePurgPinComparisonVM.js'; -import { TabPaneDmaAbilityComparison } from '../sheet/ability/TabPaneDmaAbilityComparison.js'; -import { TabPaneGpuMemoryComparison } from '../sheet/ability/TabPaneGpuMemoryComparison.js'; -import { TabPaneDmaVmTrackerComparison } from '../sheet/vmtracker/TabPaneDmaVmTrackerComparison.js'; -import { TabPaneGpuMemorySelectVmTracker } from '../sheet/vmtracker/TabPaneGpuMemorySelectVmTracker.js'; -import { TabPaneGpuMemoryVmTrackerComparison } from '../sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.js'; -import { TabPaneVmTrackerShmComparison } from '../sheet/vmtracker/TabPaneVmTrackerShmComparison.js'; -import { TabPaneJsCpuStatistics } from '../sheet/ark-ts/TabPaneJsCpuStatistics.js'; -import { TabPaneGpuClickSelectComparison } from '../sheet/gpu/TabPaneGpuClickSelectComparison.js'; +import { type TabPaneComparison } from '../sheet/ark-ts/TabPaneComparison.js'; +import { type TabPaneSummary } from '../sheet/ark-ts/TabPaneSummary.js'; +import { type TabPaneGpuClickSelect } from '../sheet/gpu/TabPaneGpuClickSelect.js'; +import { type TabPanePurgTotalSelection } from '../sheet/ability/TabPanePurgTotalSelection.js'; +import { type TabPanePurgPinSelection } from '../sheet/ability/TabPanePurgPinSelection.js'; +import { type TabPaneVmTrackerShmSelection } from '../sheet/vmtracker/TabPaneVmTrackerShmSelection.js'; +import { type TabPaneSmapsStatistics } from '../sheet/smaps/TabPaneSmapsStatistics.js'; +import { type TabPaneSmapsComparison } from '../sheet/smaps/TabPaneSmapsComparison.js'; +import { type SnapshotStruct } from '../../../database/ui-worker/ProcedureWorkerSnapshot.js'; +import { type TabPaneDmaSelectAbility } from '../sheet/ability/TabPaneDmaSelectAbility.js'; +import { type TabPaneGpuMemorySelectAbility } from '../sheet/ability/TabPaneGpuMemorySelectAbility.js'; +import { type TabPaneDmaSelectVmTracker } from '../sheet/vmtracker/TabPaneDmaSelectVmTracker.js'; +import { type TabPanePurgTotalComparisonAbility } from '../sheet/ability/TabPanePurgTotalComparisonAbility.js'; +import { type TabPanePurgPinComparisonAbility } from '../sheet/ability/TabPanePurgPinComparisonAbility.js'; +import { type TabPanePurgTotalComparisonVM } from '../sheet/vmtracker/TabPanePurgTotalComparisonVM.js'; +import { type TabPanePurgPinComparisonVM } from '../sheet/vmtracker/TabPanePurgPinComparisonVM.js'; +import { type TabPaneDmaAbilityComparison } from '../sheet/ability/TabPaneDmaAbilityComparison.js'; +import { type TabPaneGpuMemoryComparison } from '../sheet/ability/TabPaneGpuMemoryComparison.js'; +import { type TabPaneDmaVmTrackerComparison } from '../sheet/vmtracker/TabPaneDmaVmTrackerComparison.js'; +import { type TabPaneGpuMemorySelectVmTracker } from '../sheet/vmtracker/TabPaneGpuMemorySelectVmTracker.js'; +import { type TabPaneGpuMemoryVmTrackerComparison } from '../sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.js'; +import { type TabPaneVmTrackerShmComparison } from '../sheet/vmtracker/TabPaneVmTrackerShmComparison.js'; +import { type TabPaneJsCpuStatistics } from '../sheet/ark-ts/TabPaneJsCpuStatistics.js'; +import { type TabPaneGpuClickSelectComparison } from '../sheet/gpu/TabPaneGpuClickSelectComparison.js'; import { Utils } from './Utils.js'; import { TabPaneHiLogs } from '../sheet/hilog/TabPaneHiLogs.js'; import { TabPaneHiLogSummary } from '../sheet/hilog/TabPaneHiLogSummary.js'; +import { TabPaneGpuResourceVmTracker } from '../sheet/vmtracker/TabPaneGpuResourceVmTracker.js'; @element('trace-sheet') export class TraceSheet extends BaseElement { @@ -141,7 +142,7 @@ export class TraceSheet extends BaseElement { this.importDiv = this.shadowRoot?.querySelector('#import_div'); this.buildTabs(this.litTabs); let minBtn = this.shadowRoot?.querySelector('#min-btn'); - minBtn?.addEventListener('click', () => {}); + minBtn?.addEventListener('click', () => { }); this.litTabs!.onTabClick = (e: any): void => this.loadTabPaneData(e.detail.key); this.litTabs!.addEventListener('close-handler', () => { Reflect.ownKeys(tabConfig) @@ -222,7 +223,7 @@ export class TraceSheet extends BaseElement { } else if ( navRoot!.offsetHeight <= moveY && search!.offsetHeight + timerShaft!.offsetHeight + borderTop + spacer!.offsetHeight <= - window.innerHeight - moveY + window.innerHeight - moveY ) { tabs!.style.height = moveY + 'px'; node!.style.height = moveY - navRoot!.offsetHeight + 'px'; @@ -258,8 +259,8 @@ export class TraceSheet extends BaseElement { setTimeout(() => { (window as any).isSheetMove = false; }, 100); - litTabpane!.forEach((node: HTMLDivElement) => { - if (node!.style.height !== '0px' && tabs!.style.height != '') { + litTabpane!.forEach((node: HTMLDivElement): void => { + if (node!.style.height !== '0px' && tabs!.style.height !== '') { initialHeight.node = node!.style.height; initialHeight.tabs = tabs!.style.height; } @@ -277,7 +278,7 @@ export class TraceSheet extends BaseElement { tabs!.style.height = window.innerHeight - search!.offsetHeight - timerShaft!.offsetHeight - borderTop + 'px'; let litTabpane: NodeListOf | undefined | null = this.shadowRoot?.querySelectorAll('#tabs > lit-tabpane'); - litTabpane!.forEach((node: HTMLDivElement) => { + litTabpane!.forEach((node: HTMLDivElement): void => { node!.style.height = window.innerHeight - search!.offsetHeight - @@ -304,7 +305,7 @@ export class TraceSheet extends BaseElement { litTabpane!.forEach((node: HTMLDivElement) => (node!.style.height = initialHeight.node)); } }; - importFileBt!.addEventListener('change', (event) => { + importFileBt!.addEventListener('change', (event): void => { let files = importFileBt?.files; if (files) { let fileList: Array = []; @@ -429,7 +430,7 @@ export class TraceSheet extends BaseElement { this.showUploadSoBt(val); }; - displayGpuSelectedData = (type: string, startTs: number, dataList: Array) => { + displayGpuSelectedData = (type: string, startTs: number, dataList: Array): void => { this.displayTab('gpu-click-select-comparison').getGpuClickDataByDB( type, startTs, @@ -450,23 +451,27 @@ export class TraceSheet extends BaseElement { data: JankStruct, callback: ((data: Array) => void) | undefined = undefined, scrollCallback: ((e: JankStruct) => void) | undefined - ) => this.displayTab('current-selection').setJankData(data, callback, scrollCallback); - displayShmData = (data: SnapshotStruct, dataList: Array) => { + ): void => this.displayTab('current-selection').setJankData(data, callback, scrollCallback); + displayShmData = (data: SnapshotStruct, dataList: Array): void => { this.displayTab('box-vmtracker-shm-comparison').setShmData(data, dataList); this.displayTab( 'box-vmtracker-shm-selection', 'box-vmtracker-shm-comparison' ).setShmData(data, dataList); }; - displaySmapsData = (data: SnapshotStruct, dataList: Array) => { + displaySmapsData = (data: SnapshotStruct, dataList: Array): void => { let val = new SelectionParam(); val.smapsType = []; val.leftNs = data.startNs; this.selection = val; val.smapsType = []; this.displayTab('box-smaps-comparison').setData(val, dataList); - this.displayTab('box-smaps-statistics', 'box-smaps-record', 'box-smaps-comparison').data = - val; + this.displayTab( + 'box-smaps-statistics', + 'box-smaps-sample', + 'box-smaps-comparison', + 'box-smaps-record' + ).data = val; }; displaySnapshotData = ( data: HeapSnapshotStruct, @@ -516,7 +521,7 @@ export class TraceSheet extends BaseElement { 'box-js-Profiler-top-down' ).data = data; }; - displayPurgTotalAbilityData = (data: SnapshotStruct, dataList: Array) => { + displayPurgTotalAbilityData = (data: SnapshotStruct, dataList: Array): void => { data.type = 'ability'; this.displayTab('box-purgeable-total-comparison-ability').totalData( data, @@ -527,7 +532,7 @@ export class TraceSheet extends BaseElement { 'box-purgeable-total-comparison-ability' ).data = data; }; - displayPurgPinAbilityData = (data: SnapshotStruct, dataList: Array) => { + displayPurgPinAbilityData = (data: SnapshotStruct, dataList: Array): void => { data.type = 'ability'; this.displayTab('box-purgeable-pin-comparison-ability').totalData(data, dataList); this.displayTab( @@ -535,7 +540,7 @@ export class TraceSheet extends BaseElement { 'box-purgeable-pin-comparison-ability' ).data = data; }; - displayPurgTotalVMData = (data: SnapshotStruct, dataList: Array) => { + displayPurgTotalVMData = (data: SnapshotStruct, dataList: Array): void => { data.type = 'VM'; this.displayTab('box-purgeable-total-comparison-vm').totalData(data, dataList); this.displayTab( @@ -543,13 +548,13 @@ export class TraceSheet extends BaseElement { 'box-purgeable-total-comparison-vm' ).data = data; }; - displayPurgPinVMData = (data: SnapshotStruct, dataList: Array) => { + displayPurgPinVMData = (data: SnapshotStruct, dataList: Array): void => { data.type = 'VM'; this.displayTab('box-purgeable-pin-comparison-vm').totalData(data, dataList); this.displayTab('box-purgeable-pin-selection', 'box-purgeable-pin-comparison-vm').data = data; }; - displayDmaAbility = (data: number, dataList: Array) => { + displayDmaAbility = (data: number, dataList: Array): void => { if (dataList.length > 0) { this.displayTab('box-dma-ability-comparison').comparisonDataByDB(data, dataList); this.displayTab( @@ -560,7 +565,7 @@ export class TraceSheet extends BaseElement { this.displayTab('box-dma-selection-ability').queryDmaClickDataByDB(data); } }; - displayDmaVmTracker = (data: number, dataList: Array) => { + displayDmaVmTracker = (data: number, dataList: Array): void => { if (dataList.length > 0) { this.displayTab('box-vmTracker-comparison').comparisonDataByDB(data, dataList); this.displayTab( @@ -571,7 +576,7 @@ export class TraceSheet extends BaseElement { this.displayTab('box-dma-selection-vmTracker').queryDmaVmTrackerClickDataByDB(data); } }; - displayGpuMemoryAbility = (data: number, dataList: Array) => { + displayGpuMemoryAbility = (data: number, dataList: Array): void => { if (dataList.length > 0) { this.displayTab('box-gpu-memory-comparison').comparisonDataByDB(data, dataList); this.displayTab( @@ -582,7 +587,7 @@ export class TraceSheet extends BaseElement { this.displayTab('box-gpu-memory-selection-ability').data = data; } }; - displayGpuMemoryVmTracker = (data: number, dataList: Array) => { + displayGpuMemoryVmTracker = (data: number, dataList: Array): void => { if (dataList.length > 0) { this.displayTab('box-gpu-memory-vmTracker-comparison').comparisonDataByDB( data, @@ -598,9 +603,12 @@ export class TraceSheet extends BaseElement { ).queryGpuMemoryVmTrackerClickDataByDB(data); } }; + displayGpuResourceVmTracker = (data: number) => { + this.displayTab('box-smaps-gpu-resource').data = data; + }; displaySystemLogsData = (): void => { - let tblHiLogPanel = this.shadowRoot?.querySelector('lit-tabpane[id=\'box-hilogs\']'); + let tblHiLogPanel = this.shadowRoot?.querySelector("lit-tabpane[id='box-hilogs']"); if (tblHiLogPanel) { let tblHiLog = tblHiLogPanel.querySelector('tab-hi-log'); if (tblHiLog) { @@ -608,7 +616,7 @@ export class TraceSheet extends BaseElement { tblHiLog.initTabSheetEl(tblHiLog.parentElement!, this); } } - let tblSummaryPanel = this.shadowRoot?.querySelector('lit-tabpane[id=\'box-hilogs-summary\']'); + let tblSummaryPanel = this.shadowRoot?.querySelector("lit-tabpane[id='box-hilogs-summary']"); if (tblSummaryPanel) { let tblSummary = tblSummaryPanel.querySelector('tab-hi-log-summary'); if (tblSummary) { @@ -682,19 +690,19 @@ export class TraceSheet extends BaseElement { initFilterLibList(param: SelectionParam | any) { let nmTypes: Array = []; - if (param.nativeMemory.indexOf('All Heap & Anonymous VM') != -1) { + if (param.nativeMemory.indexOf('All Heap & Anonymous VM') !== -1) { nmTypes.push("'AllocEvent'"); nmTypes.push("'MmapEvent'"); } else { - if (param.nativeMemory.indexOf('All Heap') != -1) { + if (param.nativeMemory.indexOf('All Heap') !== -1) { nmTypes.push("'AllocEvent'"); } - if (param.nativeMemory.indexOf('All Anonymous VM') != -1) { + if (param.nativeMemory.indexOf('All Anonymous VM') !== -1) { nmTypes.push("'MmapEvent'"); } } queryNativeHookResponseTypes(param.leftNs, param.rightNs, nmTypes).then((res) => { - procedurePool.submitWithName('logic1', 'native-memory-init-responseType', res, undefined, () => {}); + procedurePool.submitWithName('logic1', 'native-memory-init-responseType', res, undefined, () => { }); }); } @@ -729,7 +737,7 @@ export class TraceSheet extends BaseElement { rowClickHandler(e: any): void { this.currentPaneID = e.target.parentElement.id; this.shadowRoot!.querySelectorAll(`lit-tabpane`).forEach((it) => - it.id != this.currentPaneID ? (it.hidden = true) : (it.hidden = false) + it.id !== this.currentPaneID ? (it.hidden = true) : (it.hidden = false) ); let pane = this.getPaneByID('box-cpu-child'); pane.closeable = true; diff --git a/ide/src/trace/component/trace/base/TraceSheetConfig.ts b/ide/src/trace/component/trace/base/TraceSheetConfig.ts index 86e3e3e6465433aade71cf8e9a3cfd1801d23aff..9e22eff38f5ccbeeef0366868ec4868083249f82 100644 --- a/ide/src/trace/component/trace/base/TraceSheetConfig.ts +++ b/ide/src/trace/component/trace/base/TraceSheetConfig.ts @@ -59,7 +59,7 @@ import { TabPaneIOCallTree, TabPaneVMCallTree } from '../sheet/file-system/TabPa import { TabPaneIoCompletionTimes } from '../sheet/file-system/TabPaneIoCompletionTimes.js'; import { TabPaneVirtualMemoryEvents } from '../sheet/file-system/TabPaneVMEvents.js'; import { TabPaneSmapsStatistics } from '../sheet/smaps/TabPaneSmapsStatistics.js'; -import { TabPaneSmapsRecord } from '../sheet/smaps/TabPaneSmapsRecord.js'; +import { TabPaneSmapsSample } from '../sheet/smaps/TabPaneSmapsSample.js'; import { TabPaneFreqLimit } from '../sheet/freq/TabPaneFreqLimit.js'; import { TabPaneCpuFreqLimits } from '../sheet/freq/TabPaneCpuFreqLimits.js'; import { TabpaneNMCalltree } from '../sheet/native-memory/TabPaneNMCallTree.js'; @@ -111,10 +111,13 @@ import { TabPaneDmaVmTrackerComparison } from '../sheet/vmtracker/TabPaneDmaVmTr import { TabPaneGpuMemoryVmTrackerComparison } from '../sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.js'; import { TabPaneVmTrackerShmComparison } from '../sheet/vmtracker/TabPaneVmTrackerShmComparison.js'; import { TabPaneSmapsComparison } from '../sheet/smaps/TabPaneSmapsComparison.js'; +import { TabPaneSmapsRecord } from '../sheet/smaps/TabPaneSmapsRecord.js'; import { TabPaneGpuClickSelectComparison } from '../sheet/gpu/TabPaneGpuClickSelectComparison.js'; import { TabPaneHiLogs } from '../sheet/hilog/TabPaneHiLogs.js'; import { TabPaneHiLogSummary } from '../sheet/hilog/TabPaneHiLogSummary.js'; import { TabPaneSchedPriority } from '../sheet/cpu/TabPaneSchedPriority.js'; +import { TabPaneGpuResourceVmTracker } from '../sheet/vmtracker/TabPaneGpuResourceVmTracker.js'; +import { TabPaneGpuGraph } from '../sheet/gpu/TabPaneGraph.js'; export let tabConfig: any = { 'current-selection': { @@ -411,15 +414,19 @@ export let tabConfig: any = { type: TabPaneSmapsStatistics, require: (param: SelectionParam) => param.smapsType.length > 0, }, - 'box-smaps-record': { + 'box-smaps-sample': { title: 'Smaps sample', - type: TabPaneSmapsRecord, + type: TabPaneSmapsSample, require: (param: SelectionParam) => param.smapsType.length > 0, }, 'box-smaps-comparison': { title: 'Smaps Comparison', type: TabPaneSmapsComparison, }, + 'box-smaps-record': { + title: 'Smaps Record', + type: TabPaneSmapsRecord, + }, 'box-vmtracker-shm': { title: 'SHM', type: TabPaneVmTrackerShm, @@ -482,6 +489,11 @@ export let tabConfig: any = { type: TabPaneGpuGL, require: (param: SelectionParam) => param.gpu.gl, }, + 'gpu-graph-box-select': { + title: 'Graph', + type: TabPaneGpuGraph, + require: (param: SelectionParam) => param.gpu.graph, + }, 'gpu-total-box-select': { title: 'Gpu Total', type: TabPaneGpuTotalBoxSelect, @@ -550,6 +562,10 @@ export let tabConfig: any = { type: TabPaneGpuMemoryVmTracker, require: (param: SelectionParam) => param.gpuMemoryTrackerData.length > 0, }, + 'box-smaps-gpu-resource': { + title: 'Gpu Resource', + type: TabPaneGpuResourceVmTracker, + }, 'box-dma-selection-vmTracker': { title: 'DMA Selection', type: TabPaneDmaSelectVmTracker, diff --git a/ide/src/trace/component/trace/base/Utils.ts b/ide/src/trace/component/trace/base/Utils.ts index 1e207b26eb378034f11907c3914578c544258849..09d569dd29b50208b3597bbd928a1c745d2b9383 100644 --- a/ide/src/trace/component/trace/base/Utils.ts +++ b/ide/src/trace/component/trace/base/Utils.ts @@ -49,14 +49,12 @@ export class Utils { Utils.statusMap.set('t', 'Traced'); Utils.statusMap.set('X', 'Exit (Dead)'); Utils.statusMap.set('Z', 'Exit (Zombie)'); - Utils.statusMap.set('K', 'Wake Kill'); - Utils.statusMap.set('W', 'Waking'); Utils.statusMap.set('P', 'Parked'); Utils.statusMap.set('N', 'No Load'); } public static getInstance(): Utils { - if (Utils.instance == null) { + if (Utils.instance === null) { Utils.instance = new Utils(); } return Utils.instance; @@ -72,7 +70,7 @@ export class Utils { if (Utils.getInstance().getStatusMap().has(state)) { return Utils.getInstance().getStatusMap().get(state) || 'Unknown State'; } else { - if ('' == state || state == null) { + if ('' === state || state === null) { return ''; } return 'Unknown State'; @@ -81,13 +79,13 @@ export class Utils { public static transferPTSTitle(value: any) { if (value.startsWith('S-')) { - return Utils.getEndState(value.replace('S-','')); + return Utils.getEndState(value.replace('S-', '')); } else if (value.startsWith('P-')) { - let pid = value.replace('P-',''); + let pid = value.replace('P-', ''); let process = Utils.PROCESS_MAP.get(parseInt(pid)) || 'Process'; return `${process} [${pid}]`; } else if (value.startsWith('T-')) { - let tid = value.replace('T-',''); + let tid = value.replace('T-', ''); let thread = Utils.THREAD_MAP.get(parseInt(tid)) || 'Thread'; return `${thread} [${tid}]`; } else { @@ -96,19 +94,19 @@ export class Utils { } public static getStateColor(state: string): string { - if (state == 'D-NIO' || state == 'DK-NIO') { + if (state === 'D-NIO' || state === 'DK-NIO') { return '#795548'; - } else if (state == 'D-IO' || state == 'DK-IO' || state == 'D' || state == 'DK') { + } else if (state === 'D-IO' || state === 'DK-IO' || state === 'D' || state === 'DK') { return '#f19b38'; - } else if (state == 'R' || state == 'R+') { + } else if (state === 'R' || state === 'R+') { return '#a0b84d'; - } else if (state == 'R-B') { + } else if (state === 'R-B') { return '#87CEFA'; - } else if (state == 'I') { + } else if (state === 'I') { return '#673ab7'; - } else if (state == 'Running') { + } else if (state === 'Running') { return '#467b3b'; - } else if (state == 'S') { + } else if (state === 'S') { return '#e0e0e0'; } else { return '#ff6e40'; @@ -146,7 +144,7 @@ export class Utils { if (currentTime > 0) { res += currentTime + 'ns '; } - if (res == '') { + if (res === '') { res = ns + ''; } return res; @@ -172,7 +170,7 @@ export class Utils { res += (currentNs / probablyMicrosecond1).toFixed(2) + 'μs '; } else if (currentNs > 0) { res += currentNs + 'ns '; - } else if (res == '') { + } else if (res === '') { res = timeNs + ''; } return res; @@ -209,7 +207,7 @@ export class Utils { if (currentNs > 0) { res += currentNs + ''; } - if (res == '') { + if (res === '') { res = ns + ''; } return res; @@ -277,7 +275,7 @@ export class Utils { result += currentNs.toFixed(2) + 'ms'; return result; } - if (result == '') { + if (result === '') { result = '0s'; } return result; @@ -291,7 +289,7 @@ export class Utils { } public static getBinaryKBWithUnit(kbytes: number): string { - if (kbytes == 0) { + if (kbytes === 0) { return '0KB'; } let currentBytes = kbytes; @@ -309,7 +307,7 @@ export class Utils { } public static getBinaryByteWithUnit(bytes: number): string { - if (bytes == 0) { + if (bytes === 0) { return '0Bytes'; } let currentBytes = bytes; @@ -370,7 +368,7 @@ export class Utils { if (currentNs > 0) { res += this.getCompletionTime(currentNs, 3); } - if (res == '') { + if (res === '') { res = ns + ''; } return res; @@ -390,23 +388,23 @@ export class Utils { res += Math.floor(currentNs / millisecond1) + ' ms '; return res; } - if (res == '') { + if (res === '') { res = ns + ''; } return res; } private static getCompletionTime(time: number, maxLength: number): string { - if (maxLength == 2) { - if (time.toString().length == 2) { + if (maxLength === 2) { + if (time.toString().length === 2) { return '' + time; } else { return '0' + time; } - } else if (maxLength == 3) { - if (time.toString().length == 3) { + } else if (maxLength === 3) { + if (time.toString().length === 3) { return time.toString(); - } else if (time.toString().length == 2) { + } else if (time.toString().length === 2) { return '0' + time; } else { return '00' + time; diff --git a/ide/src/trace/component/trace/search/Search.ts b/ide/src/trace/component/trace/search/Search.ts index 290fa9b228ac318f0c93bb293b0c4f12e4e156cb..79ba4d95a06c529054f2fbe413e01755000e8baa 100644 --- a/ide/src/trace/component/trace/search/Search.ts +++ b/ide/src/trace/component/trace/search/Search.ts @@ -144,11 +144,11 @@ export class LitSearch extends BaseElement { return; } this.lastSearch = searchStr; - let searchInfo = this.searchList.find(searchInfo => searchInfo.searchContent === searchStr); + let searchInfo = this.searchList.find((searchInfo) => searchInfo.searchContent === searchStr); if (searchInfo != undefined) { searchInfo.useCount += 1; } else { - this.searchList.push({searchContent: searchStr, useCount: 1}); + this.searchList.push({ searchContent: searchStr, useCount: 1 }); } } @@ -350,7 +350,10 @@ export class LitSearch extends BaseElement { overflow-y: auto; display: none; border-radius: 0 0 20px 20px; - } + } + .search-history-list:hover{ + cursor: pointer; + } .search-history-list-item { cursor: pointer; width: 100%; @@ -444,7 +447,7 @@ export class LitSearch extends BaseElement { updateSearchHistoryList(searchValue: string) { const keyword = searchValue.toLowerCase(); - this.searchELList.forEach(item => { + this.searchELList.forEach((item) => { if (item.textContent!.toLowerCase().includes(keyword)) { item.style.display = 'block'; } else { @@ -452,10 +455,9 @@ export class LitSearch extends BaseElement { } }); } - } export interface SearchInfo { - searchContent: string - useCount: number + searchContent: string; + useCount: number; } diff --git a/ide/src/trace/component/trace/sheet/SheetUtils.ts b/ide/src/trace/component/trace/sheet/SheetUtils.ts index 216cb0e544b1bc2edc0ff6254ace95b805484c9b..b8676097319a142a8d8627080de98946822767d2 100644 --- a/ide/src/trace/component/trace/sheet/SheetUtils.ts +++ b/ide/src/trace/component/trace/sheet/SheetUtils.ts @@ -22,9 +22,9 @@ export function resizeObserver( tblOffsetHeight: number = 50, loadingPage?: HTMLElement, loadingPageOffsetHeight: number = 24 -) { +): void { new ResizeObserver((entries) => { - if (parentEl.clientHeight != 0) { + if (parentEl.clientHeight !== 0) { // @ts-ignore tableEl?.shadowRoot.querySelector('.table').style.height = parentEl.clientHeight - tblOffsetHeight + 'px'; tableEl?.reMeauseHeight(); @@ -40,10 +40,10 @@ export function resizeObserverFromMemory( tableEl: LitTable, filterEl: HTMLElement, tblOffsetHeight: number = 45 -) { +): void { new ResizeObserver((entries) => { let filterHeight = 0; - if (parentElement.clientHeight != 0) { + if (parentElement.clientHeight !== 0) { // @ts-ignore tableEl?.shadowRoot.querySelector('.table').style.height = parentElement.clientHeight - tblOffsetHeight + 'px'; tableEl?.reMeauseHeight(); @@ -59,7 +59,7 @@ export function resizeObserverFromMemory( }).observe(parentElement); } -export function showButtonMenu(filter: any, isShow: boolean) { +export function showButtonMenu(filter: any, isShow: boolean): void { if (isShow) { filter.setAttribute('tree', ''); filter.setAttribute('input', ''); diff --git a/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts b/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts index ef32b9b45f2406720006fe3433981510d9d67117..5bd9a51ba8d385242e112fd74d8911e13f5c1f20 100644 --- a/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts @@ -30,8 +30,8 @@ export class TabPaneCurrent extends BaseElement { initElements(): void { this.systemTrace = document - .querySelector('body > sp-application')! - .shadowRoot!.querySelector('#sp-system-trace'); + .querySelector('body > sp-application')?. + shadowRoot!.querySelector('#sp-system-trace'); this.panelTable = this.shadowRoot!.querySelector('.notes-editor-panel'); this.panelTable!.addEventListener('row-click', (evt: any) => { // 点击表格某一行后,背景变色 diff --git a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts index 65a77d14775305b8f0ddd5dbf9fa3b4e3345d05b..90f10b4e67c21791060aa6b5ae5287ab37a7bbb3 100644 --- a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts @@ -14,7 +14,7 @@ */ import { BaseElement, element } from '../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../base-ui/table/lit-table.js'; +import { type LitTable } from '../../../../base-ui/table/lit-table.js'; import '../../../../base-ui/table/lit-table-column.js'; import { @@ -31,7 +31,7 @@ import { queryThreadWakeUpFrom, queryWakeupListPriority, } from '../../../database/SqlLite.js'; -import { WakeupBean } from '../../../bean/WakeupBean.js'; +import { type WakeupBean } from '../../../bean/WakeupBean.js'; import { SpApplication } from '../../../SpApplication.js'; import { TraceRow } from '../base/TraceRow.js'; import { CpuStruct } from '../../../database/ui-worker/ProcedureWorkerCPU.js'; @@ -47,8 +47,8 @@ import { Utils } from '../base/Utils.js'; import { SpSystemTrace } from '../../SpSystemTrace.js'; import { AppStartupStruct } from '../../../database/ui-worker/ProcedureWorkerAppStartup.js'; import { SoStruct } from '../../../database/ui-worker/ProcedureWorkerSoInit.js'; -import { SelectionParam } from '../../../bean/BoxSelection.js'; -import { FrameAnimationStruct } from '../../../database/ui-worker/ProcedureWorkerFrameAnimation.js'; +import { type SelectionParam } from '../../../bean/BoxSelection.js'; +import { type FrameAnimationStruct } from '../../../database/ui-worker/ProcedureWorkerFrameAnimation.js'; const INPUT_WORD = 'This is the interval from when the task became eligible to run \n(e.g.because of notifying a wait queue it was a suspended on) to\n when it started running.'; @@ -153,8 +153,6 @@ export class TabPaneCurrentSelection extends BaseElement {
    `, }); } - - list.push({ name: 'CmdLine', value: `${data.processCmdLine}` }); list.push({ name: 'StartTime(Relative)', value: getTimeString(data.startTime || 0), @@ -405,7 +403,7 @@ export class TabPaneCurrentSelection extends BaseElement { if (leftTitle) { leftTitle.innerText = 'Counter Details'; } - let list: any[] = []; + let list: object[] = []; list.push({ name: 'StartTime(Relative)', value: getTimeString(data.startTime || 0), @@ -431,7 +429,7 @@ export class TabPaneCurrentSelection extends BaseElement { if (leftTitle) { leftTitle.innerText = 'Counter Details'; } - let list: any[] = []; + let list: object[] = []; list.push({ name: 'StartTime(Relative)', value: getTimeString(data.startNS || 0), @@ -968,7 +966,10 @@ export class TabPaneCurrentSelection extends BaseElement { value: ((dataTs || 0) + (window as any).recordStartNS) / 1000000000, }); list.push({ name: 'End time(Relative)', value: `${Utils.getTimeString(dataTs + (data.dur || 0))}` }); - list.push({ name: 'End time(Absolute)', value: ((dataTs + (data.dur || 0)) + (window as any).recordStartNS) / 1000000000}); + list.push({ + name: 'End time(Absolute)', + value: (dataTs + (data.dur || 0) + (window as any).recordStartNS) / 1000000000, + }); list.push({ name: 'Duration', value: `${Utils.getTimeString(data.dur || 0)}` }); if (data.status === 'Completion delay') { let frameFpsMessage = data.frameInfo?.split(':'); @@ -1223,7 +1224,7 @@ export class TabPaneCurrentSelection extends BaseElement { this.currentSelectionTbl = this.shadowRoot?.querySelector('#selectionTbl'); this.wakeupListTbl = this.shadowRoot?.querySelector('#wakeupListTbl'); this.scrollView = this.shadowRoot?.querySelector('#scroll_view'); - this.currentSelectionTbl?.addEventListener('column-click', (ev: any) => {}); + this.currentSelectionTbl?.addEventListener('column-click', (ev: any) => { }); window.subscribe(window.SmartEvent.UI.WakeupList, (data: Array) => this.showWakeupListTableData(data)); } @@ -1263,18 +1264,18 @@ export class TabPaneCurrentSelection extends BaseElement { maxDuration = Math.max(maxDuration, this.selectWakeupBean.dur); maxPriority = Math.max(maxPriority, this.selectWakeupBean.priority); } - resource.forEach(it => { + resource.forEach((it) => { if (it.priority === maxPriority) { maxPriorityDuration = Math.max(it.dur || 0, maxPriorityDuration); } }); - this.wakeupListTbl!.getItemTextColor = ((data: any) => { + this.wakeupListTbl!.getItemTextColor = (data: any) => { if ((data.priority === maxPriority && data.dur === maxPriorityDuration) || data.dur === maxDuration) { return '#f44336'; } else { return '#262626'; } - }); + }; this.wakeupListTbl!.recycleDataSource = resource; }); } diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneCpuAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneCpuAbility.ts index 2bd4dbba4e7a737c208d1dbb34cb44be7828351a..8a4ef83925082ee30b88ab06ec75411571278615 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneCpuAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneCpuAbility.ts @@ -138,8 +138,11 @@ export class TabPaneCpuAbility extends BaseElement { function compare(property, sort, type) { return function (cpuAbilityLeftData: SystemCpuSummary, cpuAbilityRightData: SystemCpuSummary) { if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(cpuAbilityRightData[property]) - parseFloat(cpuAbilityLeftData[property]) : parseFloat(cpuAbilityLeftData[property]) - parseFloat(cpuAbilityRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(cpuAbilityRightData[property]) - parseFloat(cpuAbilityLeftData[property]) + : // @ts-ignore + parseFloat(cpuAbilityLeftData[property]) - parseFloat(cpuAbilityRightData[property]); } else if (type === 'durationStr') { return sort === 2 ? cpuAbilityRightData.duration - cpuAbilityLeftData.duration diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneDiskAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneDiskAbility.ts index 3882a5ad7ed688052c7027193f8935ea70a672b9..a295d77b7de79cd261b9192e57b47ae2846e92f6 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneDiskAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneDiskAbility.ts @@ -153,8 +153,11 @@ export class TabPaneDiskAbility extends BaseElement { function compare(property, sort, type) { return function (diskAbilityLeftData: SystemDiskIOSummary, diskAbilityRightData: SystemDiskIOSummary) { if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(diskAbilityRightData[property]) - parseFloat(diskAbilityLeftData[property]) : parseFloat(diskAbilityLeftData[property]) - parseFloat(diskAbilityRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(diskAbilityRightData[property]) - parseFloat(diskAbilityLeftData[property]) + : // @ts-ignore + parseFloat(diskAbilityLeftData[property]) - parseFloat(diskAbilityRightData[property]); } else if (type === 'durationStr') { return sort === 2 ? diskAbilityRightData.duration - diskAbilityLeftData.duration diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneDmaAbilityComparison.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneDmaAbilityComparison.ts index 0fba69b1331c97b7c37758060b8670675b94a4a2..7d1d310e930a3d3a0e996e7cdc877874f49ffc3f 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneDmaAbilityComparison.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneDmaAbilityComparison.ts @@ -14,16 +14,16 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; +import { type LitSelect } from '../../../../../base-ui/select/LitSelect.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { DmaComparison } from '../../../../bean/AbilityMonitor.js'; import { getTabDmaAbilityComparisonData } from '../../../../database/SqlLite.js'; -import { SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; +import { type SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; import { Utils } from '../../base/Utils.js'; import { compare, resizeObserverFromMemory } from '../SheetUtils.js'; import '../TabPaneJsMemoryFilter.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; @element('tabpane-dma-ability-comparison') export class TabPaneDmaAbilityComparison extends BaseElement { @@ -104,7 +104,7 @@ export class TabPaneDmaAbilityComparison extends BaseElement { }); } - async getComparisonData(targetStartNs: number) { + async getComparisonData(targetStartNs: number): Promise { let comparisonData: DmaComparison[] = []; let comparison: DmaComparison[] = []; const data = await this.queryDataByDB(targetStartNs); diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneDmaSelectAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneDmaSelectAbility.ts index acb90faf7bae6876d857aed19cb8f5a61baf96fb..64852bcbdf09a8117b1e6189086a4ce54ee90d9c 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneDmaSelectAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneDmaSelectAbility.ts @@ -14,8 +14,8 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { Dma } from '../../../../bean/AbilityMonitor.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type Dma } from '../../../../bean/AbilityMonitor.js'; import { getTabDmaAbilityClickData } from '../../../../database/SqlLite.js'; import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; import { SpSystemTrace } from '../../../SpSystemTrace.js'; @@ -42,7 +42,8 @@ export class TabPaneDmaSelectAbility extends BaseElement { new ResizeObserver(() => { if (this.parentElement?.clientHeight !== 0) { // @ts-ignore - this.damClickTable?.shadowRoot?.querySelector('.table').style.height = (this.parentElement?.clientHeight - 18) + 'px'; + this.damClickTable?.shadowRoot?.querySelector('.table').style.height = + this.parentElement!.clientHeight - 18 + 'px'; this.parentElement!.style.overflow = 'hidden'; this.damClickTable?.reMeauseHeight(); } diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemoryAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemoryAbility.ts index aace2158d2247cf9bf29098b693da05b6218221a..a893001780f2fa1264baeac5089471835c4789f7 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemoryAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemoryAbility.ts @@ -14,8 +14,8 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { GpuMemory } from '../../../../bean/AbilityMonitor.js'; import { resizeObserver } from '../SheetUtils.js'; import { getTabGpuMemoryAbilityData } from '../../../../database/SqlLite.js'; diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemoryComparison.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemoryComparison.ts index bc64887227ce78cf1c6506d9828067738d4a1740..dc97d6a1567486bb4f36cd316ef2b7a2b91b6331 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemoryComparison.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemoryComparison.ts @@ -16,15 +16,15 @@ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { GpuMemoryComparison } from '../../../../bean/AbilityMonitor.js'; import { getTabGpuMemoryComparisonData } from '../../../../database/SqlLite.js'; -import { SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; +import { type SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; import { SpSystemTrace } from '../../../SpSystemTrace.js'; import { Utils } from '../../base/Utils.js'; import { compare, resizeObserverFromMemory } from '../SheetUtils.js'; import '../TabPaneJsMemoryFilter.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; @element('tabpane-gpu-memory-comparison') export class TabPaneGpuMemoryComparison extends BaseElement { @@ -107,7 +107,7 @@ export class TabPaneGpuMemoryComparison extends BaseElement { }); } - async getComparisonData(targetStartNs: number) { + async getComparisonData(targetStartNs: number): Promise { let comparisonData: GpuMemoryComparison[] = []; let comparison: GpuMemoryComparison[] = []; let data = await this.queryDataByDB(targetStartNs); diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemorySelectAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemorySelectAbility.ts index 84283bbc12f6e5689d545add122ed0961995534b..0cd5617ee92a0e1340ac24c634bab1bbb911ca15 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemorySelectAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneGpuMemorySelectAbility.ts @@ -14,8 +14,8 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { GpuMemory } from '../../../../bean/AbilityMonitor.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type GpuMemory } from '../../../../bean/AbilityMonitor.js'; import { getTabGpuMemoryAbilityClickData } from '../../../../database/SqlLite.js'; import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; import { Utils } from '../../base/Utils.js'; diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneHistoryProcesses.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneHistoryProcesses.ts index 7bcc918449d0e5e9a3c3bd58437873bed8a141d7..31dc1b0f51e7b2a993b4c6228c673e13611eb690 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneHistoryProcesses.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneHistoryProcesses.ts @@ -31,7 +31,8 @@ export class TabPaneHistoryProcesses extends BaseElement { set data(historyProcessValue: SelectionParam | any) { // @ts-ignore - this.historyProcessTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 45 + 'px'; + this.historyProcessTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 45 + 'px'; this.queryDataByDB(historyProcessValue); } @@ -164,8 +165,11 @@ export class TabPaneHistoryProcesses extends BaseElement { function compare(property, sort, type) { return function (historyProcessLeftData: ProcessHistory, historyProcessRightData: ProcessHistory) { if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(historyProcessRightData[property]) - parseFloat(historyProcessLeftData[property]) : parseFloat(historyProcessLeftData[property]) - parseFloat(historyProcessRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(historyProcessRightData[property]) - parseFloat(historyProcessLeftData[property]) + : // @ts-ignore + parseFloat(historyProcessLeftData[property]) - parseFloat(historyProcessRightData[property]); } else if (type === 'cpuTime') { return sort === 2 ? historyProcessRightData.cpuTimeNumber - historyProcessLeftData.cpuTimeNumber diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneLiveProcesses.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneLiveProcesses.ts index 03b6ebd69382041d452614cbc01cc5aa852cdde8..9042fd211dc136c3f869b5fdc8e564c6df91380a 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneLiveProcesses.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneLiveProcesses.ts @@ -164,8 +164,11 @@ export class TabPaneLiveProcesses extends BaseElement { function compare(property, sort, type) { return function (liveProcessLeftData: LiveProcess, liveProcessRightData: LiveProcess) { if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(liveProcessRightData[property]) - parseFloat(liveProcessLeftData[property]) : parseFloat(liveProcessLeftData[property]) - parseFloat(liveProcessRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(liveProcessRightData[property]) - parseFloat(liveProcessLeftData[property]) + : // @ts-ignore + parseFloat(liveProcessLeftData[property]) - parseFloat(liveProcessRightData[property]); } else if (type === 'cpuTime') { return sort === 2 ? liveProcessRightData.cpuTimeNumber - liveProcessLeftData.cpuTimeNumber diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneMemoryAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneMemoryAbility.ts index 0bd0a7ee1d62207857eda6ff098a29c200e982b1..6c44e049f54a995ea4a28bd3a15521e06c32988d 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneMemoryAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneMemoryAbility.ts @@ -31,7 +31,8 @@ export class TabPaneMemoryAbility extends BaseElement { set data(memoryAbilityValue: SelectionParam | any) { // @ts-ignore - this.memoryAbilityTbl?.shadowRoot?.querySelector('.table').style.height = this.parentElement.clientHeight - 45 + 'px'; + this.memoryAbilityTbl?.shadowRoot?.querySelector('.table').style.height = + this.parentElement!.clientHeight - 45 + 'px'; this.queryDataByDB(memoryAbilityValue); } @@ -233,8 +234,11 @@ export class TabPaneMemoryAbility extends BaseElement { function compare(property, sort, type) { return function (memoryAbilityLeftData: SystemMemorySummary, memoryAbilityRightData: SystemMemorySummary) { if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(memoryAbilityRightData[property]) - parseFloat(memoryAbilityLeftData[property]) : parseFloat(memoryAbilityLeftData[property]) - parseFloat(memoryAbilityRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(memoryAbilityRightData[property]) - parseFloat(memoryAbilityLeftData[property]) + : // @ts-ignore + parseFloat(memoryAbilityLeftData[property]) - parseFloat(memoryAbilityRightData[property]); } else if (type === 'durationStr') { return sort === 2 ? memoryAbilityRightData.durationNumber - memoryAbilityLeftData.durationNumber diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneNetworkAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneNetworkAbility.ts index 96f4119c80c122b8828a4d6f9cfad81a94e05d08..ce1b7c4fc32596fe1c74f99436f683b29f2ee8ed 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneNetworkAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneNetworkAbility.ts @@ -33,7 +33,8 @@ export class TabPaneNetworkAbility extends BaseElement { set data(networkAbilityValue: SelectionParam | any) { // @ts-ignore - this.networkAbilityTbl?.shadowRoot?.querySelector('.table').style.height = this.parentElement.clientHeight - 45 + 'px'; + this.networkAbilityTbl?.shadowRoot?.querySelector('.table').style.height = + this.parentElement!.clientHeight - 45 + 'px'; this.queryDataByDB(networkAbilityValue); } @@ -144,8 +145,11 @@ export class TabPaneNetworkAbility extends BaseElement { function compare(property, sort, type) { return function (networkAbilityLeftData: SystemNetworkSummary, networkAbilityRightData: SystemNetworkSummary) { if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(networkAbilityRightData[property]) - parseFloat(networkAbilityLeftData[property]) : parseFloat(networkAbilityLeftData[property]) - parseFloat(networkAbilityRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(networkAbilityRightData[property]) - parseFloat(networkAbilityLeftData[property]) + : // @ts-ignore + parseFloat(networkAbilityLeftData[property]) - parseFloat(networkAbilityRightData[property]); } else if (type === 'durationStr') { return sort === 2 ? networkAbilityRightData.duration - networkAbilityLeftData.duration diff --git a/ide/src/trace/component/trace/sheet/ability/TabPanePurgPin.ts b/ide/src/trace/component/trace/sheet/ability/TabPanePurgPin.ts index 8276aea0165df31423faeb72d2411b0a2c1ee325..87db520d57b7e46ad576d55ef24e3355e9ebd070 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPanePurgPin.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPanePurgPin.ts @@ -14,8 +14,8 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { queryProcessPurgeableTab, querySysPurgeableTab } from '../../../../database/SqlLite.js'; import { Utils } from '../../base/Utils.js'; @@ -33,9 +33,8 @@ export class TabPanePurgPin extends BaseElement { set data(selection: SelectionParam) { //@ts-ignore - this.purgeablePinTable?.shadowRoot?.querySelector('.table')?.style?.height = `${ - this.parentElement!.clientHeight - 45 - }px`; + this.purgeablePinTable?.shadowRoot?.querySelector('.table')?.style?.height = `${this.parentElement!.clientHeight - 45 + }px`; this.init(); this.purgPinTimeRange!.textContent = 'Selected range: ' + ((selection.rightNs - selection.leftNs) / 1000000.0).toFixed(5) + ' ms'; @@ -53,7 +52,12 @@ export class TabPanePurgPin extends BaseElement { if (purgePinResults.length > 0) { for (let i = 0; i < purgePinResults.length; i++) { this.purgeablePinSource.push( - this.toTabStruct(purgePinResults[i].name, purgePinResults[i].maxSize, purgePinResults[i].minSize, purgePinResults[i].avgSize) + this.toTabStruct( + purgePinResults[i].name, + purgePinResults[i].maxSize, + purgePinResults[i].minSize, + purgePinResults[i].avgSize + ) ); } this.sortByColumn({ key: this.sortKey, sort: this.sortType }); @@ -95,7 +99,7 @@ export class TabPanePurgPin extends BaseElement { } } - private init() { + private init(): void { const thTable = this.tabTitle!.querySelector('.th'); const purgePinTblNodes = thTable!.querySelectorAll('div'); if (this.tabTitle!.hasAttribute('sort')) { @@ -110,7 +114,11 @@ export class TabPanePurgPin extends BaseElement { this.sortType = 2; } - private toTabStruct(type: string, maxPurgePinSize: number, minPurgePinSize: number, avgPurgePinSize: number + private toTabStruct( + type: string, + maxPurgePinSize: number, + minPurgePinSize: number, + avgPurgePinSize: number ): PurgeableTabStruct { const tabStruct = new PurgeableTabStruct( type, @@ -150,7 +158,9 @@ export class TabPanePurgPin extends BaseElement { } if (type === 'number') { // @ts-ignore - return sort === 2 ? parseFloat(purgePinRightData[key]) - parseFloat(purgePinLeftData[key]) : parseFloat(purgePinLeftData[key]) - parseFloat(purgePinRightData[key]); + return sort === 2 + ? parseFloat(purgePinRightData[key]) - parseFloat(purgePinLeftData[key]) + : parseFloat(purgePinLeftData[key]) - parseFloat(purgePinRightData[key]); } else { if (sort === 2) { return purgePinRightData[key].toString().localeCompare(purgePinLeftData[key].toString()); diff --git a/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.ts index 6352b1d9b67d8da387375d3649a696fd579c1da9..f29bba5f295c2c8eee1e5b797051c3111c22d8eb 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.ts @@ -13,14 +13,14 @@ * limitations under the License. */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitSelect } from '../../../../../base-ui/select/LitSelect.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { querySysPurgeableSelectionTab } from '../../../../database/SqlLite.js'; import { Utils } from '../../base/Utils.js'; import { CompareStruct, compare, resizeObserverFromMemory } from '../SheetUtils.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; @element('tabpane-purgeable-pin-comparison-ability') export class TabPanePurgPinComparisonAbility extends BaseElement { private purgeablePinTable: LitTable | null | undefined; @@ -35,9 +35,8 @@ export class TabPanePurgPinComparisonAbility extends BaseElement { } public totalData(purgePinComParam: SelectionParam | any, dataList: any): void { //@ts-ignore - this.purgeablePinTable?.shadowRoot?.querySelector('.table')?.style?.height = `${ - this.parentElement!.clientHeight - 45 - }px`; + this.purgeablePinTable?.shadowRoot?.querySelector('.table')?.style?.height = `${this.parentElement!.clientHeight - 45 + }px`; this.purgeablePinSource = []; let fileArr: any[] = []; for (let file of dataList) { diff --git a/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinSelection.ts b/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinSelection.ts index 3e478d0c63274ba1477508e6a25f81ec7985f6e9..ad11968a72e7a57bf3e6fffe1e9448d353abe54b 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinSelection.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPanePurgPinSelection.ts @@ -14,9 +14,9 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { queryProcessPurgeableSelectionTab, querySysPurgeableSelectionTab } from '../../../../database/SqlLite.js'; import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; import { Utils } from '../../base/Utils.js'; @@ -33,7 +33,7 @@ export class TabPanePurgPinSelection extends BaseElement { } } - async queryTableData(type: string, startNs: number) { + async queryTableData(type: string, startNs: number): Promise { if (type === 'ability') { await querySysPurgeableSelectionTab(startNs, true).then((purgePinSelectResults) => { this.purgeableSelectionSource = []; @@ -84,7 +84,7 @@ export class TabPanePurgPinSelection extends BaseElement { } - + diff --git a/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotal.ts b/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotal.ts index efe001c676f02fe715679b0c13ef7b4c52f3e222..866804c83a3ac1441a9bd26fab3a44e3b3f5fd23 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotal.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotal.ts @@ -14,8 +14,8 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { querySysPurgeableTab, queryProcessPurgeableTab } from '../../../../database/SqlLite.js'; import { Utils } from '../../base/Utils.js'; @@ -31,9 +31,8 @@ export class TabPanePurgTotal extends BaseElement { private sortType = 2; set data(selection: SelectionParam) { //@ts-ignore - this.purgeableTotalTable?.shadowRoot?.querySelector('.table')?.style?.height = `${ - this.parentElement!.clientHeight - 45 - }px`; + this.purgeableTotalTable?.shadowRoot?.querySelector('.table')?.style?.height = `${this.parentElement!.clientHeight - 45 + }px`; this.init(); this.purgTotalTimeRange!.textContent = 'Selected range: ' + ((selection.rightNs - selection.leftNs) / 1000000.0).toFixed(5) + ' ms'; @@ -51,7 +50,12 @@ export class TabPanePurgTotal extends BaseElement { if (purgeTotalResults.length > 0) { for (let i = 0; i < purgeTotalResults.length; i++) { this.purgeableTotalSource.push( - this.toTabStruct(purgeTotalResults[i].name, purgeTotalResults[i].maxSize, purgeTotalResults[i].minSize, purgeTotalResults[i].avgSize) + this.toTabStruct( + purgeTotalResults[i].name, + purgeTotalResults[i].maxSize, + purgeTotalResults[i].minSize, + purgeTotalResults[i].avgSize + ) ); } this.sortByColumn({ key: this.sortKey, sort: this.sortType }); @@ -92,7 +96,7 @@ export class TabPanePurgTotal extends BaseElement { } } - private init() { + private init(): void { const thTable = this.tabTitle!.querySelector('.th'); const purgeTotalTblNode = thTable!.querySelectorAll('div'); if (this.tabTitle!.hasAttribute('sort')) { @@ -146,7 +150,9 @@ export class TabPanePurgTotal extends BaseElement { } if (type === 'number') { // @ts-ignore - return sort === 2 ? parseFloat(purgeTotalRightData[key]) - parseFloat(purgeTotalLeftData[key]) : parseFloat(purgeTotalLeftData[key]) - parseFloat(purgeTotalRightData[key]); + return sort === 2 + ? parseFloat(purgeTotalRightData[key]) - parseFloat(purgeTotalLeftData[key]) + : parseFloat(purgeTotalLeftData[key]) - parseFloat(purgeTotalRightData[key]); } else { if (sort === 2) { return purgeTotalRightData[key].toString().localeCompare(purgeTotalLeftData[key].toString()); diff --git a/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.ts index 6f3deb49ba68ab2b0c2b5baa77bd114abf1b438f..43ef75b5b61c693ce66a20f27394e8e407243df3 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.ts @@ -13,14 +13,14 @@ * limitations under the License. */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; +import { type LitSelect } from '../../../../../base-ui/select/LitSelect.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { querySysPurgeableSelectionTab } from '../../../../database/SqlLite.js'; import { Utils } from '../../base/Utils.js'; import { CompareStruct, compare, resizeObserverFromMemory } from '../SheetUtils.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; @element('tabpane-purgeable-total-comparison-ability') export class TabPanePurgTotalComparisonAbility extends BaseElement { private purgeableTotalTable: LitTable | null | undefined; @@ -35,9 +35,8 @@ export class TabPanePurgTotalComparisonAbility extends BaseElement { } public totalData(purgeTotalComParam: SelectionParam | any, dataList: any): void { //@ts-ignore - this.purgeableTotalTable?.shadowRoot?.querySelector('.table')?.style?.height = `${ - this.parentElement!.clientHeight - 45 - }px`; + this.purgeableTotalTable?.shadowRoot?.querySelector('.table')?.style?.height = `${this.parentElement!.clientHeight - 45 + }px`; this.purgeableTotalSource = []; let fileArr: any[] = []; for (let file of dataList) { diff --git a/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalSelection.ts b/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalSelection.ts index f01f7783f67f8c349aa9440d846915bc40727a87..e12941a5531b7a45193f65459e6cce64c5d91cb6 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalSelection.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPanePurgTotalSelection.ts @@ -14,8 +14,8 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { queryProcessPurgeableSelectionTab, querySysPurgeableSelectionTab } from '../../../../database/SqlLite.js'; import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; @@ -33,7 +33,7 @@ export class TabPanePurgTotalSelection extends BaseElement { } } - async queryTableData(type: string, startNs: number) { + async queryTableData(type: string, startNs: number): Promise { if (type === 'ability') { await querySysPurgeableSelectionTab(startNs).then((purgeTotalSelectResults) => { this.purgeableSelectionSource = []; diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts index 64c5a9668e4933779bc0b222f55954fdf96a0e40..6e005e7c8ae9101960b382e36bb468a8213fcf5f 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts @@ -72,7 +72,7 @@ export class TabPaneComparison extends BaseElement { } item.deltaCount = '-'; item.deltaSize = '-'; - if (item.edgeName != '') { + if (item.edgeName !== '') { item.objectName = item.edgeName + '\xa0' + '::' + '\xa0' + nodeName; } else { if (item.fileId == this.baseFileId) { @@ -100,7 +100,7 @@ export class TabPaneComparison extends BaseElement { } else { clickRow.status = true; } - if (this.search!.value != '') { + if (this.search!.value !== '') { if (this.leftTheadTable!.hasAttribute('sort')) { this.comparisonTableEl!.snapshotDataSource = this.leftArray; } else { @@ -128,7 +128,7 @@ export class TabPaneComparison extends BaseElement { let i = 0; let that = this; let retainsTable = () => { - const getList = (comList: Array) => { + const getList = (comList: Array): void => { comList.forEach((row) => { let shallow = Math.round((row.shallowSize / this.fileSize) * 100) + '%'; let retained = Math.round((row.retainedSize / this.fileSize) * 100) + '%'; @@ -136,13 +136,13 @@ export class TabPaneComparison extends BaseElement { row.retainedPercent = retained; let nodeId = row.nodeName + ` @${row.id}`; row.objectName = row.edgeName + '\xa0' + 'in' + '\xa0' + nodeId; - if (row.distance >= 100000000 || row.distance == -5) { + if (row.distance >= 100000000 || row.distance === -5) { // @ts-ignore row.distance = '-'; } i++; // @ts-ignore - if (i < that.retainsData[0].distance - 1 && comList[0].distance != '-') { + if (i < that.retainsData[0].distance - 1 && comList[0].distance !== '-') { comList[0].getChildren(); comList[0].expanded = false; if (row.hasNext) { @@ -223,7 +223,7 @@ export class TabPaneComparison extends BaseElement { } i++; // @ts-ignore - if (i < that.retainsData[0].distance - 1 && list[0].distance != '-') { + if (i < that.retainsData[0].distance - 1 && list[0].distance !== '-') { list[0].getChildren(); list[0].expanded = false; if (structRow.hasNext) { @@ -297,7 +297,7 @@ export class TabPaneComparison extends BaseElement { this.comparisonTableEl!.reMeauseHeight(); } - initSelect(fileId: number, comFileArr: Array) { + initSelect(fileId: number, comFileArr: Array): void { let that = this; let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; this.selectEl!.innerHTML = ''; @@ -316,7 +316,7 @@ export class TabPaneComparison extends BaseElement { this.comparisonTable!.scrollTop = 0; this.retainerTableEl!.snapshotDataSource = []; for (let f of comFileArr) { - if (input.value == f.name) { + if (input.value === f.name) { that.updateComparisonData(fileId, f.id); } } @@ -325,7 +325,7 @@ export class TabPaneComparison extends BaseElement { }); } - sortComprisonByColumn(column: string, sort: number) { + sortComprisonByColumn(column: string, sort: number): void { switch (sort) { case 0: if (this.search!.value === '') { @@ -383,7 +383,7 @@ export class TabPaneComparison extends BaseElement { } } - sortRetainerByColumn(column: string, sort: number) { + sortRetainerByColumn(column: string, sort: number): void { switch (sort) { case 0: this.retainerTableEl!.snapshotDataSource = this.retainsData; @@ -496,7 +496,7 @@ export class TabPaneComparison extends BaseElement { } } - classFilter() { + classFilter(): void { this.search!.addEventListener('keyup', () => { this.comparisonFilter = []; this.comparisonData.forEach((a: any, key: number) => { @@ -512,14 +512,14 @@ export class TabPaneComparison extends BaseElement { }); } - clear() { + clear(): void { this.search!.value = ''; this.rightTheadTable!.removeAttribute('sort'); this.leftTheadTable!.removeAttribute('sort'); this.comparisonTable!.scrollTop = 0; } - connectedCallback() { + connectedCallback(): void { super.connectedCallback(); let filterHeight = 0; new ResizeObserver((entries) => { diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts index ca93f7c15a7f17cae60042b949d5af9836d56d53..bac257c73f22366090535f11bb38ed2f0b78c6fd 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts @@ -14,12 +14,12 @@ */ import { BaseElement } from '../../../../../base-ui/BaseElement.js'; -import { LitTable, TableMode } from '../../../../../base-ui/table/lit-table.js'; +import { type LitTable, TableMode } from '../../../../../base-ui/table/lit-table.js'; import { SelectionParam } from '../../../../bean/BoxSelection.js'; -import { JsCpuProfilerChartFrame, JsCpuProfilerTabStruct } from '../../../../bean/JsStruct.js'; +import { type JsCpuProfilerChartFrame, JsCpuProfilerTabStruct } from '../../../../bean/JsStruct.js'; import { procedurePool } from '../../../../database/Procedure.js'; import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; -import { FilterData, TabPaneFilter } from '../TabPaneFilter.js'; +import { type FilterData, TabPaneFilter } from '../TabPaneFilter.js'; import '../TabPaneFilter.js'; export class TabPaneJsCpuCallTree extends BaseElement { @@ -46,7 +46,7 @@ export class TabPaneJsCpuCallTree extends BaseElement { set data(data: SelectionParam | Array) { if (data instanceof SelectionParam) { - if (data == this.currentSelection) { + if (data === this.currentSelection) { return; } this.currentSelection = data; @@ -58,17 +58,17 @@ export class TabPaneJsCpuCallTree extends BaseElement { } this.init(); - this.getDataByWorker(chartData, (results: Array) => { + this.getDataByWorker(chartData, (results: Array): void => { this.setCallTreeTableData(results); }); } } - protected setCurrentType(type: number) { + protected setCurrentType(type: number): void { this.currentType = type; } - private init() { + private init(): void { this.sortKey = ''; this.sortType = 0; this.profilerFilter!.filterValue = ''; @@ -77,14 +77,14 @@ export class TabPaneJsCpuCallTree extends BaseElement { if (this.treeTable!.hasAttribute('sort')) { this.treeTable!.removeAttribute('sort'); list.forEach((item) => { - item.querySelectorAll('svg').forEach((svg) => { + item.querySelectorAll('svg').forEach((svg): void => { svg.style.display = 'none'; }); }); } } - private setCallTreeTableData(results: Array) { + private setCallTreeTableData(results: Array): void { this.clearTab(); const callTreeMap = new Map(); const setTabData = (data: Array) => { @@ -118,21 +118,21 @@ export class TabPaneJsCpuCallTree extends BaseElement { this.stackTable = this.shadowRoot?.querySelector('#stackTable') as LitTable; this.treeTable = this.callTreeTable!.shadowRoot?.querySelector('.thead') as HTMLDivElement; this.profilerFilter = this.shadowRoot?.querySelector('#filter') as TabPaneFilter; - this.callTreeTable!.addEventListener('row-click', (evt) => { + this.callTreeTable!.addEventListener('row-click', (evt): void => { const heaviestStack = new Array(); - const getHeaviestChildren = (children: Array) => { + const getHeaviestChildren = (children: Array): void => { if (children.length === 0) { return; } - const heaviestChild = children.reduce((max, struct) => + const heaviestChild = children.reduce((max, struct): JsCpuProfilerTabStruct => Math.max(max.totalTime, struct.totalTime) === max.totalTime ? max : struct ); heaviestStack?.push(heaviestChild); getHeaviestChildren(heaviestChild.children); }; - const getParent = (list: JsCpuProfilerTabStruct) => { + const getParent = (list: JsCpuProfilerTabStruct): void => { if (list.parent) { heaviestStack.push(list.parent!); getParent(list.parent!); @@ -178,15 +178,15 @@ export class TabPaneJsCpuCallTree extends BaseElement { this.sortType = evt.detail.sort; this.setCallTreeTableData(this.callTreeSource); }); - this.profilerFilter!.getFilterData((data: FilterData) => { - if (this.searchValue != this.profilerFilter!.filterValue) { + this.profilerFilter!.getFilterData((data: FilterData): void => { + if (this.searchValue !== this.profilerFilter!.filterValue) { this.searchValue = this.profilerFilter!.filterValue; this.findSearchNode(this.callTreeSource, this.searchValue); this.setCallTreeTableData(this.callTreeSource); } }); } - private findSearchNode(sampleArray: JsCpuProfilerTabStruct[], search: string) { + private findSearchNode(sampleArray: JsCpuProfilerTabStruct[], search: string): void { search = search.toLocaleLowerCase(); sampleArray.forEach((sample) => { if (sample.symbolName && sample.symbolName.toLocaleLowerCase().includes(search)) { @@ -227,25 +227,25 @@ export class TabPaneJsCpuCallTree extends BaseElement { } const CallTreeSortArr = arr.sort((callTreeLeftData, callTreeRightData) => { if (this.sortKey === 'selfTimeStr' || this.sortKey === 'selfTimePercent') { - if (this.sortType == 0) { + if (this.sortType === 0) { return defaultSort(callTreeLeftData, callTreeRightData); - } else if (this.sortType == 1) { + } else if (this.sortType === 1) { return callTreeLeftData.selfTime - callTreeRightData.selfTime; } else { return callTreeRightData.selfTime - callTreeLeftData.selfTime; } } else if (this.sortKey === 'symbolName') { - if (this.sortType == 0) { + if (this.sortType === 0) { return defaultSort(callTreeLeftData, callTreeRightData); - } else if (this.sortType == 1) { + } else if (this.sortType === 1) { return (callTreeLeftData.symbolName + '').localeCompare(callTreeRightData.symbolName + ''); } else { return (callTreeRightData.symbolName + '').localeCompare(callTreeLeftData.symbolName + ''); } } else { - if (this.sortType == 0) { + if (this.sortType === 0) { return defaultSort(callTreeLeftData, callTreeRightData); - } else if (this.sortType == 1) { + } else if (this.sortType === 1) { return callTreeLeftData.totalTime - callTreeRightData.totalTime; } else { return callTreeRightData.totalTime - callTreeLeftData.totalTime; diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuBottomUp.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuBottomUp.ts index e82d8881150d8b84afad7edbcd3ddd0c2adcba4c..c17e86e4b56c26580fe04a153d4c795de55f6609 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuBottomUp.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuBottomUp.ts @@ -14,8 +14,8 @@ */ import { element } from '../../../../../base-ui/BaseElement.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; -import { JsCpuProfilerChartFrame } from '../../../../bean/JsStruct.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type JsCpuProfilerChartFrame } from '../../../../bean/JsStruct.js'; import { TabPaneJsCpuCallTree } from './TabPaneJsCpu.js'; @element('tabpane-js-cpu-bottom-up') diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuCallTree.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuCallTree.ts index 37fd3e16d4dc7e68f0f8f4a01b6b77438d3d5cad..585603c103dece6c707da06b9054458d12116e56 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuCallTree.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuCallTree.ts @@ -14,8 +14,8 @@ */ import { element } from '../../../../../base-ui/BaseElement.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; -import { JsCpuProfilerChartFrame } from '../../../../bean/JsStruct.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type JsCpuProfilerChartFrame } from '../../../../bean/JsStruct.js'; import { TabPaneJsCpuCallTree } from './TabPaneJsCpu.js'; @element('tabpane-js-cpu-top-down') diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuStatistics.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuStatistics.ts index cc6a42efd47576dc93653565323685562c6edf72..cc47674bb26f59ececf693d8de07e007bc3bb214 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuStatistics.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuStatistics.ts @@ -14,13 +14,13 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitChartPie } from '../../../../../base-ui/chart/pie/LitChartPie.js'; -import { LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitChartPie } from '../../../../../base-ui/chart/pie/LitChartPie.js'; +import { type LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { SelectionParam } from '../../../../bean/BoxSelection.js'; -import { JsCpuProfilerChartFrame, JsCpuProfilerStatisticsStruct } from '../../../../bean/JsStruct.js'; +import { type JsCpuProfilerChartFrame, JsCpuProfilerStatisticsStruct } from '../../../../bean/JsStruct.js'; import { procedurePool } from '../../../../database/Procedure.js'; -import { SampleType } from '../../../../database/logic-worker/ProcedureLogicWorkerJsCpuProfiler.js'; +import { type SampleType } from '../../../../database/logic-worker/ProcedureLogicWorkerJsCpuProfiler.js'; import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; import { resizeObserver } from '../SheetUtils.js'; @@ -46,7 +46,7 @@ export class TabPaneJsCpuStatistics extends BaseElement { }); } - private init() { + private init(): void { const thTable = this.tabTitle!.querySelector('.th'); const jsCpuStatTblNodes = thTable!.querySelectorAll('div'); if (this.tabTitle!.hasAttribute('sort')) { @@ -95,13 +95,13 @@ export class TabPaneJsCpuStatistics extends BaseElement { label: { type: 'outer', }, - tip: (obj) => { + tip: (obj): string => { return `
    type: ${obj.obj.type}
    total: ${ns2s(obj.obj.time)} (${obj.obj.percentage}%)
    `; }, - hoverHandler: (data) => { + hoverHandler: (data): void => { if (data) { this.statisticsTable!.setCurrentHover(data); } else { @@ -136,7 +136,7 @@ export class TabPaneJsCpuStatistics extends BaseElement { this.statisticsTable?.reMeauseHeight(); } - private totalData(source: Array) { + private totalData(source: Array): JsCpuProfilerStatisticsStruct { // 计算总的time作为表格的第一行显示 let totalTime = 0; for (let item of source) { diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts index b19576008d346124446a0a91fc584a009867058b..e4f1b106c8379e1e1c29a8fff8b23f001c935fcd 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts @@ -13,19 +13,19 @@ * limitations under the License. */ -import {BaseElement, element} from '../../../../../base-ui/BaseElement.js'; -import {LitTable} from '../../../../../base-ui/table/lit-table.js'; +import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; +import { LitTable } from '../../../../../base-ui/table/lit-table.js'; import '../../../../../base-ui/table/lit-table.js'; -import {ConstructorItem, FileInfo} from '../../../../../js-heap/model/UiStruct.js'; -import {HeapDataInterface} from '../../../../../js-heap/HeapDataInterface.js'; +import { type ConstructorItem, FileInfo } from '../../../../../js-heap/model/UiStruct.js'; +import { HeapDataInterface } from '../../../../../js-heap/HeapDataInterface.js'; import '../../../../../base-ui/table/lit-table-column.js'; -import {TabPaneJsMemoryFilter} from '../TabPaneJsMemoryFilter.js'; +import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; import '../TabPaneJsMemoryFilter.js'; -import {LitProgressBar} from '../../../../../base-ui/progress-bar/LitProgressBar.js'; +import { LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; import '../../../../../base-ui/progress-bar/LitProgressBar.js'; import '../../../../../base-ui/slicer/lit-slicer.js'; -import {HeapSnapshotStruct} from '../../../../database/ui-worker/ProcedureWorkerHeapSnapshot.js'; -import {HeapTraceFunctionInfo} from '../../../../../js-heap/model/DatabaseStruct.js'; +import { HeapSnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerHeapSnapshot.js'; +import { HeapTraceFunctionInfo } from '../../../../../js-heap/model/DatabaseStruct.js'; @element('tabpane-summary') export class TabPaneSummary extends BaseElement { @@ -305,7 +305,7 @@ export class TabPaneSummary extends BaseElement { this.initSummaryData(data); } - initSummaryData(file: FileInfo | HeapSnapshotStruct, minNodeId?: number, maxNodeId?: number) { + initSummaryData(file: FileInfo | HeapSnapshotStruct, minNodeId?: number, maxNodeId?: number): void { this.file = file as FileInfo; this.clear(); this.summary = []; @@ -354,8 +354,8 @@ export class TabPaneSummary extends BaseElement { this.clickToggleTable(); } - private retainsTableByDistance(currentLeftItem: ConstructorItem, sort: number) { - const getList = function (list: Array) { + private retainsTableByDistance(currentLeftItem: ConstructorItem, sort: number): void { + const getList = function (list: Array): void { list.sort((leftA, rightB) => { return sort === 1 ? leftA.distance - rightB.distance : rightB.distance - leftA.distance; }); @@ -368,8 +368,8 @@ export class TabPaneSummary extends BaseElement { getList(currentLeftItem.children); } - private retainsTableByShallowSize(currentLeftItem: ConstructorItem, sort: number) { - const getList = function (list: Array) { + private retainsTableByShallowSize(currentLeftItem: ConstructorItem, sort: number): void { + const getList = function (list: Array): void { list.sort((leftA, rightB) => { return sort === 1 ? leftA.shallowSize - rightB.shallowSize : rightB.shallowSize - leftA.shallowSize; }); @@ -382,12 +382,10 @@ export class TabPaneSummary extends BaseElement { getList(currentLeftItem.children); } - private retainsTableByRetainedSize(currentLeftItem: ConstructorItem, sort: number) { - const getList = function (list: Array) { + private retainsTableByRetainedSize(currentLeftItem: ConstructorItem, sort: number): void { + const getList = function (list: Array): void { list.sort((leftA, rightB) => { - return sort === 1 - ? leftA.retainedSize - rightB.retainedSize - : rightB.retainedSize - leftA.retainedSize; + return sort === 1 ? leftA.retainedSize - rightB.retainedSize : rightB.retainedSize - leftA.retainedSize; }); list.forEach(function (row) { if (row.children.length > 0) { @@ -398,8 +396,8 @@ export class TabPaneSummary extends BaseElement { getList(currentLeftItem.children); } - private retainsTableByObjectName(currentLeftItem: ConstructorItem, sort: number) { - const getList = function (list: Array) { + private retainsTableByObjectName(currentLeftItem: ConstructorItem, sort: number): void { + const getList = function (list: Array): void { list.sort((leftA, rightB) => { return sort === 1 ? (leftA.objectName + '').localeCompare(rightB.objectName + '') diff --git a/ide/src/trace/component/trace/sheet/clock/TabPaneClockCounter.ts b/ide/src/trace/component/trace/sheet/clock/TabPaneClockCounter.ts index 97101bb5bec520a7104b89109cdbbf6c7acfcf65..d7113aeeae81f98bb00905f17d49bdc20ec6c8cb 100644 --- a/ide/src/trace/component/trace/sheet/clock/TabPaneClockCounter.ts +++ b/ide/src/trace/component/trace/sheet/clock/TabPaneClockCounter.ts @@ -139,8 +139,11 @@ export class TabPaneClockCounter extends BaseElement { return 0; } if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(clockCounterRightData[property]) - parseFloat(clockCounterLeftData[property]) : parseFloat(clockCounterLeftData[property]) - parseFloat(clockCounterRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(clockCounterRightData[property]) - parseFloat(clockCounterLeftData[property]) + : // @ts-ignore + parseFloat(clockCounterLeftData[property]) - parseFloat(clockCounterRightData[property]); } else { // @ts-ignore if (clockCounterRightData[property] > clockCounterLeftData[property]) { diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneCounterSample.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneCounterSample.ts index 82e561643104024eee2b776fe65c285034d173ea..f3272ad277bf5350f8b14cf785330027e23dc295 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneCounterSample.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneCounterSample.ts @@ -64,8 +64,8 @@ export class TabPaneCounterSample extends BaseElement { this.counterLoadingPage = this.shadowRoot!.querySelector('.loadingCounter'); this.counterSampleTbl = this.shadowRoot!.querySelector('#tb-counter-sample'); this.systemTrace = document - .querySelector('body > sp-application')! - .shadowRoot!.querySelector('#sp-system-trace'); + .querySelector('body > sp-application')?. + shadowRoot!.querySelector('#sp-system-trace'); this.counterSampleTbl!.addEventListener('column-click', (evt) => { // @ts-ignore this.counterSortKey = evt.detail.key; diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByProcess.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByProcess.ts index cbb95db78590adc178c33ac44c479a320817fb88..eff4585fd0be4aacb82ddcd7957c4428adaac007 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByProcess.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByProcess.ts @@ -123,8 +123,11 @@ export class TabPaneCpuByProcess extends BaseElement { return 0; } if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(cpuByProcessRightData[property]) - parseFloat(cpuByProcessLeftData[property]) : parseFloat(cpuByProcessLeftData[property]) - parseFloat(cpuByProcessRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(cpuByProcessRightData[property]) - parseFloat(cpuByProcessLeftData[property]) + : // @ts-ignore + parseFloat(cpuByProcessLeftData[property]) - parseFloat(cpuByProcessRightData[property]); } else { // @ts-ignore if (cpuByProcessRightData[property] > cpuByProcessLeftData[property]) { diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByThread.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByThread.ts index 8b86277420ee0b57fead8f8bc11eaec9f69f890c..ed3401bf2e01ac55bef17055977d72a34d336b10 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByThread.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByThread.ts @@ -186,8 +186,11 @@ export class TabPaneCpuByThread extends BaseElement { return 0; } if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(cpuByThreadRightData[property]) - parseFloat(cpuByThreadLeftData[property]) : parseFloat(cpuByThreadLeftData[property]) - parseFloat(cpuByThreadRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(cpuByThreadRightData[property]) - parseFloat(cpuByThreadLeftData[property]) + : // @ts-ignore + parseFloat(cpuByThreadLeftData[property]) - parseFloat(cpuByThreadRightData[property]); } else { // @ts-ignore if (cpuByThreadRightData[property] > cpuByThreadLeftData[property]) { diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneFrequencySample.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneFrequencySample.ts index ddf5f2212f39cdd6fb6a5bb54cf155d95f9d4080..e3bc07c62c8296b4d64b37c32b0204dc100d8294 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneFrequencySample.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneFrequencySample.ts @@ -68,8 +68,8 @@ export class TabPaneFrequencySample extends BaseElement { this.frequencyLoadingPage = this.shadowRoot!.querySelector('.loadingFre'); this.frequencySampleTbl = this.shadowRoot!.querySelector('#tb-states'); this.systemTrace = document - .querySelector('body > sp-application')! - .shadowRoot!.querySelector('#sp-system-trace'); + .querySelector('body > sp-application')?. + shadowRoot!.querySelector('#sp-system-trace'); this.frequencySampleTbl!.addEventListener('column-click', (evt) => { // @ts-ignore this.frequencySampleSortKey = evt.detail.key; diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneSchedPriority.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneSchedPriority.ts index dd2872fa8c4ab9674797a5196edd2299091ae995..6173e3ad82d2de025ad46de97912ac59ba8ae848 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneSchedPriority.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneSchedPriority.ts @@ -54,14 +54,14 @@ export class TabPaneSchedPriority extends BaseElement { private async queryDataByDB(sptParam: SelectionParam | any): Promise { this.priorityTbl!.loading = true; const resultData: Array = []; - if (this.strValueMap.size === 0){ + if (this.strValueMap.size === 0) { await queryThreadStateArgsByName('next_info').then((value) => { for (const item of value) { this.strValueMap.set(item.argset, item.strValue); } }); } - + const filterList = ['0', '0x0']; //next_info第2字段不为0 || next_info第3字段不为0 // 通过priority与next_info结合判断优先级等级 diff --git a/ide/src/trace/component/trace/sheet/energy/TabPaneEnergyAnomaly.ts b/ide/src/trace/component/trace/sheet/energy/TabPaneEnergyAnomaly.ts index 4040309cfc66d3f80d6e84d1c0f9ecd3e419508d..ef5d0c2b4325268637f7a4b0272634781726465c 100644 --- a/ide/src/trace/component/trace/sheet/energy/TabPaneEnergyAnomaly.ts +++ b/ide/src/trace/component/trace/sheet/energy/TabPaneEnergyAnomaly.ts @@ -40,7 +40,7 @@ export class TabPaneEnergyAnomaly extends BaseElement { if (values[TabPaneEnergyAnomaly.VALUE_INDEX]) { let apps = values[TabPaneEnergyAnomaly.VALUE_INDEX].split(','); for (let appIndex = 0; appIndex < apps.length; appIndex++) { - if (apps.indexOf(SpHiSysEventChart.app_name) != -1) { + if (apps.indexOf(SpHiSysEventChart.app_name) !== -1) { findAppNameIndex = apps.indexOf(SpHiSysEventChart.app_name); filterAppMap.set(values[0] + values[1], findAppNameIndex); break; diff --git a/ide/src/trace/component/trace/sheet/energy/TabPanePowerDetails.ts b/ide/src/trace/component/trace/sheet/energy/TabPanePowerDetails.ts index 4c6d66ae9eee246b0710f36d3175768d2fd9e41f..794886457dab130a9da118b0bc741f46697a5436 100644 --- a/ide/src/trace/component/trace/sheet/energy/TabPanePowerDetails.ts +++ b/ide/src/trace/component/trace/sheet/energy/TabPanePowerDetails.ts @@ -298,9 +298,13 @@ export class TabPanePowerDetails extends BaseElement { if (type === 'number') { return sort === 2 ? // @ts-ignore - parseFloat(bPowerDetails[property] == '-' ? 0 : bPowerDetails[property]) - parseFloat(aPowerDetails[property] == '-' ? 0 : aPowerDetails[property]) + parseFloat(bPowerDetails[property] == '-' ? 0 : bPowerDetails[property]) - + // @ts-ignore + parseFloat(aPowerDetails[property] == '-' ? 0 : aPowerDetails[property]) : // @ts-ignore - parseFloat(aPowerDetails[property] == '-' ? 0 : aPowerDetails[property]) - parseFloat(bPowerDetails[property] == '-' ? 0 : bPowerDetails[property]); + parseFloat(aPowerDetails[property] == '-' ? 0 : aPowerDetails[property]) - + // @ts-ignore + parseFloat(bPowerDetails[property] == '-' ? 0 : bPowerDetails[property]); } else { // @ts-ignore if (bPowerDetails[property] > aPowerDetails[property]) { diff --git a/ide/src/trace/component/trace/sheet/energy/TabPaneSystemDetails.ts b/ide/src/trace/component/trace/sheet/energy/TabPaneSystemDetails.ts index e8d84f1f560c1206399685cd27c362896def6361..abe0ba1dc3782a6af48bc9535d460f36a39c7a15 100644 --- a/ide/src/trace/component/trace/sheet/energy/TabPaneSystemDetails.ts +++ b/ide/src/trace/component/trace/sheet/energy/TabPaneSystemDetails.ts @@ -24,7 +24,7 @@ import { } from '../../../../database/SqlLite.js'; import { SpHiSysEventChart } from '../../../chart/SpHiSysEventChart.js'; import { resizeObserver } from '../SheetUtils.js'; -import { LitSlicerTrack } from '../../../../../base-ui/slicer/lit-slicer.js'; +import { type LitSlicerTrack } from '../../../../../base-ui/slicer/lit-slicer.js'; @element('tabpane-system-details') export class TabPaneSystemDetails extends BaseElement { diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneCallTree.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneCallTree.ts index d32668b5b7f8ca2a561fa783dc42c4db5fafa9e2..9a15d7d8b5bb84c97e8412ae5e5db02749b0eadf 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneCallTree.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneCallTree.ts @@ -49,7 +49,7 @@ export class TabPaneCallTree extends BaseElement { private flameChartMode: ChartMode = ChartMode.Duration; set data(callTreeSelection: SelectionParam | any) { - if (callTreeSelection == this.currentSelection) { + if (callTreeSelection === this.currentSelection) { return; } this.searchValue = ''; @@ -90,7 +90,7 @@ export class TabPaneCallTree extends BaseElement { } initModeAndAction() { - if (this.procedureAction == '' && this.hasAttribute('action')) { + if (this.procedureAction === '' && this.hasAttribute('action')) { this.procedureAction = this.getAttribute('action') || ''; } if (this.hasAttribute('flame-mode')) { @@ -114,7 +114,7 @@ export class TabPaneCallTree extends BaseElement { getParentTree(callTreeSrc: Array, target: MerageBean, parents: Array): boolean { for (let callTreeBean of callTreeSrc) { - if (callTreeBean.id == target.id) { + if (callTreeBean.id === target.id) { parents.push(callTreeBean); return true; } else { @@ -129,7 +129,7 @@ export class TabPaneCallTree extends BaseElement { getChildTree(callTreeSrc: Array, id: string, children: Array): boolean { for (let callTreeBean of callTreeSrc) { - if (callTreeBean.id == id && callTreeBean.children.length == 0) { + if (callTreeBean.id === id && callTreeBean.children.length === 0) { children.push(callTreeBean); return true; } else { @@ -150,7 +150,7 @@ export class TabPaneCallTree extends BaseElement { let maxDur = 0; function findMaxStack(bean: MerageBean) { - if (bean.children.length == 0) { + if (bean.children.length === 0) { if (bean.dur > maxDur) { maxDur = bean.dur; maxId = bean.id; @@ -171,7 +171,7 @@ export class TabPaneCallTree extends BaseElement { } let len = callTreeArr.length; this.callTreeRightSource = callTreeArr; - this.callTreeTbr!.dataSource = len == 0 ? [] : callTreeArr; + this.callTreeTbr!.dataSource = len === 0 ? [] : callTreeArr; } connectedCallback() { @@ -192,7 +192,7 @@ export class TabPaneCallTree extends BaseElement { } else { callTreeTabFilter.style.display = 'none'; } - if (this.callTreeTbl!.style.visibility == 'hidden') { + if (this.callTreeTbl!.style.visibility === 'hidden') { callTreeTabFilter.style.display = 'none'; } if (this.parentElement?.clientHeight != 0) { @@ -201,10 +201,12 @@ export class TabPaneCallTree extends BaseElement { this.frameChart?.calculateChartData(); } // @ts-ignore - this.callTreeTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 35 + 'px'; + this.callTreeTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 35 + 'px'; this.callTreeTbl?.reMeauseHeight(); // @ts-ignore - this.callTreeTbr?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 45 - 21 + 'px'; + this.callTreeTbr?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 45 - 21 + 'px'; this.callTreeTbr?.reMeauseHeight(); this.loadingPage.style.height = this.parentElement!.clientHeight - 24 + 'px'; } @@ -224,7 +226,7 @@ export class TabPaneCallTree extends BaseElement { let data = evt.detail.data as MerageBean; document.dispatchEvent( new CustomEvent('number_calibration', { - detail: { time: data.tsArray, durations: data.durArray}, + detail: { time: data.tsArray, durations: data.durArray }, }) ); this.setRightTableData(data); @@ -253,11 +255,11 @@ export class TabPaneCallTree extends BaseElement { }); let filterFunc = (data: any) => { let callTreeFuncArgs: any[] = []; - if (data.type == 'check') { + if (data.type === 'check') { if (data.item.checked) { callTreeFuncArgs.push({ funcName: 'splitTree', - funcArgs: [data.item.name, data.item.select == '0', data.item.type == 'symbol'], + funcArgs: [data.item.name, data.item.select === '0', data.item.type === 'symbol'], }); } else { callTreeFuncArgs.push({ @@ -273,7 +275,7 @@ export class TabPaneCallTree extends BaseElement { funcArgs: [data.item.name], }); } - } else if (data.type == 'select') { + } else if (data.type === 'select') { callTreeFuncArgs.push({ funcName: 'resotreAllNode', funcArgs: [[data.item.name]], @@ -284,10 +286,10 @@ export class TabPaneCallTree extends BaseElement { }); callTreeFuncArgs.push({ funcName: 'splitTree', - funcArgs: [data.item.name, data.item.select == '0', data.item.type == 'symbol'], + funcArgs: [data.item.name, data.item.select === '0', data.item.type === 'symbol'], }); - } else if (data.type == 'button') { - if (data.item == 'symbol') { + } else if (data.type === 'button') { + if (data.item === 'symbol') { if (this.callTreeSelectedData && !this.callTreeSelectedData.canCharge) { return; } @@ -300,7 +302,7 @@ export class TabPaneCallTree extends BaseElement { } else { return; } - } else if (data.item == 'library') { + } else if (data.item === 'library') { if (this.callTreeSelectedData && !this.callTreeSelectedData.canCharge) { return; } @@ -313,7 +315,7 @@ export class TabPaneCallTree extends BaseElement { } else { return; } - } else if (data.item == 'restore') { + } else if (data.item === 'restore') { if (data.remove != undefined && data.remove.length > 0) { let list = data.remove.map((item: any) => { return item.name; @@ -351,7 +353,7 @@ export class TabPaneCallTree extends BaseElement { this.callTreeFilter!.getDataLibrary(filterFunc); this.callTreeFilter!.getDataMining(filterFunc); this.callTreeFilter!.getCallTreeData((data: any) => { - if (data.value == 0) { + if (data.value === 0) { this.refreshAllNode({ ...this.callTreeFilter!.getFilterTreeData(), callTree: data.checks, @@ -513,18 +515,18 @@ export class TabPaneCallTree extends BaseElement { sortCallFnTree(arr: Array): Array { let sortArr = arr.sort((compareFnA, compareFnB) => { - if (this.callTreeSortKey == 'self') { - if (this.callTreeSortType == 0) { + if (this.callTreeSortKey === 'self') { + if (this.callTreeSortType === 0) { return compareFnB.dur - compareFnA.dur; - } else if (this.callTreeSortType == 1) { + } else if (this.callTreeSortType === 1) { return compareFnA.selfDur - compareFnB.selfDur; } else { return compareFnB.selfDur - compareFnA.selfDur; } } else { - if (this.callTreeSortType == 0) { + if (this.callTreeSortType === 0) { return compareFnB.dur - compareFnA.dur; - } else if (this.callTreeSortType == 1) { + } else if (this.callTreeSortType === 1) { return compareFnA.dur - compareFnB.dur; } else { return compareFnB.dur - compareFnA.dur; @@ -549,7 +551,7 @@ export class TabPaneCallTree extends BaseElement { (callTreeResults: any) => { handler(callTreeResults); this.loadingList.splice(0, 1); - if (this.loadingList.length == 0) { + if (this.loadingList.length === 0) { this.callTreeProgressEL!.loading = false; this.loadingPage.style.visibility = 'hidden'; } diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemCalltree.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemCalltree.ts index 6a879a5cba7d9b1268035bb777c35f128d6bbf35..b2b356697571794369c8f4f2d9d1df9ee05eec16 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemCalltree.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemCalltree.ts @@ -175,7 +175,7 @@ export class TabpaneFilesystemCalltree extends BaseElement { let data = evt.detail.data as FileMerageBean; document.dispatchEvent( new CustomEvent('number_calibration', { - detail: { time: data.tsArray,durations: data.durArray }, + detail: { time: data.tsArray, durations: data.durArray }, }) ); this.setRightTableData(data); @@ -425,10 +425,12 @@ export class TabpaneFilesystemCalltree extends BaseElement { this.frameChart?.calculateChartData(); } // @ts-ignore - this.fsCallTreeTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 35 + 'px'; + this.fsCallTreeTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 35 + 'px'; this.fsCallTreeTbl?.reMeauseHeight(); // @ts-ignore - this.fsCallTreeTbr?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 45 - 21 + 'px'; + this.fsCallTreeTbr?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 45 - 21 + 'px'; this.fsCallTreeTbr?.reMeauseHeight(); this.loadingPage.style.height = this.parentElement!.clientHeight - 24 + 'px'; } diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemDescHistory.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemDescHistory.ts index 837854ba1a39fadb6ec163e1454ac602d668afd3..ef08cf519eac3b4f42a1dafb1a321ea6e360425d 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemDescHistory.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemDescHistory.ts @@ -48,9 +48,11 @@ export class TabPaneFileSystemDescHistory extends BaseElement { } this.currentSelection = fsDescHistorySelection; // @ts-ignore - this.fsDescHistoryTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 20 - 31 + 'px'; + this.fsDescHistoryTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 20 - 31 + 'px'; // @ts-ignore - this.fsDescHistoryTblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 20 - 31 + 'px'; + this.fsDescHistoryTblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 20 - 31 + 'px'; this.fsDescHistoryTbl!.recycleDataSource = []; this.fsDescHistoryTblData!.recycleDataSource = []; if (fsDescHistorySelection) { @@ -183,10 +185,12 @@ export class TabPaneFileSystemDescHistory extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.fsDescHistoryTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 31 + 'px'; + this.fsDescHistoryTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 31 + 'px'; this.fsDescHistoryTbl?.reMeauseHeight(); // @ts-ignore - this.fsDescHistoryTblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 31 + 'px'; + this.fsDescHistoryTblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 31 + 'px'; this.fsDescHistoryTblData?.reMeauseHeight(); this.fsDescHistoryLoadingPage.style.height = this.parentElement!.clientHeight - 24 + 'px'; } diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemDescTimeSlice.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemDescTimeSlice.ts index a85d0162310095496505f5635057f44db420cf5c..f54abc99d2f42f1554639fdafa038abe15f13bbb 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemDescTimeSlice.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemDescTimeSlice.ts @@ -39,9 +39,11 @@ export class TabPaneFileSystemDescTimeSlice extends BaseElement { } this.currentSelection = fsDescTimeSliceSelection; // @ts-ignore - this.fsDescTimeSliceTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 20 - 31 + 'px'; + this.fsDescTimeSliceTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 20 - 31 + 'px'; // @ts-ignore - this.fsDescTimeSliceTblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 20 - 31 + 'px'; + this.fsDescTimeSliceTblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 20 - 31 + 'px'; this.fsDescTimeSliceTbl!.recycleDataSource = []; this.fsDescTimeSliceTblData!.recycleDataSource = []; if (fsDescTimeSliceSelection) { @@ -115,10 +117,12 @@ export class TabPaneFileSystemDescTimeSlice extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.fsDescTimeSliceTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 31 + 'px'; + this.fsDescTimeSliceTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 31 + 'px'; this.fsDescTimeSliceTbl?.reMeauseHeight(); // @ts-ignore - this.fsDescTimeSliceTblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 31 + 'px'; + this.fsDescTimeSliceTblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 31 + 'px'; this.fsDescTimeSliceTblData?.reMeauseHeight(); this.fsDescTimeSliceLoadingPage.style.height = this.parentElement!.clientHeight - 24 + 'px'; } diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemEvents.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemEvents.ts index fadbfae69efc731f03b359d231ff94084aa1dfff..44460346c88bc4798e6427221aa6811b5d3c4ec4 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemEvents.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneFileSystemEvents.ts @@ -49,9 +49,11 @@ export class TabPaneFileSystemEvents extends BaseElement { } this.currentSelection = fsSysEventSelection; // @ts-ignore - this.fsSysEventTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 20 - 31 + 'px'; + this.fsSysEventTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 20 - 31 + 'px'; // @ts-ignore - this.fsSysEventTblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 20 - 31 + 'px'; + this.fsSysEventTblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 20 - 31 + 'px'; this.filterEventType = '0'; this.filterProcess = '0'; this.queryData(fsSysEventSelection); @@ -216,10 +218,12 @@ export class TabPaneFileSystemEvents extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.fsSysEventTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 33 + 'px'; + this.fsSysEventTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 33 + 'px'; this.fsSysEventTbl?.reMeauseHeight(); // @ts-ignore - this.fsSysEventTblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 33 + 'px'; + this.fsSysEventTblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 33 + 'px'; this.fsSysEventTblData?.reMeauseHeight(); this.loadingPage.style.height = this.parentElement!.clientHeight - 24 + 'px'; } diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatistics.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatistics.ts index 13201706eb650a265d6fbb84076514825132a3f7..eddd56dd2de562ff89221da481d217dab34975ef 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatistics.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatistics.ts @@ -40,7 +40,8 @@ export class TabPaneFileStatistics extends BaseElement { this.fileStatisticsLoadingPage.style.visibility = 'visible'; this.selectionParam = fileStatisticsSelection; // @ts-ignore - this.fileStatisticsTbl!.shadowRoot!.querySelector('.table').style.height = this.parentElement!.clientHeight - 25 + 'px'; + this.fileStatisticsTbl!.shadowRoot!.querySelector('.table').style.height = + this.parentElement!.clientHeight - 25 + 'px'; this.queryDataByDB(fileStatisticsSelection); } @@ -55,7 +56,8 @@ export class TabPaneFileStatistics extends BaseElement { this.fileStatisticsSortType = evt.detail.sort; let newSource = JSON.parse(JSON.stringify(this.fileStatisticsSource)); - if (this.fileStatisticsSortType != 0 && newSource.length > 0) this.sortTable(newSource[0], this.fileStatisticsSortKey); + if (this.fileStatisticsSortType != 0 && newSource.length > 0) + this.sortTable(newSource[0], this.fileStatisticsSortKey); this.fileStatisticsTbl!.recycleDataSource = newSource; }); } @@ -65,7 +67,8 @@ export class TabPaneFileStatistics extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement!.clientHeight != 0) { // @ts-ignore - this.fileStatisticsTbl!.shadowRoot!.querySelector('.table').style.height = this.parentElement!.clientHeight - 25 + 'px'; + this.fileStatisticsTbl!.shadowRoot!.querySelector('.table').style.height = + this.parentElement!.clientHeight - 25 + 'px'; this.fileStatisticsTbl!.reMeauseHeight(); this.fileStatisticsLoadingPage.style.height = this.parentElement!.clientHeight - 24 + 'px'; } @@ -122,8 +125,10 @@ export class TabPaneFileStatistics extends BaseElement { fileStatisticsObj.logicalWrites += item.logicalWrites; fileStatisticsObj.otherFile += item.otherFile; fileStatisticsObj.allDuration += item.allDuration; - fileStatisticsObj.minDuration = fileStatisticsObj.minDuration <= item.minDuration ? fileStatisticsObj.minDuration : item.minDuration; - fileStatisticsObj.maxDuration = fileStatisticsObj.maxDuration >= item.maxDuration ? fileStatisticsObj.maxDuration : item.maxDuration; + fileStatisticsObj.minDuration = + fileStatisticsObj.minDuration <= item.minDuration ? fileStatisticsObj.minDuration : item.minDuration; + fileStatisticsObj.maxDuration = + fileStatisticsObj.maxDuration >= item.maxDuration ? fileStatisticsObj.maxDuration : item.maxDuration; fileStatisticsObj.children.push(this.getInitData(item)); } else { fileStatisticsFatherMap.set(item.type, { @@ -141,14 +146,18 @@ export class TabPaneFileStatistics extends BaseElement { if (idx == 0) { fileStatisticsAllNode.minDuration = item.minDuration; } else { - fileStatisticsAllNode.minDuration = fileStatisticsAllNode.minDuration <= item.minDuration ? fileStatisticsAllNode.minDuration : item.minDuration; + fileStatisticsAllNode.minDuration = + fileStatisticsAllNode.minDuration <= item.minDuration + ? fileStatisticsAllNode.minDuration + : item.minDuration; } fileStatisticsAllNode.count += item.count; fileStatisticsAllNode.logicalReads += item.logicalReads; fileStatisticsAllNode.logicalWrites += item.logicalWrites; fileStatisticsAllNode.otherFile += item.otherFile; fileStatisticsAllNode.allDuration += item.allDuration; - fileStatisticsAllNode.maxDuration = fileStatisticsAllNode.maxDuration >= item.maxDuration ? fileStatisticsAllNode.maxDuration : item.maxDuration; + fileStatisticsAllNode.maxDuration = + fileStatisticsAllNode.maxDuration >= item.maxDuration ? fileStatisticsAllNode.maxDuration : item.maxDuration; }); fileStatisticsFatherMap.forEach((item) => { item.avgDuration = item.allDuration / item.count; @@ -165,7 +174,8 @@ export class TabPaneFileStatistics extends BaseElement { fileStatisticsAllNode.title = 'All'; this.fileStatisticsSource = result.length > 0 ? [fileStatisticsAllNode] : []; let newSource = JSON.parse(JSON.stringify(this.fileStatisticsSource)); - if (this.fileStatisticsSortType != 0 && result.length > 0) this.sortTable(newSource[0], this.fileStatisticsSortKey); + if (this.fileStatisticsSortType != 0 && result.length > 0) + this.sortTable(newSource[0], this.fileStatisticsSortKey); this.fileStatisticsTbl!.recycleDataSource = newSource; }); } diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatisticsAnalysis.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatisticsAnalysis.ts index 82b0e5496663273ea7c77991b68081701db760ea..63fd95caa563d3ad12ec29a77f171dd2f9aad99f 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatisticsAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatisticsAnalysis.ts @@ -285,11 +285,11 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { }); } private getFileTypeTip() { - return (obj: { obj: { tableName: any; durFormat: any; percent: any; }; }): string => { + return (obj: { obj: { tableName: any; durFormat: any; percent: any } }): string => { return `
    -
    Type:${ obj.obj.tableName }
    -
    Duration:${ obj.obj.durFormat }
    -
    Percent:${ obj.obj.percent }%
    +
    Type:${obj.obj.tableName}
    +
    Duration:${obj.obj.durFormat}
    +
    Percent:${obj.obj.percent}%
    `; }; @@ -374,11 +374,11 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { }); } private getFsTip() { - return (obj: { obj: { tableName: any; durFormat: any; percent: any; }; }): string => { + return (obj: { obj: { tableName: any; durFormat: any; percent: any } }): string => { return `
    -
    ThreadName:${ obj.obj.tableName }
    -
    Duration:${ obj.obj.durFormat }
    -
    Percent:${ obj.obj.percent }%
    +
    ThreadName:${obj.obj.tableName}
    +
    Duration:${obj.obj.durFormat}
    +
    Percent:${obj.obj.percent}%
    `; }; @@ -411,9 +411,9 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { }, tip: (fileSysObj): string => { return `
    -
    Library:${ fileSysObj.obj.tableName }
    -
    Duration:${ fileSysObj.obj.durFormat }
    -
    Percent:${ fileSysObj.obj.percent }%
    +
    Library:${fileSysObj.obj.tableName}
    +
    Duration:${fileSysObj.obj.durFormat}
    +
    Percent:${fileSysObj.obj.percent}%
    `; }, @@ -606,8 +606,9 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { let pName = ''; for (let fileSysStatPidItem of value) { pName = fileSysStatPidItem.processName = - fileSysStatPidItem.processName === null || fileSysStatPidItem.processName === undefined ? - `Process(${ fileSysStatPidItem.pid })` : `${ fileSysStatPidItem.processName }(${ fileSysStatPidItem.pid })`; + fileSysStatPidItem.processName === null || fileSysStatPidItem.processName === undefined + ? `Process(${fileSysStatPidItem.pid})` + : `${fileSysStatPidItem.processName}(${fileSysStatPidItem.pid})`; analysisPidDataDur += fileSysStatPidItem.dur; } this.fileStatisticsAnalysisPidData.push({ @@ -712,7 +713,9 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { for (let fileSysStatThreadItem of value) { dur += fileSysStatThreadItem.dur; tName = fileSysStatThreadItem.threadName = - fileSysStatThreadItem.threadName === null || fileSysStatThreadItem.threadName === undefined ? `Thread(${ fileSysStatThreadItem.tid })` : `${ fileSysStatThreadItem.threadName }`; + fileSysStatThreadItem.threadName === null || fileSysStatThreadItem.threadName === undefined + ? `Thread(${fileSysStatThreadItem.tid})` + : `${fileSysStatThreadItem.threadName}`; } const threadData = { tableName: tName, @@ -858,9 +861,9 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { }, tip: (fsaObj): string => { return `
    -
    Function:${ fsaObj.obj.tableName }
    -
    Duration:${ fsaObj.obj.durFormat }
    -
    percent:${ fsaObj.obj.percent }
    +
    Function:${fsaObj.obj.tableName}
    +
    Duration:${fsaObj.obj.durFormat}
    +
    percent:${fsaObj.obj.percent}
    `; }, @@ -915,7 +918,7 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { // @ts-ignore return fsReleaseType; } - totalDurationData(durationTS: number): { durFormat: string; percent: string; tableName: string; duration: number; } { + totalDurationData(durationTS: number): { durFormat: string; percent: string; tableName: string; duration: number } { return { durFormat: Utils.getProbablyTime(durationTS), percent: ((durationTS / durationTS) * 100).toFixed(2), @@ -932,7 +935,7 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { percent: 0, durFormat: 0, }; - for (let pieDataIndex = 0 ; pieDataIndex < fsPieChartData.length ; pieDataIndex++) { + for (let pieDataIndex = 0; pieDataIndex < fsPieChartData.length; pieDataIndex++) { if (pieDataIndex < 19) { fsPieChartArr.push(fsPieChartData[pieDataIndex]); } else { diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatisticsAnalysis.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatisticsAnalysis.ts index da98801c2058718f93bc4038fde3d9092683601e..50479966c37519b7a896fd39d5eb2abefe516dd1 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatisticsAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatisticsAnalysis.ts @@ -165,7 +165,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { tip: this.getTip(), angleClick: (ioTierPieItem): void => { // @ts-ignore - if (ioTierPieItem.tableName != 'other') { + if (ioTierPieItem.tableName !== 'other') { this.ioTierProcessLevelClickEvent(ioTierPieItem); } }, @@ -317,7 +317,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { }, angleClick: (it): void => { // @ts-ignore - if (it.tableName != 'other') { + if (it.tableName !== 'other') { this.ioTierThreadLevelClickEvent(it); } }, @@ -367,11 +367,11 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { } }); } - private getIoTierTip(obj: { obj: { tableName: any; durFormat: any; percent: any; }; }) { + private getIoTierTip(obj: { obj: { tableName: any; durFormat: any; percent: any } }): string { return `
    -
    ThreadName:${ obj.obj.tableName }
    -
    Duration:${ obj.obj.durFormat }
    -
    Percent:${ obj.obj.percent }%
    +
    ThreadName:${obj.obj.tableName}
    +
    Duration:${obj.obj.durFormat}
    +
    Percent:${obj.obj.percent}%
    `; } @@ -402,15 +402,15 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { }, tip: (ioTierObj): string => { return `
    -
    Library:${ ioTierObj.obj.tableName }
    -
    Duration:${ ioTierObj.obj.durFormat }
    -
    Percent:${ ioTierObj.obj.percent }%
    +
    Library:${ioTierObj.obj.tableName}
    +
    Duration:${ioTierObj.obj.durFormat}
    +
    Percent:${ioTierObj.obj.percent}%
    `; }, angleClick: (ioTierBean): void => { // @ts-ignore - if (ioTierBean.tableName != 'other') { + if (ioTierBean.tableName !== 'other') { this.ioTierSoLevelClickEvent(ioTierBean); } }, @@ -520,7 +520,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { } else { let sortIoArr = [...this.currentLevelData]; if (column === 'tableName') { - ioTierCurrentTable!.recycleDataSource = sortIoArr.sort((firstIOElement, secondIOElement) => { + ioTierCurrentTable!.recycleDataSource = sortIoArr.sort((firstIOElement, secondIOElement) => { if (ioSort === 1) { if (firstIOElement.tableName > secondIOElement.tableName) { return 1; @@ -591,8 +591,8 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { for (let item of value) { pName = item.processName = item.processName === null || item.processName === undefined - ? `Process(${ item.pid })` - : `${ item.processName }(${ item.pid })`; + ? `Process(${item.pid})` + : `${item.processName}(${item.pid})`; ioPidDataDur += item.dur; } this.pidData.push({ @@ -609,7 +609,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { this.progressEL!.loading = false; this.processPieChart(); new ResizeObserver(() => { - if (this.parentElement?.clientHeight != 0) { + if (this.parentElement?.clientHeight !== 0) { this.ioTierTableProcess!.style.height = this.parentElement!.clientHeight - 50 + 'px'; this.ioTierTableProcess?.reMeauseHeight(); this.ioTierTableThread!.style.height = this.parentElement!.clientHeight - 50 + 'px'; @@ -695,7 +695,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { for (let item of value) { dur += item.dur; tName = item.threadName = - item.threadName === null || item.threadName === undefined ? `Thread(${ item.tid })` : `${ item.threadName }`; + item.threadName === null || item.threadName === undefined ? `Thread(${item.tid})` : `${item.threadName}`; } const threadData = { tableName: tName, @@ -772,7 +772,8 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { } getIOTierFunction(item: any): void { this.progressEL!.loading = true; - this.shadowRoot!.querySelector('.io-tier-subheading')!.textContent = 'Statistic By Function AllDuration'; + this.shadowRoot!.querySelector('.io-tier-subheading')!.textContent = + 'Statistic By Function AllDuration'; let tid = item.tid; let pid = item.pid; let type = item.type; @@ -877,7 +878,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { } private getTip() { - return (obj: { obj: { tableName: any; durFormat: any; percent: any; }; }): string => { + return (obj: { obj: { tableName: any; durFormat: any; percent: any } }): string => { return `
    Function:${obj.obj.tableName}
    Duration:${obj.obj.durFormat}
    @@ -902,8 +903,11 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { return ioTierReleaseType; } totalDurationData(duration: number): { - durFormat: string; percent: string; tableName: string; - duration: number; allDuration: number; + durFormat: string; + percent: string; + tableName: string; + duration: number; + allDuration: number; } { let allDuration; allDuration = { @@ -924,7 +928,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { percent: 0, durFormat: 0, }; - for (let i = 0 ; i < res.length ; i++) { + for (let i = 0; i < res.length; i++) { if (i < 19) { IOTierPieChartArr.push(res[i]); } else { diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneIoCompletionTimes.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneIoCompletionTimes.ts index 724400d5643b74f0c3367bb162d69b60820fc3ea..0acaca49bd3a306b886c23215eb4d8d1bc39e530 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneIoCompletionTimes.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneIoCompletionTimes.ts @@ -20,14 +20,12 @@ import '../../../../../base-ui/slicer/lit-slicer.js'; import { LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; import { procedurePool } from '../../../../database/Procedure.js'; import { - DISKIO_TYPE_MAP, FileSysEvent, IoCompletionTimes, - VirtualMemoryEvent, VM_TYPE_MAP, } from '../../../../database/logic-worker/ProcedureLogicWorkerFileSystem.js'; import { FilterData, TabPaneFilter } from '../TabPaneFilter.js'; -import { getTabIoCompletionTimesType, getTabVirtualMemoryType } from '../../../../database/SqlLite.js'; +import { getTabIoCompletionTimesType } from '../../../../database/SqlLite.js'; @element('tabpane-io-completiontimes') export class TabPaneIoCompletionTimes extends BaseElement { @@ -39,8 +37,6 @@ export class TabPaneIoCompletionTimes extends BaseElement { private ioCompletionTimesProgressEL: LitProgressBar | null | undefined; private ioCompletionTimesLoadingList: number[] = []; private ioCompletionTimesLoadingPage: any; - private ioCompletionTimesSortKey: string = 'startTs'; - private ioCompletionTimesSortType: number = 0; private currentSelection: SelectionParam | undefined | null; private ioCompletionTimesSource: Array = []; private ioCompletionTimesQueryDataSource: Array = []; @@ -55,9 +51,11 @@ export class TabPaneIoCompletionTimes extends BaseElement { this.queryData(ioCompletionTimesSelection!); }); // @ts-ignore - this.ioCompletionTimesTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 20 - 31 + 'px'; + this.ioCompletionTimesTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 20 - 31 + 'px'; // @ts-ignore - this.ioCompletionTimesTblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 20 - 31 + 'px'; + this.ioCompletionTimesTblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 20 - 31 + 'px'; this.ioCompletionTimesTbl!.recycleDataSource = []; this.ioCompletionTimesTblData!.recycleDataSource = []; } @@ -66,10 +64,12 @@ export class TabPaneIoCompletionTimes extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.ioCompletionTimesTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 33 + 'px'; + this.ioCompletionTimesTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 33 + 'px'; this.ioCompletionTimesTbl?.reMeauseHeight(); // @ts-ignore - this.ioCompletionTimesTblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 33 + 'px'; + this.ioCompletionTimesTblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 33 + 'px'; this.ioCompletionTimesTblData?.reMeauseHeight(); this.ioCompletionTimesLoadingPage.style.height = this.parentElement!.clientHeight - 24 + 'px'; } diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneVMEvents.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneVMEvents.ts index 9fd7245cceb6b614fb4fb7161ad5e277cfc53155..18da8baa61ca9c43c3ff2c3fd39d9a403b635cda 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneVMEvents.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneVMEvents.ts @@ -19,11 +19,7 @@ import { SelectionParam } from '../../../../bean/BoxSelection.js'; import '../../../../../base-ui/slicer/lit-slicer.js'; import { LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; import { procedurePool } from '../../../../database/Procedure.js'; -import { - FileSysEvent, - VirtualMemoryEvent, - VM_TYPE_MAP, -} from '../../../../database/logic-worker/ProcedureLogicWorkerFileSystem.js'; +import { VirtualMemoryEvent, VM_TYPE_MAP } from '../../../../database/logic-worker/ProcedureLogicWorkerFileSystem.js'; import { FilterData, TabPaneFilter } from '../TabPaneFilter.js'; import { getTabVirtualMemoryType } from '../../../../database/SqlLite.js'; @@ -39,8 +35,6 @@ export class TabPaneVirtualMemoryEvents extends BaseElement { private loadingPage: any; private vmEventSource: Array = []; private queryVmEventDataSource: Array = []; - private vmEventSortKey: string = 'startTs'; - private vmEventSortType: number = 0; private currentSelection: SelectionParam | undefined | null; private statsticsSelection: Array = []; @@ -55,7 +49,8 @@ export class TabPaneVirtualMemoryEvents extends BaseElement { // @ts-ignore this.vmEventTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 20 - 31 + 'px'; // @ts-ignore - this.vmEventTblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 20 - 31 + 'px'; + this.vmEventTblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 20 - 31 + 'px'; this.vmEventTbl!.recycleDataSource = []; this.vmEventTblData!.recycleDataSource = []; } @@ -64,10 +59,12 @@ export class TabPaneVirtualMemoryEvents extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.vmEventTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 33 + 'px'; + this.vmEventTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 33 + 'px'; this.vmEventTbl?.reMeauseHeight(); // @ts-ignore - this.vmEventTblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 33 + 'px'; + this.vmEventTblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 33 + 'px'; this.vmEventTblData?.reMeauseHeight(); this.loadingPage.style.height = this.parentElement!.clientHeight - 24 + 'px'; } diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatisticsAnalysis.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatisticsAnalysis.ts index 7fb924b881d06effbc79d338fe2efb481d6a4e6b..d999bebac15de81c0aef8be87cf989af0bbe867c 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatisticsAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatisticsAnalysis.ts @@ -217,7 +217,7 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { } private getVmTip() { - return (obj: { obj: { tableName: any; durFormat: any; percent: any; }; }): string => { + return (obj: { obj: { tableName: any; durFormat: any; percent: any } }): string => { return `
    ProcessName:${obj.obj.tableName}
    Duration:${obj.obj.durFormat}
    @@ -403,9 +403,9 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { }, tip: (vmLibraryObj): string => { return `
    -
    Library:${ vmLibraryObj.obj.tableName }
    -
    Duration:${ vmLibraryObj.obj.durFormat }
    -
    percent:${ vmLibraryObj.obj.percent }%
    +
    Library:${vmLibraryObj.obj.tableName}
    +
    Duration:${vmLibraryObj.obj.durFormat}
    +
    percent:${vmLibraryObj.obj.percent}%
    `; }, @@ -593,8 +593,8 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { for (let item of value) { pName = item.processName = item.processName === null || item.processName === undefined - ? `Process(${ item.pid })` - : `${ item.processName }(${ item.pid })`; + ? `Process(${item.pid})` + : `${item.processName}(${item.pid})`; vmPidDataDur += item.dur; } this.vmStatisticsAnalysisPidData.push({ @@ -697,7 +697,7 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { for (let item of value) { vmThreadDur += item.dur; tName = item.threadName = - item.threadName === null || item.threadName === undefined ? `Thread(${ item.tid })` : `${ item.threadName }`; + item.threadName === null || item.threadName === undefined ? `Thread(${item.tid})` : `${item.threadName}`; } const threadData = { tableName: tName, @@ -842,9 +842,9 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { }, tip: (vmObj): string => { return `
    -
    Function:${ vmObj.obj.tableName }
    -
    Duration:${ vmObj.obj.durFormat }
    -
    percent:${ vmObj.obj.percent }
    +
    Function:${vmObj.obj.tableName}
    +
    Duration:${vmObj.obj.durFormat}
    +
    percent:${vmObj.obj.percent}
    `; }, @@ -895,7 +895,7 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { // @ts-ignore return vmReleaseType; } - totalDurationData(duration: number): { durFormat: string; percent: string; tableName: string; duration: number; } { + totalDurationData(duration: number): { durFormat: string; percent: string; tableName: string; duration: number } { return { durFormat: Utils.getProbablyTime(duration), percent: ((duration / duration) * 100).toFixed(2), @@ -912,7 +912,7 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { percent: 0, durFormat: 0, }; - for (let i = 0 ; i < vmRes.length ; i++) { + for (let i = 0; i < vmRes.length; i++) { if (i < 19) { vmPieChartArr.push(vmRes[i]); } else { diff --git a/ide/src/trace/component/trace/sheet/frame/TabFrameSpacing.ts b/ide/src/trace/component/trace/sheet/frame/TabFrameSpacing.ts index 3c66d333116d55686f0db473e51f9d09df20f18d..bce670668c08946a96dae88adae226b8c46e092b 100644 --- a/ide/src/trace/component/trace/sheet/frame/TabFrameSpacing.ts +++ b/ide/src/trace/component/trace/sheet/frame/TabFrameSpacing.ts @@ -15,8 +15,8 @@ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; import { FrameSpacingStruct } from '../../../../database/ui-worker/ProcedureWorkerFrameSpacing.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { resizeObserver } from '../SheetUtils.js'; import { Utils } from '../../base/Utils.js'; @@ -29,8 +29,9 @@ export class TabFrameSpacing extends BaseElement { set data(frameSpacingParam: SelectionParam) { let secondToMillisecond: number = 1000_000.0; let fixedNumber: number = 5; - this.range!.textContent = `Selected range: ${parseFloat(((frameSpacingParam.rightNs - frameSpacingParam.leftNs) / - secondToMillisecond).toFixed(fixedNumber))} ms`; + this.range!.textContent = `Selected range: ${parseFloat( + ((frameSpacingParam.rightNs - frameSpacingParam.leftNs) / secondToMillisecond).toFixed(fixedNumber) + )} ms`; let tableList: FrameSpacingTableStruct[] = []; for (let index = 0; index < frameSpacingParam.frameSpacing.length; index++) { this.constructTable(frameSpacingParam.frameSpacing[index], tableList); @@ -61,7 +62,7 @@ export class TabFrameSpacing extends BaseElement { tableList.push(this.getSplitSpacingData(structValue, startNS, 'Y')); } - getSplitSpacingData(structValue: FrameSpacingStruct, startNS: number, propertyStr: string): FrameSpacingTableStruct{ + getSplitSpacingData(structValue: FrameSpacingStruct, startNS: number, propertyStr: string): FrameSpacingTableStruct { let frameSpacing: FrameSpacingTableStruct = new FrameSpacingTableStruct(); let secondToNanosecond: number = 1000_000_000; frameSpacing.index = structValue.id; @@ -107,10 +108,7 @@ export class TabFrameSpacing extends BaseElement { }); } - sortByColumn(framesDetail: { - sort: number, - key: string, - }): void { + sortByColumn(framesDetail: { sort: number; key: string }): void { let compare = function (property: string, sort: number, type: string) { return function ( frameSpacingLeftData: FrameSpacingTableStruct, @@ -124,8 +122,9 @@ export class TabFrameSpacing extends BaseElement { // @ts-ignore let leftSpacingData = frameSpacingLeftData[property]; if (type === 'number') { - return sort === thirdSortNumber ? parseFloat(rightSpacingData) - parseFloat(leftSpacingData) : - parseFloat(leftSpacingData) - parseFloat(rightSpacingData); + return sort === thirdSortNumber + ? parseFloat(rightSpacingData) - parseFloat(leftSpacingData) + : parseFloat(leftSpacingData) - parseFloat(rightSpacingData); } else { if (rightSpacingData > leftSpacingData) { return sort === thirdSortNumber ? SecondSortNumber : firstSortNumber; diff --git a/ide/src/trace/component/trace/sheet/frame/TabPaneFrameDynamic.ts b/ide/src/trace/component/trace/sheet/frame/TabPaneFrameDynamic.ts index 3a18f5811151d15238e251ef0739f32e4cdfa864..c0464dcbc2c647a424ad8e65c5f604635f4668cd 100644 --- a/ide/src/trace/component/trace/sheet/frame/TabPaneFrameDynamic.ts +++ b/ide/src/trace/component/trace/sheet/frame/TabPaneFrameDynamic.ts @@ -14,11 +14,11 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { resizeObserver } from '../SheetUtils.js'; -import { FrameDynamicStruct } from '../../../../database/ui-worker/ProcedureWorkerFrameDynamic.js'; -import { FrameAnimationSelect } from '../../../../bean/FrameComponentBean.js'; +import { type FrameDynamicStruct } from '../../../../database/ui-worker/ProcedureWorkerFrameDynamic.js'; +import { type FrameAnimationSelect } from '../../../../bean/FrameComponentBean.js'; import { Utils } from '../../base/Utils.js'; @element('tabpane-frame-dynamic') @@ -30,8 +30,9 @@ export class TabPaneFrameDynamic extends BaseElement { set data(frameDynamicParam: SelectionParam) { let secondToMillisecond: number = 1000_000.0; let fixedNumber: number = 5; - this.range!.textContent = `Selected range: ${parseFloat(((frameDynamicParam.rightNs - - frameDynamicParam.leftNs) / secondToMillisecond).toFixed(fixedNumber))} ms`; + this.range!.textContent = `Selected range: ${parseFloat( + ((frameDynamicParam.rightNs - frameDynamicParam.leftNs) / secondToMillisecond).toFixed(fixedNumber) + )} ms`; this.buildDynamicTable(frameDynamicParam.frameDynamic); } @@ -42,11 +43,11 @@ export class TabPaneFrameDynamic extends BaseElement { this.range!.style.visibility = 'visible'; } let result: FrameAnimationSelect[] = []; - dynamicDataList.forEach(dynamic => { + dynamicDataList.forEach((dynamic) => { result.push({ id: dynamic.id, value: dynamic.typeValue, - timestamp: Utils.getTimeString(dynamic.ts) + timestamp: Utils.getTimeString(dynamic.ts), }); }); this.frameDynamicSource = result; @@ -97,10 +98,7 @@ export class TabPaneFrameDynamic extends BaseElement { `; } - private sortByColumn(framesDetail: { - sort: number, - key: string, - }): void { + private sortByColumn(framesDetail: { sort: number; key: string }): void { let compare = function (property: string, sort: number, type: string) { return function (frameDynamicLeft: FrameAnimationSelect, frameDynamicRight: FrameAnimationSelect): number { let firstSortNumber: number = -1; @@ -111,8 +109,9 @@ export class TabPaneFrameDynamic extends BaseElement { // @ts-ignore let leftData = frameDynamicLeft[property]; if (type === 'number') { - return sort === thirdSortNumber ? parseFloat(rightData) - parseFloat(leftData) : - parseFloat(leftData) - parseFloat(rightData); + return sort === thirdSortNumber + ? parseFloat(rightData) - parseFloat(leftData) + : parseFloat(leftData) - parseFloat(rightData); } else { if (rightData > leftData) { return sort === thirdSortNumber ? SecondSortNumber : firstSortNumber; diff --git a/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuClickSelect.ts b/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuClickSelect.ts index 6abc2096b668f8eb52e0e5463c282627eaf2bc1b..4177f36ccf2f335fd14b99ccdfbf333a0319fafe 100644 --- a/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuClickSelect.ts +++ b/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuClickSelect.ts @@ -13,7 +13,7 @@ * limitations under the License. */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { resizeObserver } from '../SheetUtils.js'; import { queryGpuDataByTs } from '../../../../database/SqlLite.js'; import { VmTrackerChart } from '../../../chart/SpVmTrackerChart.js'; @@ -32,9 +32,17 @@ export class TabPaneGpuClickSelect extends BaseElement { private gpuTbl: LitTable | null | undefined; private gpuSource: Array = []; gpuClickData(gpu: { type: string; startTs: number }) { - let label = this.gpuTbl!.shadowRoot!.querySelector('.thead')?.firstChild?.firstChild?.firstChild; - if (label) { - (label as HTMLLabelElement).innerHTML = gpu.type === 'total' ? 'Module / Category' : 'Window / Module / Category'; + let td = this.gpuTbl!.shadowRoot!.querySelector('.thead')?.firstChild?.firstChild as HTMLDivElement; + let title = gpu.type === 'total' ? 'Module / Category' : 'Window / Module / Category'; + let titleArr = title.split('/'); + if (td) { + td.innerHTML = ''; + for (let i = 0; i < titleArr.length; i++) { + let label = document.createElement('label'); + label.style.cursor = 'pointer'; + i == 0 ? (label.innerHTML = titleArr[i]) : (label.innerHTML = '/' + titleArr[i]); + td.appendChild(label); + } } //@ts-ignore this.gpuTbl?.shadowRoot?.querySelector('.table')?.style?.height = this.parentElement!.clientHeight - 45 + 'px'; @@ -129,7 +137,7 @@ export class TabPaneGpuClickSelect extends BaseElement { } - + @@ -146,7 +154,7 @@ export class TabPaneGpuClickSelect extends BaseElement { return gpuB.size - gpuA.size; } }; - let deepCompare = (arr: GpuTreeItem[]) => { + let deepCompare = (arr: GpuTreeItem[]): void => { arr.forEach((it) => { if (it.children) { deepCompare(it.children); diff --git a/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuClickSelectComparison.ts b/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuClickSelectComparison.ts index 5d2995e2a8c129684b9f2ed64ab313ab38ed2dd7..7e800896e7e97d9badc161c556a25d13d57f4f7b 100644 --- a/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuClickSelectComparison.ts +++ b/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuClickSelectComparison.ts @@ -13,17 +13,17 @@ * limitations under the License. */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; +import { type LitSelect } from '../../../../../base-ui/select/LitSelect.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { queryGpuDataByTs } from '../../../../database/SqlLite.js'; -import { SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; +import { type SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; import { VmTrackerChart } from '../../../chart/SpVmTrackerChart.js'; import { SpSystemTrace } from '../../../SpSystemTrace.js'; import { Utils } from '../../base/Utils.js'; import { compare, CompareStruct, resizeObserverFromMemory } from '../SheetUtils.js'; import '../TabPaneJsMemoryFilter.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; import { TabPaneGpuClickSelect } from './TabPaneGpuClickSelect.js'; interface GpuTreeItem { name: string; @@ -63,11 +63,19 @@ export class TabPaneGpuClickSelectComparison extends TabPaneGpuClickSelect { }); return gpuData; } - async getGpuClickDataByDB(type: string, startTs: number, dataList: Array) { + async getGpuClickDataByDB(type: string, startTs: number, dataList: Array): Promise { const dataArray = []; - let label = this.gpuComparisonTbl!.shadowRoot!.querySelector('.thead')?.firstChild?.firstChild?.firstChild; - if (label) { - (label as HTMLLabelElement).innerHTML = type === 'total' ? 'Module / Category' : 'Window / Module / Category'; + let td = this.gpuComparisonTbl!.shadowRoot!.querySelector('.thead')?.firstChild?.firstChild as HTMLDivElement; + let title = type === 'total' ? 'Module / Category' : 'Window / Module / Category'; + let titleArr = title.split('/'); + if (td) { + td.innerHTML = ''; + for (let i = 0; i < titleArr.length; i++) { + let label = document.createElement('label'); + label.style.cursor = 'pointer'; + i == 0 ? (label.innerHTML = titleArr[i]) : (label.innerHTML = '/' + titleArr[i]); + td.appendChild(label); + } } //@ts-ignore this.gpuComparisonTbl?.shadowRoot?.querySelector('.table')?.style?.height = @@ -113,7 +121,7 @@ export class TabPaneGpuClickSelectComparison extends TabPaneGpuClickSelect { }); }); } - async getComparisonData(targetStartNs: number, type: string) { + async getComparisonData(targetStartNs: number, type: string): Promise { let comparisonData: Array = []; let targetGpuData: Array = []; let data = await this.queryDataByDB(type, targetStartNs); @@ -170,7 +178,7 @@ export class TabPaneGpuClickSelectComparison extends TabPaneGpuClickSelect { } - + diff --git a/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuGL.ts b/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuGL.ts index 4acf842915e4da06a0dfb18862b92e523daac560..cf55999f24d4fda095228beff30dbc1eae0326b6 100644 --- a/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuGL.ts +++ b/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuGL.ts @@ -16,11 +16,10 @@ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; import { LitTable } from '../../../../../base-ui/table/lit-table.js'; import { SelectionParam } from '../../../../bean/BoxSelection.js'; -import { queryGpuGLDataByRange } from '../../../../database/SqlLite.js'; +import { queryGpuDataTab } from '../../../../database/SqlLite.js'; import { log } from '../../../../../log/Log.js'; import { getProbablyTime } from '../../../../database/logic-worker/ProcedureLogicWorkerCommon.js'; import { resizeObserver } from '../SheetUtils.js'; -import { VmTrackerChart } from '../../../chart/SpVmTrackerChart.js'; import { Utils } from '../../base/Utils.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; @@ -47,14 +46,15 @@ export class TabPaneGpuGL extends BaseElement { this.glTbl?.shadowRoot?.querySelector('.table')?.style?.height = this.parentElement!.clientHeight - 45 + 'px'; this.range!.textContent = 'Selected range: ' + ((glParam.rightNs - glParam.leftNs) / 1000000.0).toFixed(5) + ' ms'; this.glTbl!.loading = true; - queryGpuGLDataByRange( + queryGpuDataTab( MemoryConfig.getInstance().iPid, glParam.leftNs, glParam.rightNs, - MemoryConfig.getInstance().snapshotDur + MemoryConfig.getInstance().snapshotDur, + "'mem.gl_pss'" ).then((result) => { this.glTbl!.loading = false; - log('queryGpuGLDataByRange result size : ' + result.length); + log('queryGpuDataTab result size : ' + result.length); if (result.length > 0) { result.forEach((it: GL) => { it.startTsStr = getProbablyTime(it.startTs); diff --git a/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuTotalBoxSelect.ts b/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuTotalBoxSelect.ts index 049c2865f84d8214027f04a8ec43f49924ab9eca..ecc02f5d64046df6c062c77d5135d59f83443032 100644 --- a/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuTotalBoxSelect.ts +++ b/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuTotalBoxSelect.ts @@ -14,9 +14,9 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { queryGpuDataByRange } from '../../../../database/SqlLite.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { log } from '../../../../../log/Log.js'; import { getProbablyTime } from '../../../../database/logic-worker/ProcedureLogicWorkerCommon.js'; import { resizeObserver } from '../SheetUtils.js'; @@ -56,7 +56,11 @@ export class TabPaneGpuTotalBoxSelect extends BaseElement { this.range!.textContent = 'Selected range: ' + ((gpuTotalBoxParam.rightNs - gpuTotalBoxParam.leftNs) / 1000000.0).toFixed(5) + ' ms'; this.gpuBoxTbl!.loading = true; - queryGpuDataByRange(gpuTotalBoxParam.leftNs, gpuTotalBoxParam.rightNs, MemoryConfig.getInstance().snapshotDur).then((result) => { + queryGpuDataByRange( + gpuTotalBoxParam.leftNs, + gpuTotalBoxParam.rightNs, + MemoryConfig.getInstance().snapshotDur + ).then((result) => { this.gpuBoxTbl!.loading = false; if (result != null && result.length > 0) { log('getTabStartups result size : ' + result.length); diff --git a/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuWindowBoxSelect.ts b/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuWindowBoxSelect.ts index 38453b5c37070586e3f25ed932b8bf1f444b3f27..7b13628ed3c0a7a8741eef71bcb7f36cd3b8d047 100644 --- a/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuWindowBoxSelect.ts +++ b/ide/src/trace/component/trace/sheet/gpu/TabPaneGpuWindowBoxSelect.ts @@ -14,8 +14,8 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { queryGpuDataByRange } from '../../../../database/SqlLite.js'; import { log } from '../../../../../log/Log.js'; import { getProbablyTime } from '../../../../database/logic-worker/ProcedureLogicWorkerCommon.js'; @@ -56,7 +56,11 @@ export class TabPaneGpuWindowBoxSelect extends BaseElement { this.range!.textContent = 'Selected range: ' + ((gpuBoxParam.rightNs - gpuBoxParam.leftNs) / 1000000.0).toFixed(5) + ' ms'; this.gpuBoxTbl!.loading = true; - queryGpuDataByRange(gpuBoxParam.leftNs, gpuBoxParam.rightNs, MemoryConfig.getInstance().snapshotDur).then((result) => { + queryGpuDataByRange( + gpuBoxParam.leftNs, + gpuBoxParam.rightNs, + MemoryConfig.getInstance().snapshotDur + ).then((result) => { this.gpuBoxTbl!.loading = false; if (result != null && result.length > 0) { log('getTabStartups result size : ' + result.length); diff --git a/ide/src/trace/component/trace/sheet/gpu/TabPaneGraph.ts b/ide/src/trace/component/trace/sheet/gpu/TabPaneGraph.ts new file mode 100644 index 0000000000000000000000000000000000000000..7fe61e25d226831aa25adcaa63db7fde0c7409f8 --- /dev/null +++ b/ide/src/trace/component/trace/sheet/gpu/TabPaneGraph.ts @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2022 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. + */ + +import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; +import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { queryGpuDataTab } from '../../../../database/SqlLite.js'; +import { log } from '../../../../../log/Log.js'; +import { getProbablyTime } from '../../../../database/logic-worker/ProcedureLogicWorkerCommon.js'; +import { resizeObserver } from '../SheetUtils.js'; +import { Utils } from '../../base/Utils.js'; +import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; + +interface Graph { + startTs: number; + startTsStr?: string; + size: number; + sizeStr?: string; +} + +@element('tabpane-gpu-graph') +export class TabPaneGpuGraph extends BaseElement { + private graphTbl: LitTable | null | undefined; + private range: HTMLLabelElement | null | undefined; + private graphSource: Array = []; + private currentSelectionParam: SelectionParam | undefined; + + set data(graphParam: SelectionParam | any) { + if (this.currentSelectionParam === graphParam) { + return; + } + this.currentSelectionParam = graphParam; + //@ts-ignore + this.graphTbl?.shadowRoot?.querySelector('.table')?.style?.height = this.parentElement!.clientHeight - 45 + 'px'; + this.range!.textContent = + 'Selected range: ' + ((graphParam.rightNs - graphParam.leftNs) / 1000000.0).toFixed(5) + ' ms'; + this.graphTbl!.loading = true; + queryGpuDataTab( + MemoryConfig.getInstance().iPid, + graphParam.leftNs, + graphParam.rightNs, + MemoryConfig.getInstance().snapshotDur, + "'mem.graph_pss'" + ).then((result) => { + this.graphTbl!.loading = false; + log('queryGpuDataTab result size : ' + result.length); + if (result.length > 0) { + result.forEach((it: Graph) => { + it.startTsStr = getProbablyTime(it.startTs); + it.sizeStr = Utils.getBinaryByteWithUnit(it.size); + }); + this.graphSource = result; + this.graphTbl!.recycleDataSource = this.graphSource; + } else { + this.graphSource = []; + this.graphTbl!.recycleDataSource = []; + } + }); + } + + initElements(): void { + this.graphTbl = this.shadowRoot?.querySelector('#tb-graph'); + this.range = this.shadowRoot?.querySelector('#graph-time-range'); + } + + connectedCallback(): void { + super.connectedCallback(); + resizeObserver(this.parentElement!, this.graphTbl!); + } + + initHtml(): string { + return ` + +
    +
    + +
    +
    + + + + + + +
    + `; + } +} diff --git a/ide/src/trace/component/trace/sheet/hilog/TabPaneHiLogSummary.ts b/ide/src/trace/component/trace/sheet/hilog/TabPaneHiLogSummary.ts index 6bdcac25363f300518e19fca1e1547f10361ba16..5688163c5621ea680a3503466ddfd5fa705009a2 100644 --- a/ide/src/trace/component/trace/sheet/hilog/TabPaneHiLogSummary.ts +++ b/ide/src/trace/component/trace/sheet/hilog/TabPaneHiLogSummary.ts @@ -31,7 +31,7 @@ export class TabPaneHiLogSummary extends BaseElement { private expansionUpIcon: LitIcon | undefined | null; private expansionDownIcon: LitIcon | undefined | null; private expandedNodeList: Set = new Set(); - private logLevel: string[] = ['Debug', 'Info', 'Warn', 'Error','Fatal']; + private logLevel: string[] = ['Debug', 'Info', 'Warn', 'Error', 'Fatal']; private selectTreeDepth: number = 0; private currentSelection: SelectionParam | undefined; @@ -61,9 +61,9 @@ export class TabPaneHiLogSummary extends BaseElement { this.expansionDiv = this.shadowRoot?.querySelector('.expansion-div'); this.expansionUpIcon = this.shadowRoot?.querySelector('.expansion-up-icon'); this.expansionDownIcon = this.shadowRoot?.querySelector('.expansion-down-icon'); - let summaryTreeLevel: string[] = ['Level', '/Process', '/Tag', '/Message'] - this.shadowRoot?.querySelectorAll('.head-label').forEach(summaryTreeHead => { - summaryTreeHead.addEventListener('click', ()=>{ + let summaryTreeLevel: string[] = ['Level', '/Process', '/Tag', '/Message']; + this.shadowRoot?.querySelectorAll('.head-label').forEach((summaryTreeHead) => { + summaryTreeHead.addEventListener('click', () => { this.selectTreeDepth = summaryTreeLevel.indexOf(summaryTreeHead.textContent!); this.expandedNodeList.clear(); this.refreshSelectDepth(this.logTreeNodes); @@ -158,17 +158,17 @@ export class TabPaneHiLogSummary extends BaseElement { } this.refreshSelectDepth(this.logTreeNodes); this.refreshRowNodeTable(true); - } + }; - private refreshSelectDepth(logTreeNodes: LogTreeNode[]){ - logTreeNodes.forEach(item => { + private refreshSelectDepth(logTreeNodes: LogTreeNode[]) { + logTreeNodes.forEach((item) => { if (item.depth < this.selectTreeDepth) { this.expandedNodeList.add(item.id); if (item.children.length > 0) { this.refreshSelectDepth(item.children); } } - }) + }); } initTabSheetEl(parentTabEl: HTMLElement) { diff --git a/ide/src/trace/component/trace/sheet/hilog/TabPaneHiLogs.ts b/ide/src/trace/component/trace/sheet/hilog/TabPaneHiLogs.ts index 2e10db4315969a41a3b8083ea4bc3daa90954489..6b2065bc39fbc801f1183183d84043f7b71449bc 100644 --- a/ide/src/trace/component/trace/sheet/hilog/TabPaneHiLogs.ts +++ b/ide/src/trace/component/trace/sheet/hilog/TabPaneHiLogs.ts @@ -69,8 +69,9 @@ export class TabPaneHiLogs extends BaseElement { this.tagFilterInput = this.shadowRoot?.querySelector('#tag-filter'); this.searchFilterInput = this.shadowRoot?.querySelector('#search-filter'); this.processFilter = this.shadowRoot?.querySelector('#process-filter'); - this.spSystemTrace = document.querySelector('body > sp-application')?. - shadowRoot?.querySelector('#sp-system-trace'); + this.spSystemTrace = document + .querySelector('body > sp-application') + ?.shadowRoot?.querySelector('#sp-system-trace'); this.tableTimeHandle = this.delayedRefresh(this.refreshTable); this.tagFilterDiv = this.shadowRoot!.querySelector('#tagFilter'); this.hiLogDownLoadTbl = this.shadowRoot!.querySelector('#tb-hilogs'); @@ -125,6 +126,7 @@ export class TabPaneHiLogs extends BaseElement {
    +
    @@ -268,7 +270,7 @@ export class TabPaneHiLogs extends BaseElement { this.containerClientHeight = this.parentTabEl.clientHeight; } if (this.systemLogSource.length > 0 && this.logTable) { - let tableHeight = this.containerClientHeight - (this.logTitle?.clientHeight || 0) - tableRowHeight; + let tableHeight = this.containerClientHeight - (this.logTitle?.clientHeight || 0) - tableRowHeight - 12; this.scrollContainer!.style.height = `${tableHeight}px`; if (this.filterData.length === 0) { this.logTable.style.height = this.scrollContainer!.style.height; @@ -290,7 +292,6 @@ export class TabPaneHiLogs extends BaseElement { this.logTableTitle!.textContent = `Hilogs [${this.startDataIndex || 0}, ${maxLength}] / ${this.filterData.length || 0}`; let tableFragment = document.createDocumentFragment(); - this.buildTableHead(tableFragment); this.createVirtualDOM(tableFragment); this.logTable.append(tableFragment); } @@ -303,17 +304,22 @@ export class TabPaneHiLogs extends BaseElement { search = search.replace(/\s/g, ''); let processSearch = this.processFilter?.value.toLowerCase() || ''; processSearch = processSearch.replace(/\s/g, ''); - return (data.startTs || 0) >= TraceRow.range!.startNS && (data.startTs || 0) <= TraceRow.range!.endNS && + return ( + (data.startTs || 0) >= TraceRow.range!.startNS && + (data.startTs || 0) <= TraceRow.range!.endNS && (level === 0 || this.optionLevel.indexOf(data.level!) >= level) && (this.allowTag.size === 0 || this.allowTag.has(data.tag!.toLowerCase())) && (search === '' || data.context!.toLowerCase().replace(/\s/g, '').indexOf(search) >= 0) && - (processSearch === '' || (data.processName !== null && - data.processName!.toLowerCase().replace(/\s/g, '').indexOf(processSearch) >= 0)); + (processSearch === '' || + (data.processName !== null && data.processName!.toLowerCase().replace(/\s/g, '').indexOf(processSearch) >= 0)) + ); } private refreshTable(): void { this.traceSheetEl!.systemLogFlag = undefined; this.spSystemTrace?.refreshCanvas(false); + let headEl = this.shadowRoot?.querySelector('#logs-head-content') + this.buildTableHead(headEl!); this.updateFilterData(); this.updateVisibleData(); } @@ -330,7 +336,7 @@ export class TabPaneHiLogs extends BaseElement { private createVirtualDOM(tableFragment: DocumentFragment): void { if (this.visibleData) { - this.visibleData.forEach((row) => { + this.visibleData.forEach((row, index) => { let trEL = document.createElement('tr'); let time = document.createElement('td'); let timeStampEl = document.createElement('td'); @@ -342,13 +348,24 @@ export class TabPaneHiLogs extends BaseElement { if (colorIndex >= 0) { trEL.style.color = ColorUtils.getHilogColor(row.level!); } + if (index === 0) { + let height = + (this.scrollContainer!.scrollTop <= tableRowHeight ? 0 : this.scrollContainer!.scrollTop) + tableRowHeight; + trEL.style.height = `${height}px`; + } time.textContent = `${row.originTime}`; + time.title = `${row.originTime}`; timeStampEl.classList.add('time-td'); timeStampEl.textContent = `${ns2Timestamp(row.startTs!)}`; + timeStampEl.title = `${ns2Timestamp(row.startTs!)}`; levelEl.textContent = `${row.level}`; + levelEl.title = `${row.level}`; tagEl.textContent = `${row.tag}`; + tagEl.title = `${row.tag}`; processNameEl.textContent = `${row.processName}`; + processNameEl.title = `${row.processName}`; messageEl.textContent = `${row.context}`; + messageEl.title = `${row.context}`; trEL.addEventListener('mouseover', () => { let pointX: number = ns2x( row.startTs || 0, @@ -375,17 +392,21 @@ export class TabPaneHiLogs extends BaseElement { } } - private buildTableHead(tableFragment: DocumentFragment): void { + private buildTableHead(tableFragment: HTMLDivElement): void { + tableFragment.innerHTML = ''; let trEL = document.createElement('tr'); + trEL.style.display = 'grid'; + trEL.style.width = '100%'; + trEL.style.marginTop = '8px'; this.tableColumnHead.forEach((columnText) => { let columnEl = document.createElement('div'); columnEl.textContent = columnText; - columnEl.className = 'head-column'; + columnEl.style.whiteSpace = 'nowrap'; + columnEl.style.overflow = 'hidden'; + columnEl.style.textOverflow = 'ellipsis'; + columnEl.style.fontWeight = 'bold'; trEL.appendChild(columnEl); }); - let height = - (this.scrollContainer!.scrollTop <= tableRowHeight ? 0 : this.scrollContainer!.scrollTop) + tableRowHeight; - trEL.style.height = `${height}px`; tableFragment.appendChild(trEL); } @@ -473,7 +494,6 @@ export class TabPaneHiLogs extends BaseElement { display: block; height: auto; overflow-y: scroll; - margin-top: 14px; } tr { display: grid; diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts index 3f888b81201f29829a77079feec061063285ec5b..fc3e9450e84875f02752794f49078cd5e02e8b4a 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts @@ -140,9 +140,9 @@ export class TabPanePerfAnalysis extends BaseElement { }, tip: (perfObj): string => { return `
    -
    Process:${ perfObj.obj.tableName }
    -
    Weight:${ perfObj.obj.countFormat }
    -
    Percent:${ perfObj.obj.percent }%
    +
    Process:${perfObj.obj.tableName}
    +
    Weight:${perfObj.obj.countFormat}
    +
    Percent:${perfObj.obj.percent}%
    `; }, @@ -234,9 +234,9 @@ export class TabPanePerfAnalysis extends BaseElement { }, tip: (obj): string => { return `
    -
    Thread:${ obj.obj.tableName }
    -
    Weight:${ obj.obj.countFormat }
    -
    Percent:${ obj.obj.percent }%
    +
    Thread:${obj.obj.tableName}
    +
    Weight:${obj.obj.countFormat}
    +
    Percent:${obj.obj.percent}%
    `; }, @@ -320,9 +320,9 @@ export class TabPanePerfAnalysis extends BaseElement { }, tip: (obj): string => { return `
    -
    Library:${ obj.obj.tableName }
    -
    Weight:${ obj.obj.countFormat }
    -
    Percent:${ obj.obj.percent }%
    +
    Library:${obj.obj.tableName}
    +
    Weight:${obj.obj.countFormat}
    +
    Percent:${obj.obj.percent}%
    `; }, @@ -727,7 +727,7 @@ export class TabPanePerfAnalysis extends BaseElement { } private getTip() { - return (obj: { obj: { tableName: any; countFormat: any; percent: any; }; }): string => { + return (obj: { obj: { tableName: any; countFormat: any; percent: any } }): string => { return `
    Function:${obj.obj.tableName}
    Weight:${obj.obj.countFormat}
    @@ -736,7 +736,13 @@ export class TabPanePerfAnalysis extends BaseElement { }; } - totalCountData(count: number): { countFormat: string; percent: string; count: number; allCount: number; pid: string; } { + totalCountData(count: number): { + countFormat: string; + percent: string; + count: number; + allCount: number; + pid: string; + } { let allCount; allCount = { countFormat: Utils.timeMsFormat2p(count * (SpHiPerf.stringResult?.fValue || 1)), @@ -757,7 +763,7 @@ export class TabPanePerfAnalysis extends BaseElement { percent: 0, countFormat: 0, }; - for (let i = 0 ; i < res.length ; i++) { + for (let i = 0; i < res.length; i++) { if (i < 19) { pieChartArr.push(res[i]); } else { diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfBottomUp.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfBottomUp.ts index 13287ce06edd0661e9ad5f05cbf2c341497cf87d..8a9a3a16366c2124783a871e54a57190d0a4591a 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfBottomUp.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfBottomUp.ts @@ -14,17 +14,17 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import '../TabPaneFilter.js'; -import { FilterData, TabPaneFilter } from '../TabPaneFilter.js'; +import { type FilterData, TabPaneFilter } from '../TabPaneFilter.js'; import { SelectionParam } from '../../../../bean/BoxSelection.js'; import '../../../chart/FrameChart.js'; import '../../../DisassemblingWindow.js'; import '../../../../../base-ui/slicer/lit-slicer.js'; import '../../../../../base-ui/progress-bar/LitProgressBar.js'; import { procedurePool } from '../../../../database/Procedure.js'; -import { LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; -import { PerfBottomUpStruct } from '../../../../bean/PerfBottomUpStruct.js'; +import { type LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; +import { type PerfBottomUpStruct } from '../../../../bean/PerfBottomUpStruct.js'; @element('tabpane-perf-bottom-up') export class TabpanePerfBottomUp extends BaseElement { @@ -137,7 +137,7 @@ export class TabpanePerfBottomUp extends BaseElement { const bottomUpData = evt.detail.data as PerfBottomUpStruct; document.dispatchEvent( new CustomEvent('number_calibration', { - detail: { time: bottomUpData.tsArray}, + detail: { time: bottomUpData.tsArray }, }) ); callStack!.push(bottomUpData); @@ -200,14 +200,12 @@ export class TabpanePerfBottomUp extends BaseElement { super.connectedCallback(); new ResizeObserver(() => { // @ts-ignore - this.bottomUpTable?.shadowRoot.querySelector('.table').style.height = `${ - this.parentElement!.clientHeight - tableOffsetHeight - }px`; + this.bottomUpTable?.shadowRoot.querySelector('.table').style.height = `${this.parentElement!.clientHeight - tableOffsetHeight + }px`; this.bottomUpTable?.reMeauseHeight(); // @ts-ignore - this.stackTable?.shadowRoot.querySelector('.table').style.height = `${ - this.parentElement!.clientHeight - tableOffsetHeight - spanHeight - }px`; + this.stackTable?.shadowRoot.querySelector('.table').style.height = `${this.parentElement!.clientHeight - tableOffsetHeight - spanHeight + }px`; this.stackTable?.reMeauseHeight(); }).observe(this.parentElement!); } diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts index e16c38f1d88241ae1774ea361013c861a040eedc..16cc03f897dcd29511b1464c8abb288a37fa2695 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts @@ -55,7 +55,7 @@ export class TabpanePerfProfile extends BaseElement { private currentSelection: SelectionParam | undefined; set data(perfProfilerSelection: SelectionParam | any) { - if (perfProfilerSelection == this.currentSelection) { + if (perfProfilerSelection === this.currentSelection) { return; } this.searchValue = ''; @@ -101,7 +101,7 @@ export class TabpanePerfProfile extends BaseElement { parentsData: Array ): boolean { for (let perfCall of perfCallSrc) { - if (perfCall.id == target.id) { + if (perfCall.id === target.id) { parentsData.push(perfCall); return true; } else { @@ -120,7 +120,7 @@ export class TabpanePerfProfile extends BaseElement { children: Array ): boolean { for (let perfCall of perfCallSrc) { - if (perfCall.id == id && perfCall.children.length == 0) { + if (perfCall.id === id && perfCall.children.length === 0) { children.push(perfCall); return true; } else { @@ -141,7 +141,7 @@ export class TabpanePerfProfile extends BaseElement { let maxDur = 0; function findMaxStack(call: PerfCallChainMerageData) { - if (call.children.length == 0) { + if (call.children.length === 0) { if (call.dur > maxDur) { maxDur = call.dur; maxId = call.id; @@ -261,11 +261,11 @@ export class TabpanePerfProfile extends BaseElement { this.perfProfilerList = this.shadowRoot?.querySelector('#tb-perf-list'); let filterFunc = (data: any) => { let perfProfileFuncArgs: any[] = []; - if (data.type == 'check') { + if (data.type === 'check') { if (data.item.checked) { perfProfileFuncArgs.push({ funcName: 'splitTree', - funcArgs: [data.item.name, data.item.select == '0', data.item.type == 'symbol'], + funcArgs: [data.item.name, data.item.select === '0', data.item.type === 'symbol'], }); } else { perfProfileFuncArgs.push({ @@ -281,7 +281,7 @@ export class TabpanePerfProfile extends BaseElement { funcArgs: [data.item.name], }); } - } else if (data.type == 'select') { + } else if (data.type === 'select') { perfProfileFuncArgs.push({ funcName: 'resotreAllNode', funcArgs: [[data.item.name]], @@ -292,10 +292,10 @@ export class TabpanePerfProfile extends BaseElement { }); perfProfileFuncArgs.push({ funcName: 'splitTree', - funcArgs: [data.item.name, data.item.select == '0', data.item.type == 'symbol'], + funcArgs: [data.item.name, data.item.select === '0', data.item.type === 'symbol'], }); - } else if (data.type == 'button') { - if (data.item == 'symbol') { + } else if (data.type === 'button') { + if (data.item === 'symbol') { if (this.perfSelectedData && !this.perfSelectedData.canCharge) { return; } @@ -308,7 +308,7 @@ export class TabpanePerfProfile extends BaseElement { } else { return; } - } else if (data.item == 'library') { + } else if (data.item === 'library') { if (this.perfSelectedData && !this.perfSelectedData.canCharge) { return; } @@ -321,7 +321,7 @@ export class TabpanePerfProfile extends BaseElement { } else { return; } - } else if (data.item == 'restore') { + } else if (data.item === 'restore') { if (data.remove != undefined && data.remove.length > 0) { let list = data.remove.map((item: any) => { return item.name; @@ -359,7 +359,7 @@ export class TabpanePerfProfile extends BaseElement { this.perfProfilerFilter!.getDataLibrary(filterFunc); this.perfProfilerFilter!.getDataMining(filterFunc); this.perfProfilerFilter!.getCallTreeData((data: any) => { - if (data.value == 0) { + if (data.value === 0) { this.refreshAllNode({ ...this.perfProfilerFilter!.getFilterTreeData(), callTree: data.checks, @@ -471,7 +471,7 @@ export class TabpanePerfProfile extends BaseElement { perfProfileTabFilter.style.display = 'none'; } this.perfProfilerModal!.style.height = this.perfProfilerTbl!.clientHeight - 2 + 'px'; //2 is borderWidth - if (this.perfProfilerTbl!.style.visibility == 'hidden') { + if (this.perfProfilerTbl!.style.visibility === 'hidden') { perfProfileTabFilter.style.display = 'none'; } if (this.parentElement?.clientHeight != 0) { @@ -559,18 +559,18 @@ export class TabpanePerfProfile extends BaseElement { sortTree(arr: Array): Array { let perfProfileSortArr = arr.sort((perfProfileA, perfProfileB) => { - if (this.perfProfileSortKey == 'self') { - if (this.perfProfileSortType == 0) { + if (this.perfProfileSortKey === 'self') { + if (this.perfProfileSortType === 0) { return perfProfileB.dur - perfProfileA.dur; - } else if (this.perfProfileSortType == 1) { + } else if (this.perfProfileSortType === 1) { return perfProfileA.selfDur - perfProfileB.selfDur; } else { return perfProfileB.selfDur - perfProfileA.selfDur; } } else { - if (this.perfProfileSortType == 0) { + if (this.perfProfileSortType === 0) { return perfProfileB.dur - perfProfileA.dur; - } else if (this.perfProfileSortType == 1) { + } else if (this.perfProfileSortType === 1) { return perfProfileA.dur - perfProfileB.dur; } else { return perfProfileB.dur - perfProfileA.dur; diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleList.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleList.ts index fd79ee38fda93bbe0889530716427de62d45b4bb..9e68b82c954e3a74999e4b6b8be1a1dab79dab63 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleList.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfSampleList.ts @@ -176,7 +176,8 @@ export class TabPanePerfSample extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.perfSampleTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 40 + 'px'; + this.perfSampleTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 40 + 'px'; // @ts-ignore this.tblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 25 + 'px'; this.perfSampleTbl?.reMeauseHeight(); diff --git a/ide/src/trace/component/trace/sheet/jank/TabPaneFrames.ts b/ide/src/trace/component/trace/sheet/jank/TabPaneFrames.ts index 4e005439d4bba7b4de1db58ab48756b84c531318..589618ca369e6843fbfd61bc9bf81d17c3f27429 100644 --- a/ide/src/trace/component/trace/sheet/jank/TabPaneFrames.ts +++ b/ide/src/trace/component/trace/sheet/jank/TabPaneFrames.ts @@ -73,7 +73,11 @@ export class TabPaneFrames extends BaseElement { this.framesTbl!.recycleDataSource = tablelist; } - private frameTimelineJankDataHandle(structValue: JanksStruct, appJank: JankFramesStruct, noJank: JankFramesStruct): void { + private frameTimelineJankDataHandle( + structValue: JanksStruct, + appJank: JankFramesStruct, + noJank: JankFramesStruct + ): void { if (structValue.dur === null || structValue.dur === undefined) { structValue.dur = 0; } @@ -224,8 +228,11 @@ export class TabPaneFrames extends BaseElement { return 0; } if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(framesRightData[property]) - parseFloat(framesLeftData[property]) : parseFloat(framesLeftData[property]) - parseFloat(framesRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(framesRightData[property]) - parseFloat(framesLeftData[property]) + : // @ts-ignore + parseFloat(framesLeftData[property]) - parseFloat(framesRightData[property]); } else { // @ts-ignore if (framesRightData[property] > framesLeftData[property]) { diff --git a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts index eaf1aec191a6c233880561bdae835f17954983ce..3a4004e461de3bb2a583a3c0b349a2977d655763 100644 --- a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts +++ b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts @@ -307,10 +307,12 @@ export class TabPaneNMSampleList extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - TabPaneNMSampleList.sampleTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 31 + 'px'; + TabPaneNMSampleList.sampleTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 31 + 'px'; TabPaneNMSampleList.sampleTbl?.reMeauseHeight(); // @ts-ignore - TabPaneNMSampleList.tblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 + 'px'; + TabPaneNMSampleList.tblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 + 'px'; TabPaneNMSampleList.tblData?.reMeauseHeight(); } }).observe(this.parentElement!); 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 1ca43e21c5eb2f5857a061aac5bc85a78120ef3a..85376c7818d1f8cc23cf45a691da168178e41975 100644 --- a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatisticAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatisticAnalysis.ts @@ -12,15 +12,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {BaseElement, element} from '../../../../../base-ui/BaseElement.js'; -import {LitTable} from '../../../../../base-ui/table/lit-table.js'; -import {SelectionParam} from '../../../../bean/BoxSelection.js'; -import {LitChartPie} from '../../../../../base-ui/chart/pie/LitChartPie.js'; +import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; +import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { LitChartPie } from '../../../../../base-ui/chart/pie/LitChartPie.js'; import '../../../../../base-ui/chart/pie/LitChartPie.js'; -import {LitProgressBar} from '../../../../../base-ui/progress-bar/LitProgressBar.js'; -import {Utils} from '../../base/Utils.js'; -import {SpSystemTrace} from '../../../SpSystemTrace.js'; -import {procedurePool} from '../../../../database/Procedure.js'; +import { LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; +import { Utils } from '../../base/Utils.js'; +import { SpSystemTrace } from '../../../SpSystemTrace.js'; +import { procedurePool } from '../../../../database/Procedure.js'; const TYPE_ALLOC_STRING = 'AllocEvent'; const TYPE_MAP_STRING = 'MmapEvent'; @@ -128,7 +128,8 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { // @ts-ignore this.soUsageTbl?.shadowRoot?.querySelector('.table').style.height = this.parentElement.clientHeight - 30 + 'px'; // @ts-ignore - this.functionUsageTbl?.shadowRoot?.querySelector('.table').style.height = this.parentElement.clientHeight - 30 + 'px'; + this.functionUsageTbl?.shadowRoot?.querySelector('.table').style.height = + this.parentElement!.clientHeight - 30 + 'px'; this.clearData(); this.currentSelection = statisticAnalysisParam; this.tableType!.style.display = 'grid'; @@ -520,73 +521,87 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { let sortColumnArr = [...this.currentLevelData]; switch (column) { case 'tableName': - nmCurrentTable!.recycleDataSource = sortColumnArr.sort((statisticAnalysisLeftData, statisticAnalysisRightData) => { - if (sort === 1) { - if (statisticAnalysisLeftData.tableName > statisticAnalysisRightData.tableName) { - return 1; - } else if (statisticAnalysisLeftData.tableName === statisticAnalysisRightData.tableName) { - return 0; + nmCurrentTable!.recycleDataSource = sortColumnArr.sort( + (statisticAnalysisLeftData, statisticAnalysisRightData) => { + if (sort === 1) { + if (statisticAnalysisLeftData.tableName > statisticAnalysisRightData.tableName) { + return 1; + } else if (statisticAnalysisLeftData.tableName === statisticAnalysisRightData.tableName) { + return 0; + } else { + return -1; + } } else { - return -1; - } - } else { - if (statisticAnalysisRightData.tableName > statisticAnalysisLeftData.tableName) { - return 1; - } else if (statisticAnalysisLeftData.tableName === statisticAnalysisRightData.tableName) { - return 0; - } else { - return -1; + if (statisticAnalysisRightData.tableName > statisticAnalysisLeftData.tableName) { + return 1; + } else if (statisticAnalysisLeftData.tableName === statisticAnalysisRightData.tableName) { + return 0; + } else { + return -1; + } } } - }); + ); break; case 'existSizeFormat': case 'existSizePercent': - nmCurrentTable!.recycleDataSource = sortColumnArr.sort((statisticAnalysisLeftData, statisticAnalysisRightData) => { - return sort === 1 - ? statisticAnalysisLeftData.existSize - statisticAnalysisRightData.existSize - : statisticAnalysisRightData.existSize - statisticAnalysisLeftData.existSize; - }); + nmCurrentTable!.recycleDataSource = sortColumnArr.sort( + (statisticAnalysisLeftData, statisticAnalysisRightData) => { + return sort === 1 + ? statisticAnalysisLeftData.existSize - statisticAnalysisRightData.existSize + : statisticAnalysisRightData.existSize - statisticAnalysisLeftData.existSize; + } + ); break; case 'existCount': case 'existCountPercent': - nmCurrentTable!.recycleDataSource = sortColumnArr.sort((statisticAnalysisLeftData, statisticAnalysisRightData) => { - return sort === 1 - ? statisticAnalysisLeftData.existCount - statisticAnalysisRightData.existCount - : statisticAnalysisRightData.existCount - statisticAnalysisLeftData.existCount; - }); + nmCurrentTable!.recycleDataSource = sortColumnArr.sort( + (statisticAnalysisLeftData, statisticAnalysisRightData) => { + return sort === 1 + ? statisticAnalysisLeftData.existCount - statisticAnalysisRightData.existCount + : statisticAnalysisRightData.existCount - statisticAnalysisLeftData.existCount; + } + ); break; case 'releaseSizeFormat': case 'releaseSizePercent': - nmCurrentTable!.recycleDataSource = sortColumnArr.sort((statisticAnalysisLeftData, statisticAnalysisRightData) => { - return sort === 1 - ? statisticAnalysisLeftData.releaseSize - statisticAnalysisRightData.releaseSize - : statisticAnalysisRightData.releaseSize - statisticAnalysisLeftData.releaseSize; - }); + nmCurrentTable!.recycleDataSource = sortColumnArr.sort( + (statisticAnalysisLeftData, statisticAnalysisRightData) => { + return sort === 1 + ? statisticAnalysisLeftData.releaseSize - statisticAnalysisRightData.releaseSize + : statisticAnalysisRightData.releaseSize - statisticAnalysisLeftData.releaseSize; + } + ); break; case 'releaseCount': case 'releaseCountPercent': - nmCurrentTable!.recycleDataSource = sortColumnArr.sort((statisticAnalysisLeftData, statisticAnalysisRightData) => { - return sort === 1 - ? statisticAnalysisLeftData.releaseCount - statisticAnalysisRightData.releaseCount - : statisticAnalysisRightData.releaseCount - statisticAnalysisLeftData.releaseCount; - }); + nmCurrentTable!.recycleDataSource = sortColumnArr.sort( + (statisticAnalysisLeftData, statisticAnalysisRightData) => { + return sort === 1 + ? statisticAnalysisLeftData.releaseCount - statisticAnalysisRightData.releaseCount + : statisticAnalysisRightData.releaseCount - statisticAnalysisLeftData.releaseCount; + } + ); break; case 'applySizeFormat': case 'applySizePercent': - nmCurrentTable!.recycleDataSource = sortColumnArr.sort((statisticAnalysisLeftData, statisticAnalysisRightData) => { - return sort === 1 - ? statisticAnalysisLeftData.applySize - statisticAnalysisRightData.applySize - : statisticAnalysisRightData.applySize - statisticAnalysisLeftData.applySize; - }); + nmCurrentTable!.recycleDataSource = sortColumnArr.sort( + (statisticAnalysisLeftData, statisticAnalysisRightData) => { + return sort === 1 + ? statisticAnalysisLeftData.applySize - statisticAnalysisRightData.applySize + : statisticAnalysisRightData.applySize - statisticAnalysisLeftData.applySize; + } + ); break; case 'applyCount': case 'applyCountPercent': - nmCurrentTable!.recycleDataSource = sortColumnArr.sort((statisticAnalysisLeftData, statisticAnalysisRightData) => { - return sort === 1 - ? statisticAnalysisLeftData.applyCount - statisticAnalysisRightData.applyCount - : statisticAnalysisRightData.applyCount - statisticAnalysisLeftData.applyCount; - }); + nmCurrentTable!.recycleDataSource = sortColumnArr.sort( + (statisticAnalysisLeftData, statisticAnalysisRightData) => { + return sort === 1 + ? statisticAnalysisLeftData.applyCount - statisticAnalysisRightData.applyCount + : statisticAnalysisRightData.applyCount - statisticAnalysisLeftData.applyCount; + } + ); break; } switch (this.currentLevel) { @@ -623,12 +638,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); @@ -979,8 +994,11 @@ export class TabPaneNMStatisticAnalysis extends BaseElement { } for (let applySample of typeMap.get(tyeId)!) { - if (tyeId === TYPE_ALLOC || (applySample.subType && applySample.subType === typeName) || - (!applySample.subType && typeName === TYPE_MAP_STRING)) { + if ( + tyeId === TYPE_ALLOC || + (applySample.subType && applySample.subType === typeName) || + (!applySample.subType && typeName === TYPE_MAP_STRING) + ) { applySize += applySample.size; applyCount += applySample.count; if (this.isStatistic) { diff --git a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatstics.ts b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatstics.ts index 47c31e03d7bf7b03d7d5c55f1c17048d06c2e7aa..ea82796692ff7240bbc3063bfe6fd5c13e972bfb 100644 --- a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatstics.ts +++ b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMStatstics.ts @@ -51,7 +51,8 @@ export class TabPaneNMStatstics extends BaseElement { }); this.initResponseTypeList(nativeStatisticsParam); // @ts-ignore - this.nativeStatisticsTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 25 + 'px'; + this.nativeStatisticsTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 25 + 'px'; // @ts-ignore this.nativeStatisticsTbl?.recycleDataSource = []; this.nativeStatisticsTbl!.loading = true; diff --git a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMemory.ts b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMemory.ts index bad4decdf965346673959c9f27bfac47f53f572c..871090635911eb621229be95a10351d8fdafd7fc 100644 --- a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMemory.ts +++ b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMemory.ts @@ -14,16 +14,16 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { LitPageTable } from '../../../../../base-ui/table/LitPageTable.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitPageTable } from '../../../../../base-ui/table/LitPageTable.js'; import '../../../../../base-ui/table/LitPageTable.js'; import '../../../../../base-ui/slicer/lit-slicer.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; -import { NativeMemory, NativeHookCallInfo } from '../../../../bean/NativeHook.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type NativeMemory, NativeHookCallInfo } from '../../../../bean/NativeHook.js'; import '../TabPaneFilter.js'; import { FilterData, TabPaneFilter } from '../TabPaneFilter.js'; import { TabPaneNMSampleList } from './TabPaneNMSampleList.js'; -import { LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; +import { type LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; import { procedurePool } from '../../../../database/Procedure.js'; import { formatRealDateMs, @@ -57,14 +57,14 @@ export class TabPaneNMemory extends BaseElement { private eventTypes: string[] = []; set data(memoryParam: SelectionParam | any) { - if (memoryParam == this.currentSelection) { + if (memoryParam === this.currentSelection) { return; } this.currentSelection = memoryParam; this.queryData(memoryParam); } - queryData(memoryParam: SelectionParam | any) { + queryData(memoryParam: SelectionParam | any): void { this.eventTypes = []; if (memoryParam.nativeMemory.indexOf(this.defaultNativeTypes[0]) != -1) { this.eventTypes.push("'AllocEvent'"); @@ -90,7 +90,7 @@ export class TabPaneNMemory extends BaseElement { this.getDataByNativeMemoryWorker(memoryParam, true); } - getDataByNativeMemoryWorker(val: SelectionParam | any, refresh = false) { + getDataByNativeMemoryWorker(val: SelectionParam | any, refresh = false): void { let args = new Map(); args.set('filterAllocType', this.filterAllocationType); args.set('filterEventType', this.filterNativeType); @@ -131,7 +131,7 @@ export class TabPaneNMemory extends BaseElement { }); } - startNmMemoryWorker(type: string, args: any, handler: Function) { + startNmMemoryWorker(type: string, args: any, handler: Function): void { this.setNmMemoryLoading(true); procedurePool.submitWithName('logic1', type, args, undefined, (res: any) => { if (Array.isArray(res) || (res.tag === 'end' && res.index === 0)) { @@ -139,7 +139,7 @@ export class TabPaneNMemory extends BaseElement { this.setNmMemoryLoading(false); } else { this.memorySource.push(res.data); - if (res.tag == 'end') { + if (res.tag === 'end') { handler(this.memorySource); this.setNmMemoryLoading(false); } @@ -147,21 +147,21 @@ export class TabPaneNMemory extends BaseElement { }); } - setNmMemoryLoading(loading: boolean) { + setNmMemoryLoading(loading: boolean): void { if (loading) { this.nmMemoryLoadingList.push(1); this.progressEL!.loading = true; this.loadingPage.style.visibility = 'visible'; } else { this.nmMemoryLoadingList.splice(0, 1); - if (this.nmMemoryLoadingList.length == 0) { + if (this.nmMemoryLoadingList.length === 0) { this.progressEL!.loading = false; this.loadingPage.style.visibility = 'hidden'; } } } - fromStastics(val: SelectionParam | any) { + fromStastics(val: SelectionParam | any): void { let nmFilterEl = this.shadowRoot?.querySelector('#filter'); if (this.currentSelection != val) { this.initFilterTypes(() => { @@ -172,17 +172,17 @@ export class TabPaneNMemory extends BaseElement { }); } let typeIndexOf = this.native_type.indexOf(val.statisticsSelectData.memoryTap); - if (this.statsticsSelection.indexOf(val.statisticsSelectData) == -1 && typeIndexOf == -1) { + if (this.statsticsSelection.indexOf(val.statisticsSelectData) === -1 && typeIndexOf === -1) { this.statsticsSelection.push(val.statisticsSelectData); this.native_type.push(val.statisticsSelectData.memoryTap); typeIndexOf = this.native_type.length - 1; } else { - let index = this.statsticsSelection.findIndex((mt) => mt.memoryTap == val.statisticsSelectData.memoryTap); + let index = this.statsticsSelection.findIndex((mt) => mt.memoryTap === val.statisticsSelectData.memoryTap); if (index != -1) { this.statsticsSelection[index] = val.statisticsSelectData; } } - if (this.currentSelection == val) { + if (this.currentSelection === val) { this.tblData!.recycleDataSource = []; this.rowSelectData = undefined; this.filterSetSelectList(nmFilterEl!, typeIndexOf); @@ -192,7 +192,7 @@ export class TabPaneNMemory extends BaseElement { } } - private filterSetSelectList(nmFilterEl: TabPaneFilter, typeIndexOf: number) { + private filterSetSelectList(nmFilterEl: TabPaneFilter, typeIndexOf: number): void { nmFilterEl!.setSelectList( null, this.native_type, @@ -231,7 +231,7 @@ export class TabPaneNMemory extends BaseElement { }); } - resetFilter() { + resetFilter(): void { this.filter!.firstSelect = '0'; this.filter!.secondSelect = '0'; this.filter!.thirdSelect = '0'; @@ -254,7 +254,7 @@ export class TabPaneNMemory extends BaseElement { this.setRightTableData(data); document.dispatchEvent( new CustomEvent('triangle-flag', { - detail: { time: [data.startTs], type: 'triangle'}, + detail: { time: [data.startTs], type: 'triangle' }, }) ); }); @@ -290,11 +290,11 @@ export class TabPaneNMemory extends BaseElement { let minTs = 0; let minItem: any = undefined; let filterTemp = this.memorySource.filter((tempItem) => { - if (minTs == 0 || (tempItem.startTs - t != 0 && Math.abs(tempItem.startTs - t) < minTs)) { + if (minTs === 0 || (tempItem.startTs - t != 0 && Math.abs(tempItem.startTs - t) < minTs)) { minTs = Math.abs(tempItem.startTs - t); minItem = tempItem; } - return tempItem.startTs == t; + return tempItem.startTs === t; }); if (filterTemp.length > 0) { filterTemp[0].isSelected = true; @@ -309,7 +309,7 @@ export class TabPaneNMemory extends BaseElement { let args = new Map(); args.set('startTs', this.rowSelectData.startTs); args.set('actionType', 'native-memory-state-change'); - this.startNmMemoryWorker('native-memory-action', args, (results: any[]) => {}); + this.startNmMemoryWorker('native-memory-action', args, (results: any[]) => { }); TabPaneNMSampleList.addSampleData(this.rowSelectData); this.memoryTbl!.scrollToData(this.rowSelectData); } @@ -324,7 +324,7 @@ export class TabPaneNMemory extends BaseElement { let thirdIndex = parseInt(data.thirdSelect || '0'); if (this.responseTypes.length > thirdIndex) { this.filterResponseType = - this.responseTypes[thirdIndex].key == undefined ? -1 : this.responseTypes[thirdIndex].key; + this.responseTypes[thirdIndex].key === undefined ? -1 : this.responseTypes[thirdIndex].key; } this.getDataByNativeMemoryWorker(this.currentSelection); } @@ -337,10 +337,12 @@ export class TabPaneNMemory extends BaseElement { new ResizeObserver((entries) => { if (this.parentElement?.clientHeight != 0) { // @ts-ignore - this.memoryTbl?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 31 + 'px'; + this.memoryTbl?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 31 + 'px'; this.memoryTbl?.reMeauseHeight(); // @ts-ignore - this.tblData?.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 10 - 31 + 'px'; + this.tblData?.shadowRoot.querySelector('.table').style.height = + this.parentElement!.clientHeight - 10 - 31 + 'px'; this.tblData?.reMeauseHeight(); this.loadingPage.style.height = this.parentElement!.clientHeight - 24 + 'px'; } diff --git a/ide/src/trace/component/trace/sheet/process/TabPaneCounter.ts b/ide/src/trace/component/trace/sheet/process/TabPaneCounter.ts index 5ebc243f0314cf30df03c65839c583902a14df55..d1e5efd7fc7af08c7f12e097d7ed1da38f28ca74 100644 --- a/ide/src/trace/component/trace/sheet/process/TabPaneCounter.ts +++ b/ide/src/trace/component/trace/sheet/process/TabPaneCounter.ts @@ -173,8 +173,11 @@ export class TabPaneCounter extends BaseElement { return 0; } if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(counterRightData[property]) - parseFloat(counterLeftData[property]) : parseFloat(counterLeftData[property]) - parseFloat(counterRightData[property]); + return sort === 2 + ? // @ts-ignore + parseFloat(counterRightData[property]) - parseFloat(counterLeftData[property]) + : // @ts-ignore + parseFloat(counterLeftData[property]) - parseFloat(counterRightData[property]); } else { // @ts-ignore if (counterRightData[property] > counterLeftData[property]) { diff --git a/ide/src/trace/component/trace/sheet/process/TabPaneSlices.ts b/ide/src/trace/component/trace/sheet/process/TabPaneSlices.ts index 681bbc980354f642c2733bfe19f864169bc0d67b..b0592a5edf4f6a17e4851872b2b21925a52fbc9a 100644 --- a/ide/src/trace/component/trace/sheet/process/TabPaneSlices.ts +++ b/ide/src/trace/component/trace/sheet/process/TabPaneSlices.ts @@ -121,20 +121,21 @@ export class TabPaneSlices extends BaseElement { return; } // search 到的内容与框选泳道的内容取并集 - let rangeSelectList :Array = []; // 框选范围的数据 + let rangeSelectList: Array = []; // 框选范围的数据 for (const searchItem of search.list) { for (const traceRow of sliceRowList) { if ( Math.max(TraceRow.rangeSelectObject?.startNS!, searchItem.startTime) < - Math.min(TraceRow.rangeSelectObject?.endNS!, searchItem.startTime + searchItem.dur) && + Math.min(TraceRow.rangeSelectObject?.endNS!, searchItem.startTime + searchItem.dur) && !rangeSelectList.includes(searchItem) ) { // 异步调用栈 if (traceRow.asyncFuncName) { - if(`${searchItem.pid}` === `${traceRow.asyncFuncNamePID}`){ + if (`${searchItem.pid}` === `${traceRow.asyncFuncNamePID}`) { rangeSelectList.push(searchItem); } - } else { // 线程调用栈 + } else { + // 线程调用栈 if (`${searchItem.tid}` === traceRow.rowId) { rangeSelectList.push(searchItem); } diff --git a/ide/src/trace/component/trace/sheet/process/TabPaneStartup.ts b/ide/src/trace/component/trace/sheet/process/TabPaneStartup.ts index 749701a10d80ddf07861b253f0fb47b139e45155..edaeaba99dab66a5780525327940e073a6956ddf 100644 --- a/ide/src/trace/component/trace/sheet/process/TabPaneStartup.ts +++ b/ide/src/trace/component/trace/sheet/process/TabPaneStartup.ts @@ -71,7 +71,7 @@ export class TabPaneStartup extends BaseElement { } } else { map.set(item.pid!, { - name: item.process || `Process ${ item.pid }`, + name: item.process || `Process ${item.pid}`, dur: item.dur || 0, durStr: '', ratio: `100%`, @@ -90,7 +90,7 @@ export class TabPaneStartup extends BaseElement { if (it.dur === 0) { child.ratio = '0%'; } else { - child.ratio = ((child.dur * 100) / (it.dur)).toFixed(2) + '%'; + child.ratio = ((child.dur * 100) / it.dur).toFixed(2) + '%'; } }); }); diff --git a/ide/src/trace/component/trace/sheet/process/TabPaneStaticInit.ts b/ide/src/trace/component/trace/sheet/process/TabPaneStaticInit.ts index cb3575b5b63bcb7891899cfa0fb07a9e3b89a6f7..05cf471be1588717a412139aa4e9a687467cc957 100644 --- a/ide/src/trace/component/trace/sheet/process/TabPaneStaticInit.ts +++ b/ide/src/trace/component/trace/sheet/process/TabPaneStaticInit.ts @@ -70,7 +70,7 @@ export class TabPaneStaticInit extends BaseElement { } } else { map.set(item.pid!, { - name: item.process || `Process ${ item.pid }`, + name: item.process || `Process ${item.pid}`, dur: item.dur || 0, durStr: '', ratio: `100%`, @@ -137,7 +137,8 @@ export class TabPaneStaticInit extends BaseElement { } sortByColumn(soDetail: any): void { - let compare = (soA: SoTreeItem, soB: SoTreeItem): number => (soDetail.sort === 1 ? soA.dur - soB.dur : soB.dur - soA.dur); + let compare = (soA: SoTreeItem, soB: SoTreeItem): number => + soDetail.sort === 1 ? soA.dur - soB.dur : soB.dur - soA.dur; this.staticinitSource.forEach((it) => it.children?.sort(compare)); this.staticinitSource.sort(compare); this.staticinitTbl!.recycleDataSource = this.staticinitSource; diff --git a/ide/src/trace/component/trace/sheet/sdk/TabPaneSdkCounter.ts b/ide/src/trace/component/trace/sheet/sdk/TabPaneSdkCounter.ts index e80479cecf34ac30d5b324462328258bf40632c8..109d7d77796a9e2113a46499db0d5405ed3b147e 100644 --- a/ide/src/trace/component/trace/sheet/sdk/TabPaneSdkCounter.ts +++ b/ide/src/trace/component/trace/sheet/sdk/TabPaneSdkCounter.ts @@ -219,8 +219,11 @@ export class TabPaneSdkCounter extends BaseElement { return 0; } if (type === 'number') { - // @ts-ignore - return countreSort === 2 ? parseFloat(bSdkCounter[property]) - parseFloat(aSdkCounter[property]) : parseFloat(aSdkCounter[property]) - parseFloat(bSdkCounter[property]); + return countreSort === 2 + ? // @ts-ignore + parseFloat(bSdkCounter[property]) - parseFloat(aSdkCounter[property]) + : // @ts-ignore + parseFloat(aSdkCounter[property]) - parseFloat(bSdkCounter[property]); } // @ts-ignore if (bSdkCounter[property] > aSdkCounter[property]) { diff --git a/ide/src/trace/component/trace/sheet/sdk/TabPaneSdkSlice.ts b/ide/src/trace/component/trace/sheet/sdk/TabPaneSdkSlice.ts index 4a3b86a4fd33e27ed7f0fc42e9b0d38a29bf91a4..ed5a07277a09e9e0a526ec0171580fe303ee27b6 100644 --- a/ide/src/trace/component/trace/sheet/sdk/TabPaneSdkSlice.ts +++ b/ide/src/trace/component/trace/sheet/sdk/TabPaneSdkSlice.ts @@ -269,8 +269,11 @@ export class TabPaneSdkSlice extends BaseElement { return 0; } if (type === 'number') { - // @ts-ignore - return sliceSort === 2 ? parseFloat(bSdkSlice[property]) - parseFloat(aSdkSlice[property]) : parseFloat(aSdkSlice[property]) - parseFloat(bSdkSlice[property]); + return sliceSort === 2 + ? // @ts-ignore + parseFloat(bSdkSlice[property]) - parseFloat(aSdkSlice[property]) + : // @ts-ignore + parseFloat(aSdkSlice[property]) - parseFloat(bSdkSlice[property]); } // @ts-ignore if (bSdkSlice[property] > aSdkSlice[property]) { diff --git a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.ts b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.ts index 211689e78d052ed379a4edb6f5ed379161ad5557..79753f1b15bf6590d90195a92a83494365828c12 100644 --- a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.ts +++ b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.ts @@ -13,15 +13,15 @@ * limitations under the License. */ import { element } from '../../../../../base-ui/BaseElement.js'; -import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; +import { type LitSelect } from '../../../../../base-ui/select/LitSelect.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { getTabSmapsStatisticData } from '../../../../database/SqlLite.js'; import { resizeObserverFromMemory } from '../SheetUtils.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; import { TabPaneSmapsStatistics } from './TabPaneSmapsStatistics.js'; -import { SmapsType } from '../../../../bean/SmapsStruct.js'; +import { type SmapsType } from '../../../../bean/SmapsStruct.js'; @element('tabpane-smaps-comparison') export class TabPaneSmapsComparison extends TabPaneSmapsStatistics { @@ -46,9 +46,8 @@ export class TabPaneSmapsComparison extends TabPaneSmapsStatistics { } this.selectionParam = data; //@ts-ignore - this.smapsCompariosnTable?.shadowRoot?.querySelector('.table')?.style?.height = `${ - this.parentElement!.clientHeight - 45 - }px`; + this.smapsCompariosnTable?.shadowRoot?.querySelector('.table')?.style?.height = `${this.parentElement!.clientHeight - 45 + }px`; this.smapsCompariosnTable!.loading = true; this.init(this.tabTitle!); let fileArr: any[] = []; diff --git a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsRecord.ts b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsRecord.ts index ebab8788336113a9fae7c76b3b374d9c16a697ec..3b299804e7fb74cb081e998124de7cacada30bbe 100644 --- a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsRecord.ts +++ b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsRecord.ts @@ -12,190 +12,116 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; import { LitTable } from '../../../../../base-ui/table/lit-table.js'; import { SelectionParam } from '../../../../bean/BoxSelection.js'; -import { getTabSmapsData, getTabSmapsRecordData } from '../../../../database/SqlLite.js'; -import { Utils } from '../../base/Utils.js'; -import { log } from '../../../../../log/Log.js'; -import { Smaps, SmapsType, TYPE_STRING } from '../../../../bean/SmapsStruct.js'; -import { resizeObserver } from '../SheetUtils.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; +import { SmapsType } from '../../../../bean/SmapsStruct.js'; +import { querySmapsRecordTabData } from '../../../../database/SqlLite.js'; +import { getByteWithUnit } from '../../../../database/logic-worker/ProcedureLogicWorkerCommon.js'; +import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; +import { SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; import { SpSystemTrace } from '../../../SpSystemTrace.js'; +import { resizeObserver } from '../SheetUtils.js'; @element('tabpane-smaps-record') export class TabPaneSmapsRecord extends BaseElement { - private tblSmapsRecord: LitTable | null | undefined; - private sourceSmapsRecord: Array = []; - private querySmapsRecordResult: Array = []; - private isClick = false; - private tabTitle: HTMLDivElement | undefined | null; - set data(valSmapsRecord: SelectionParam) { - this.parentElement!.style.overflow = 'unset'; - this.isClick = valSmapsRecord.smapsType.length === 0; - this.init(); - this.tblSmapsRecord!.loading = true; - if (!this.isClick) { - if (valSmapsRecord.smapsType.length > 0) { - this.queryDataByDB(valSmapsRecord); - } - } else { - this.setSmaps(valSmapsRecord); - } - } - initElements(): void { - this.tblSmapsRecord = this.shadowRoot?.querySelector('#tb-smaps-record'); - this.tabTitle = this.tblSmapsRecord!.shadowRoot?.querySelector('.thead') as HTMLDivElement; - this.tblSmapsRecord!.addEventListener('column-click', (evt) => { - // @ts-ignore - this.sortByColumn(evt.detail); - }); + private smapsRecordTable: LitTable | undefined | null; + private smapsRecordDataSource: Array = []; + private _GLESHostCache: Array = []; + private pixelmapId = -1; + private typeId = SmapsType.TYPE_NATIVE_HEAP; + + set GLESHostCache(value: Array) { + this._GLESHostCache = value; } - connectedCallback() { - super.connectedCallback(); - new ResizeObserver(() => { - if (this.parentElement?.clientHeight != 0) { - // @ts-ignore - this.tblSmapsRecord?.shadowRoot?.querySelector('.table').style.height = this.parentElement.clientHeight - 15+ 'px'; - this.tblSmapsRecord?.reMeauseHeight(); + set data(smapsValue: SelectionParam | any) { + this.smapsRecordDataSource = []; + if (smapsValue) { + if (this.pixelmapId == -1) { + for (let [key, value] of SpSystemTrace.DATA_DICT) { + if (value === 'pixelmap') { + this.pixelmapId = key; + break; + } + } } - }).observe(this.parentElement!); + this.setSmapsRecordTableData(smapsValue.leftNs); + } } - queryDataByDB(srVal: SelectionParam | any): void { - getTabSmapsData(srVal.leftNs, srVal.rightNs, (MemoryConfig.getInstance().interval * 1000_000) / 5).then( - (result) => { - log('getTabSmapsData size :' + result.length); - this.tblSmapsRecord!.loading = false; - this.filteredData(result); + + private async setSmapsRecordTableData(startNs: number): Promise { + await querySmapsRecordTabData(startNs, MemoryConfig.getInstance().iPid,this.pixelmapId, this.typeId).then((results) => { + if (results.length > 0) { + let totalSize = 0; + let RSGSize = 0; + let virtaulSize = 0; + let currentData = this._GLESHostCache.filter((item: SnapshotStruct) => item.startNs === startNs) || []; + if (currentData.length === 1) { + // GLESHostCache === currentData[0].aSize,改值Gpu Resource泳道图中已经获取过,所以在这个sql里只是设置为0,占位置,不用多查一遍 + RSGSize = currentData[0].aSize || 0; + } + for (let res of results) { + if (res.name === 'VirtaulSize') { + virtaulSize = res.size; + } else { + // RSGSize = RenderServiceCpu + SkiaCpu + GLESHostCache + RSGSize += res.size; + } + switch (res.name) { + case 'RenderServiceCpu': + this.smapsRecordDataSource.push({ name: 'RenderServiceCpu', size: getByteWithUnit(res.size) }); + break; + case 'SkiaCpu': + this.smapsRecordDataSource.push({ name: 'SkiaCpu', size: getByteWithUnit(res.size) }); + break; + case 'GLESHostCache': + let size = currentData.length > 0 ? currentData[0].aSize : 0; + this.smapsRecordDataSource.push({ name: 'GLESHostCache', size: getByteWithUnit(size) }); + break; + default: + break; + } + } + // ProcessCacheSize = virtaul_size - RenderServiceCpu - SkiaCpu - GLESHostCache + const ProcessCacheSize = virtaulSize - RSGSize; + // totalSize = RenderServiceCpu + SkiaCpu + GLESHostCache + ProcessCacheSize + totalSize = RSGSize + ProcessCacheSize; + this.smapsRecordDataSource.push({ name: 'ProcessCache', size: getByteWithUnit(ProcessCacheSize) }); + this.smapsRecordDataSource.unshift( + { name: 'TimeStamp', size: ns2s(startNs) }, + { name: 'TimeStamp(Absolute)', size: (startNs + (window as any).recordStartNS) / 1000000000 }, + { name: 'Total', size: getByteWithUnit(totalSize) } + ); } - ); - } - setSmaps(data: SelectionParam): void { - getTabSmapsRecordData(data.rightNs).then((result) => { - this.tblSmapsRecord!.loading = false; - this.filteredData(result); + this.smapsRecordTable!.recycleDataSource = this.smapsRecordDataSource; }); } - private init(): void { - const thTable = this.tabTitle!.querySelector('.th'); - const smapsRecordTblNodes = thTable!.querySelectorAll('div'); - if (this.tabTitle!.hasAttribute('sort')) { - this.tabTitle!.removeAttribute('sort'); - smapsRecordTblNodes.forEach((item) => { - item.querySelectorAll('svg').forEach((svg) => { - svg.style.display = 'none'; - }); - }); - } + + public initElements(): void { + this.smapsRecordTable = this.shadowRoot?.querySelector('#smaps-record-tbl'); } - filteredData(result: any): void { - if (result.length !== null && result.length > 0) { - for (const smaps of result) { - smaps.typeName = TYPE_STRING[smaps.type]; - smaps.address = smaps.startAddr + ' - ' + smaps.endAddr; - smaps.swapStr = Utils.getBinaryByteWithUnit(smaps.swap); - smaps.rssStr = Utils.getBinaryByteWithUnit(smaps.rss); - smaps.pssStr = Utils.getBinaryByteWithUnit(smaps.pss); - smaps.sizeStr = Utils.getBinaryByteWithUnit(smaps.size); - smaps.sharedCleanStr = Utils.getBinaryByteWithUnit(smaps.sharedClean); - smaps.sharedDirtyStr = Utils.getBinaryByteWithUnit(smaps.sharedDirty); - smaps.privateCleanStr = Utils.getBinaryByteWithUnit(smaps.privateClean); - smaps.privateDirtyStr = Utils.getBinaryByteWithUnit(smaps.privateDirty); - smaps.swapPssStr = Utils.getBinaryByteWithUnit(smaps.swapPss); - smaps.time = Utils.getTimeString(smaps.startNs); - smaps.path = SpSystemTrace.DATA_DICT.get(smaps.path)?.split('/'); - smaps.permission = SpSystemTrace.DATA_DICT.get(smaps.pid)?.split('/'); - let resideS = smaps.reside.toFixed(2); - if (resideS === '0.00') { - smaps.resideStr = '0 %'; - } else { - smaps.resideStr = resideS + '%'; - } - } - this.sourceSmapsRecord = result; - this.querySmapsRecordResult = result; - this.tblSmapsRecord!.recycleDataSource = this.sourceSmapsRecord; - } else { - this.sourceSmapsRecord = []; - this.querySmapsRecordResult = []; - this.tblSmapsRecord!.recycleDataSource = []; - } + + connectedCallback() { + super.connectedCallback(); + resizeObserver(this.parentElement!, this.smapsRecordTable!); } - initHtml(): string { - return ` - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - + + `; } - sortByColumn(detail: any): void { - // @ts-ignore - function compare(property, sort, type) { - return function (aSmapsRecord: Smaps, bSmapsRecord: Smaps) { - if (type === 'number') { - // @ts-ignore - return sort === 2 ? parseFloat(bSmapsRecord[property]) - parseFloat(aSmapsRecord[property]) : parseFloat(aSmapsRecord[property]) - parseFloat(bSmapsRecord[property]); - } else { - // @ts-ignore - if (bSmapsRecord[property] > aSmapsRecord[property]) { - return sort === 2 ? 1 : -1; - } else { - // @ts-ignore - if (bSmapsRecord[property] === aSmapsRecord[property]) { - return 0; - } else { - return sort === 2 ? -1 : 1; - } - } - } - }; - } - if ( - detail.key === 'rssStr' || - detail.key === 'sizeStr' || - detail.key === 'resideStr' - ) { - let key = detail.key.substring(0, detail.key.indexOf('Str')); - this.sourceSmapsRecord.sort(compare(key, detail.sort, 'number')); - } else { - this.sourceSmapsRecord.sort(compare(detail.key, detail.sort, 'string')); - } - this.tblSmapsRecord!.recycleDataSource = this.sourceSmapsRecord; - } } diff --git a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsSample.ts b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsSample.ts new file mode 100644 index 0000000000000000000000000000000000000000..0adc3f8ae82dca45552f6dcbf9dd771c0c8c30c9 --- /dev/null +++ b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsSample.ts @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2022 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. + */ +import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; +import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { getTabSmapsData, getTabSmapsSampleData } from '../../../../database/SqlLite.js'; +import { Utils } from '../../base/Utils.js'; +import { log } from '../../../../../log/Log.js'; +import { Smaps, SmapsType, TYPE_STRING } from '../../../../bean/SmapsStruct.js'; +import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; +import { SpSystemTrace } from '../../../SpSystemTrace.js'; +@element('tabpane-smaps-sample') +export class TabPaneSmapsSample extends BaseElement { + private tblSmapsSample: LitTable | null | undefined; + private sourceSmapsSample: Array = []; + private querySmapsSampleResult: Array = []; + private isClick = false; + private tabTitle: HTMLDivElement | undefined | null; + set data(valSmapsSample: SelectionParam) { + this.parentElement!.style.overflow = 'unset'; + this.isClick = valSmapsSample.smapsType.length === 0; + this.init(); + this.tblSmapsSample!.loading = true; + if (!this.isClick) { + if (valSmapsSample.smapsType.length > 0) { + this.queryDataByDB(valSmapsSample); + } + } else { + this.setSmaps(valSmapsSample); + } + } + initElements(): void { + this.tblSmapsSample = this.shadowRoot?.querySelector('#tb-smaps-record'); + this.tabTitle = this.tblSmapsSample!.shadowRoot?.querySelector('.thead') as HTMLDivElement; + this.tblSmapsSample!.addEventListener('column-click', (evt) => { + // @ts-ignore + this.sortByColumn(evt.detail); + }); + } + connectedCallback() { + super.connectedCallback(); + new ResizeObserver(() => { + if (this.parentElement?.clientHeight != 0) { + // @ts-ignore + this.tblSmapsSample?.shadowRoot?.querySelector('.table').style.height = this.parentElement.clientHeight - 15+ 'px'; + this.tblSmapsSample?.reMeauseHeight(); + } + }).observe(this.parentElement!); + } + queryDataByDB(srVal: SelectionParam | any): void { + getTabSmapsData(srVal.leftNs, srVal.rightNs, (MemoryConfig.getInstance().interval * 1000_000) / 5).then( + (result) => { + log('getTabSmapsData size :' + result.length); + this.tblSmapsSample!.loading = false; + this.filteredData(result); + } + ); + } + setSmaps(data: SelectionParam): void { + getTabSmapsSampleData(data.rightNs).then((result) => { + this.tblSmapsSample!.loading = false; + this.filteredData(result); + }); + } + private init(): void { + const thTable = this.tabTitle!.querySelector('.th'); + const smapsSampleTblNodes = thTable!.querySelectorAll('div'); + if (this.tabTitle!.hasAttribute('sort')) { + this.tabTitle!.removeAttribute('sort'); + smapsSampleTblNodes.forEach((item) => { + item.querySelectorAll('svg').forEach((svg) => { + svg.style.display = 'none'; + }); + }); + } + } + filteredData(result: any): void { + if (result.length !== null && result.length > 0) { + for (const smaps of result) { + smaps.typeName = TYPE_STRING[smaps.type]; + smaps.address = smaps.startAddr + ' - ' + smaps.endAddr; + smaps.swapStr = Utils.getBinaryByteWithUnit(smaps.swap); + smaps.rssStr = Utils.getBinaryByteWithUnit(smaps.rss); + smaps.pssStr = Utils.getBinaryByteWithUnit(smaps.pss); + smaps.sizeStr = Utils.getBinaryByteWithUnit(smaps.size); + smaps.sharedCleanStr = Utils.getBinaryByteWithUnit(smaps.sharedClean); + smaps.sharedDirtyStr = Utils.getBinaryByteWithUnit(smaps.sharedDirty); + smaps.privateCleanStr = Utils.getBinaryByteWithUnit(smaps.privateClean); + smaps.privateDirtyStr = Utils.getBinaryByteWithUnit(smaps.privateDirty); + smaps.swapPssStr = Utils.getBinaryByteWithUnit(smaps.swapPss); + smaps.time = Utils.getTimeString(smaps.startNs); + smaps.path = SpSystemTrace.DATA_DICT.get(smaps.path)?.split('/'); + smaps.permission = SpSystemTrace.DATA_DICT.get(smaps.pid)?.split('/'); + let resideS = smaps.reside.toFixed(2); + if (resideS === '0.00') { + smaps.resideStr = '0 %'; + } else { + smaps.resideStr = resideS + '%'; + } + } + this.sourceSmapsSample = result; + this.querySmapsSampleResult = result; + this.tblSmapsSample!.recycleDataSource = this.sourceSmapsSample; + } else { + this.sourceSmapsSample = []; + this.querySmapsSampleResult = []; + this.tblSmapsSample!.recycleDataSource = []; + } + } + initHtml(): string { + return ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `; + } + sortByColumn(detail: any): void { + // @ts-ignore + function compare(property, sort, type) { + return function (aSmapsSample: Smaps, bSmapsSample: Smaps) { + if (type === 'number') { + // @ts-ignore + return sort === 2 ? parseFloat(bSmapsSample[property]) - parseFloat(aSmapsSample[property]) : parseFloat(aSmapsSample[property]) - parseFloat(bSmapsSample[property]); + } else { + // @ts-ignore + if (bSmapsSample[property] > aSmapsSample[property]) { + return sort === 2 ? 1 : -1; + } else { + // @ts-ignore + if (bSmapsSample[property] === aSmapsSample[property]) { + return 0; + } else { + return sort === 2 ? -1 : 1; + } + } + } + }; + } + if ( + detail.key === 'rssStr' || + detail.key === 'sizeStr' || + detail.key === 'resideStr' + ) { + let key = detail.key.substring(0, detail.key.indexOf('Str')); + this.sourceSmapsSample.sort(compare(key, detail.sort, 'number')); + } else { + this.sourceSmapsSample.sort(compare(detail.key, detail.sort, 'string')); + } + this.tblSmapsSample!.recycleDataSource = this.sourceSmapsSample; + } +} diff --git a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsStatistics.ts b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsStatistics.ts index 5fc29291a965a3359b5f29c1424196033bb69121..986493bb7c99c23f2a31328865c506c9a58cafef 100644 --- a/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsStatistics.ts +++ b/ide/src/trace/component/trace/sheet/smaps/TabPaneSmapsStatistics.ts @@ -21,7 +21,7 @@ import { getTabSmapsStatisticMaxSize, getTabSmapsStatisticSelectData, } from '../../../../database/SqlLite.js'; -import { Smaps, SmapsTreeObj, SmapsType, TYPE_STRING } from '../../../../bean/SmapsStruct.js'; +import { type Smaps, SmapsTreeObj, SmapsType, TYPE_STRING } from '../../../../bean/SmapsStruct.js'; import { Utils } from '../../base/Utils.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { SpSystemTrace } from '../../../SpSystemTrace.js'; @@ -74,7 +74,7 @@ export class TabPaneSmapsStatistics extends BaseElement { } }).observe(this.parentElement!); } - async queryDataByDB(smapsVal: SelectionParam) { + async queryDataByDB(smapsVal: SelectionParam): Promise { getTabSmapsMaxSize(smapsVal.leftNs, smapsVal.rightNs, (MemoryConfig.getInstance().interval * 1000_000) / 5).then( (maxRes) => { this.sumSize = maxRes[0].max_value; @@ -90,7 +90,7 @@ export class TabPaneSmapsStatistics extends BaseElement { }); } - private calculatePercentage(divisor: number, dividend: number) { + private calculatePercentage(divisor: number, dividend: number): number { if (dividend === 0) { return 0; } else { @@ -213,7 +213,7 @@ export class TabPaneSmapsStatistics extends BaseElement { smapsStatDataTree.children.push(treeObj); } - async setSmaps(data: SelectionParam) { + async setSmaps(data: SelectionParam): Promise { getTabSmapsStatisticMaxSize(data.leftNs).then((maxRes) => { this.sumSize = maxRes[0].max_value; }); @@ -334,7 +334,7 @@ export class TabPaneSmapsStatistics extends BaseElement { } } - public sortByColumn(column: string, sort: number, table: LitTable) { + public sortByColumn(column: string, sort: number, table: LitTable): void { this.sortArray = [...this.totalTree]; switch (sort) { case 0: diff --git a/ide/src/trace/component/trace/sheet/task/TabPaneTaskFrames.ts b/ide/src/trace/component/trace/sheet/task/TabPaneTaskFrames.ts index b0b0e0ad3b5b7e74fbc28e6a17eb0ffb14472196..c050252ad7eb675d51b44c0911e18d449a2697f0 100644 --- a/ide/src/trace/component/trace/sheet/task/TabPaneTaskFrames.ts +++ b/ide/src/trace/component/trace/sheet/task/TabPaneTaskFrames.ts @@ -25,7 +25,7 @@ import { } from '../../../../database/SqlLite.js'; import { BaseStruct } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; import { SpSystemTrace } from '../../../SpSystemTrace.js'; -import { LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; +import { type LitProgressBar } from '../../../../../base-ui/progress-bar/LitProgressBar.js'; const ALLOCATION_TASK = 'H:Task Allocation:'; const PERFORM_TASK = 'H:Task Perform:'; @@ -56,7 +56,7 @@ export class TabPaneTaskFrames extends BaseElement { } //框选 this.range!.textContent = `Selected range: - ${ parseFloat(((framesParam.rightNs - framesParam.leftNs) / 1000000.0).toFixed(5)) } ms`; + ${parseFloat(((framesParam.rightNs - framesParam.leftNs) / 1000000.0).toFixed(5))} ms`; this.progressEL!.loading = true; this.queryDataByDB(framesParam, false); } @@ -92,7 +92,7 @@ export class TabPaneTaskFrames extends BaseElement { } }); allocationTime = executeStartTime - allocationStartTime; - returnTime = returnEndTime == 0 ? 0 : returnEndTime - (executeStartTime + executeTime); + returnTime = returnEndTime === 0 ? 0 : returnEndTime - (executeStartTime + executeTime); if (TabPaneTaskFrames.IsShowConcurrency) { let tableList: TaskTabStruct[] = []; this.buildConcurrencyTable(executeStruct!, tableList, framesParam, isClick); @@ -102,12 +102,16 @@ export class TabPaneTaskFrames extends BaseElement { } } - private buildConcurrencyTable(executeStruct: FuncStruct, - tableList: TaskTabStruct[], framesParam: SelectionParam, isClick: boolean): void { + private buildConcurrencyTable( + executeStruct: FuncStruct, + tableList: TaskTabStruct[], + framesParam: SelectionParam, + isClick: boolean + ): void { this.countConcurrency(executeStruct, tableList, framesParam, isClick).then((result) => { let concurrencyColumn: TaskTabStruct = new TaskTabStruct(); concurrencyColumn.executeId = TABLE_CURRENCY; - concurrencyColumn.taskPriority = `${ result }`; + concurrencyColumn.taskPriority = `${result}`; tableList.push(concurrencyColumn); let filterList = []; let map = new Map(); @@ -123,8 +127,13 @@ export class TabPaneTaskFrames extends BaseElement { this.progressEL!.loading = false; }); } - private buildNoConcurrencyTable(executeId: string, priorityId: number, sTime: number, - eTime: number, rTime: number): void { + private buildNoConcurrencyTable( + executeId: string, + priorityId: number, + sTime: number, + eTime: number, + rTime: number + ): void { let task: TaskTabStruct = new TaskTabStruct(); task.executeId = executeId; task.taskPriority = Priority[priorityId]; @@ -152,7 +161,7 @@ export class TabPaneTaskFrames extends BaseElement { let tempTableList: TaskTabStruct[] = []; let tempExecuteTaskList: FuncStruct[] = []; let tempExecuteTaskIds: number[] = []; - for (let index = 0 ; index < groupsValue.length ; index++) { + for (let index = 0; index < groupsValue.length; index++) { let data = groupsValue[index]; let executeId = TabPaneTaskFrames.getExecuteId(data.funName!); if (data.funName!.indexOf(PERFORM_TASK) >= 0) { @@ -162,13 +171,13 @@ export class TabPaneTaskFrames extends BaseElement { } let uniqueArr = [...new Set(tempExecuteTaskIds)]; let taskList = await queryTaskListByExecuteTaskIds(uniqueArr, key); - for (let index = 0 ; index < taskList.length ; index++) { + for (let index = 0; index < taskList.length; index++) { this.pushTaskToList(taskList[index], tempTableList); } let filterArray = await this.handleConcurrency(tempExecuteTaskList, tempTableList, framesParam, isClick); this.taskFramesGroupSource.push(filterArray); } - this.taskFramesGroupSource.forEach(framesSource => { + this.taskFramesGroupSource.forEach((framesSource) => { tableList.push(...framesSource); }); this.taskFramesSource = tableList; @@ -230,10 +239,7 @@ export class TabPaneTaskFrames extends BaseElement { `; } - sortByColumn(framesDetail: { - sort: number, - key: string, - }): void { + sortByColumn(framesDetail: { sort: number; key: string }): void { // @ts-ignore let compare = function (property, sort, type) { return function (taskFramesLeftData: TaskTabStruct, taskFramesRightData: TaskTabStruct): number { @@ -262,7 +268,7 @@ export class TabPaneTaskFrames extends BaseElement { }; }; let tableList: TaskTabStruct[] = []; - this.taskFramesGroupSource.forEach(framesGroup => { + this.taskFramesGroupSource.forEach((framesGroup) => { if (framesDetail.key === 'taskPriority') { framesGroup.sort(compare(framesDetail.key, framesDetail.sort, 'string')); } else { @@ -325,8 +331,8 @@ export class TabPaneTaskFrames extends BaseElement { ]); let tasks: Array = res[1]; let maxConcurrency = 0; - let timePointArray: { time: number, isStart: boolean }[] = []; - for (let i = 0 ; i < tasks.length ; i++) { + let timePointArray: { time: number; isStart: boolean }[] = []; + for (let i = 0; i < tasks.length; i++) { timePointArray.push({ time: tasks[i].startTs!, isStart: true }); timePointArray.push({ time: tasks[i].startTs! + tasks[i].dur!, isStart: false }); } @@ -368,7 +374,7 @@ export class TabPaneTaskFrames extends BaseElement { maxNumConcurrency = countConcurrencyPromise; let concurrencyColumn: TaskTabStruct = new TaskTabStruct(); concurrencyColumn.executeId = TABLE_CURRENCY; - concurrencyColumn.taskPriority = `${ maxNumConcurrency }`; + concurrencyColumn.taskPriority = `${maxNumConcurrency}`; tableList.push(concurrencyColumn); //去重 let filterList = []; diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaSelectVmTracker.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaSelectVmTracker.ts index fd359a9c781ba443c5434ab316f19263de344e0c..ea2fbcbdc2aaf11e7f6dc9851dfafc10135efd36 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaSelectVmTracker.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaSelectVmTracker.ts @@ -14,8 +14,8 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { Dma } from '../../../../bean/AbilityMonitor.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type Dma } from '../../../../bean/AbilityMonitor.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { getTabDmaVMTrackerClickData } from '../../../../database/SqlLite.js'; import { SpSystemTrace } from '../../../SpSystemTrace.js'; @@ -40,9 +40,10 @@ export class TabPaneDmaSelectVmTracker extends BaseElement { connectedCallback(): void { super.connectedCallback(); new ResizeObserver(() => { - if (this.parentElement?.clientHeight != 0) { + if (this.parentElement?.clientHeight !== 0) { // @ts-ignore - this.damClickTable?.shadowRoot?.querySelector('.table').style.height = this.parentElement.clientHeight - 18 + 'px'; + this.damClickTable?.shadowRoot?.querySelector('.table').style.height = + this.parentElement!.clientHeight - 18 + 'px'; this.parentElement!.style.overflow = 'hidden'; this.damClickTable?.reMeauseHeight(); } diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTracker.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTracker.ts index 6759d32ce6bac88a9a1b28ea0abca82692ff57ce..b9cba294653e9177da3da3c39f9207d3552f2abf 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTracker.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTracker.ts @@ -14,11 +14,11 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { resizeObserver } from '../SheetUtils.js'; import { getTabDmaVmTrackerData } from '../../../../database/SqlLite.js'; -import { Dma } from '../../../../bean/AbilityMonitor.js'; +import { type Dma } from '../../../../bean/AbilityMonitor.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { Utils } from '../../base/Utils.js'; diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTrackerComparison.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTrackerComparison.ts index 90df5a8c4424cd7c774bc5f3e47f3550f6a1b1e7..06f2183e63af8c3a943cf4ebe9dfff5b25bd8dab 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTrackerComparison.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTrackerComparison.ts @@ -14,17 +14,17 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; +import { type LitSelect } from '../../../../../base-ui/select/LitSelect.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { DmaComparison } from '../../../../bean/AbilityMonitor.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type DmaComparison } from '../../../../bean/AbilityMonitor.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { getTabDmaVmTrackerComparisonData } from '../../../../database/SqlLite.js'; -import { SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; +import { type SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; import { Utils } from '../../base/Utils.js'; import { resizeObserverFromMemory } from '../SheetUtils.js'; import '../TabPaneJsMemoryFilter.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; @element('tabpane-dma-vmtracker-comparison') export class TabPaneDmaVmTrackerComparison extends BaseElement { @@ -96,7 +96,7 @@ export class TabPaneDmaVmTrackerComparison extends BaseElement { }); } - async getComparisonData(targetStartNs: number) { + async getComparisonData(targetStartNs: number): Promise { let comparison: Array = []; comparison = await this.queryDataByDB(targetStartNs); comparison[0].value = this.selfData[0].value - comparison[0].value; diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemorySelectVmTracker.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemorySelectVmTracker.ts index 533396d6731d1a4609f20e018079187bfba7d30f..13eca83b6761b3d47f5286baa2233b97f80cbe46 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemorySelectVmTracker.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemorySelectVmTracker.ts @@ -14,8 +14,8 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { GpuMemory } from '../../../../bean/AbilityMonitor.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type GpuMemory } from '../../../../bean/AbilityMonitor.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { getTabGpuMemoryVMTrackerClickData } from '../../../../database/SqlLite.js'; import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; @@ -39,9 +39,10 @@ export class TabPaneGpuMemorySelectVmTracker extends BaseElement { connectedCallback(): void { super.connectedCallback(); new ResizeObserver(() => { - if (this.parentElement?.clientHeight != 0) { + if (this.parentElement?.clientHeight !== 0) { // @ts-ignore - this.gpuMemoryClickTable?.shadowRoot?.querySelector('.table').style.height = this.parentElement.clientHeight - 18 + 'px'; + this.gpuMemoryClickTable?.shadowRoot?.querySelector('.table').style.height = + this.parentElement!.clientHeight - 18 + 'px'; this.parentElement!.style.overflow = 'hidden'; this.gpuMemoryClickTable?.reMeauseHeight(); } diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTracker.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTracker.ts index 6fa2338ae126a3c3c8a359394eff78445287c9a5..646f039664868000bf9bbf02bdabd779cc4a231d 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTracker.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTracker.ts @@ -14,8 +14,8 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { resizeObserver } from '../SheetUtils.js'; import { getTabGpuMemoryData } from '../../../../database/SqlLite.js'; import { GpuMemory } from '../../../../bean/AbilityMonitor.js'; diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.ts index 9bb0bad9181cd0f7875d979d3f6d76233cc4ca11..3606c9de2046e47c26e3e31a1e6d447b53092fc5 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.ts @@ -14,18 +14,18 @@ */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; +import { type LitSelect } from '../../../../../base-ui/select/LitSelect.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { GpuMemoryComparison } from '../../../../bean/AbilityMonitor.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { getTabGpuMemoryVmTrackerComparisonData } from '../../../../database/SqlLite.js'; -import { SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; +import { type SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; import { SpSystemTrace } from '../../../SpSystemTrace.js'; import { Utils } from '../../base/Utils.js'; import { compare, resizeObserverFromMemory } from '../SheetUtils.js'; import '../TabPaneJsMemoryFilter.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; @element('tabpane-gpu-memory-vmtracker-comparison') export class TabPaneGpuMemoryVmTrackerComparison extends BaseElement { @@ -108,7 +108,7 @@ export class TabPaneGpuMemoryVmTrackerComparison extends BaseElement { }); } - async getComparisonData(targetStartNs: number) { + async getComparisonData(targetStartNs: number): Promise { let comparisonData: GpuMemoryComparison[] = []; let comparison: GpuMemoryComparison[] = []; let data = await this.queryDataByDB(targetStartNs); @@ -141,22 +141,18 @@ export class TabPaneGpuMemoryVmTrackerComparison extends BaseElement { ); break; case 'gpuName': - this.gpuMemoryClickTable!.recycleDataSource = array.sort( - (gpuMCompVmLeftData, gpuMCompVmRightData) => { - return sort === 1 - ? `${gpuMCompVmLeftData.gpuName}`.localeCompare(`${gpuMCompVmRightData.gpuName}`) - : `${gpuMCompVmRightData.gpuName}`.localeCompare(`${gpuMCompVmLeftData.gpuName}`); - } - ); + this.gpuMemoryClickTable!.recycleDataSource = array.sort((gpuMCompVmLeftData, gpuMCompVmRightData) => { + return sort === 1 + ? `${gpuMCompVmLeftData.gpuName}`.localeCompare(`${gpuMCompVmRightData.gpuName}`) + : `${gpuMCompVmRightData.gpuName}`.localeCompare(`${gpuMCompVmLeftData.gpuName}`); + }); break; case 'sizeDelta': - this.gpuMemoryClickTable!.recycleDataSource = array.sort( - (gpuMCompVmLeftData, gpuMCompVmRightData) => { - return sort === 1 - ? gpuMCompVmLeftData.value - gpuMCompVmRightData.value - : gpuMCompVmRightData.value - gpuMCompVmLeftData.value; - } - ); + this.gpuMemoryClickTable!.recycleDataSource = array.sort((gpuMCompVmLeftData, gpuMCompVmRightData) => { + return sort === 1 + ? gpuMCompVmLeftData.value - gpuMCompVmRightData.value + : gpuMCompVmRightData.value - gpuMCompVmLeftData.value; + }); break; } break; diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuResourceVmTracker.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuResourceVmTracker.ts new file mode 100644 index 0000000000000000000000000000000000000000..b6c5f8e1561b587bc006fe43aab10128907febf8 --- /dev/null +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneGpuResourceVmTracker.ts @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2022 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. + */ + +import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; +import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { queryGpuResourceTabData } from '../../../../database/SqlLite.js'; +import { getByteWithUnit } from '../../../../database/logic-worker/ProcedureLogicWorkerCommon.js'; +import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; +import { SpSystemTrace } from '../../../SpSystemTrace.js'; +import { resizeObserver } from '../SheetUtils.js'; +@element('tabpane-gpu-resource') +export class TabPaneGpuResourceVmTracker extends BaseElement { + private gpuResourceTable: LitTable | undefined | null; + private gpuResourceDataSource: Array = []; + + set data(startNs: number) { + this.parentElement!.style.overflow = 'unset'; + this.gpuResourceDataSource = []; + this.setGpuResourceTableData(startNs); + } + + private async setGpuResourceTableData(startNs: number): Promise { + await queryGpuResourceTabData(startNs).then((results) => { + if (results.length > 0) { + results.sort(function (a, b) { + return b.totalSize - a.totalSize; + }); + let totalSize = 0; + for (let i = 0; i < results.length; i++) { + this.gpuResourceDataSource.push({ + name: SpSystemTrace.DATA_DICT.get(results[i].channelId), + size: getByteWithUnit(results[i].totalSize || 0), + }); + totalSize += results[i].totalSize; + } + this.gpuResourceDataSource.unshift( + { name: 'TimeStamp', size: ns2s(startNs) }, + { name: 'TimeStamp(Absolute)', size: (startNs + (window as any).recordStartNS) / 1000000000 }, + { name: 'Total', size: getByteWithUnit(totalSize) } + ); + } + this.gpuResourceTable!.recycleDataSource = this.gpuResourceDataSource; + }); + } + + public initElements(): void { + this.gpuResourceTable = this.shadowRoot?.querySelector('#gpu-resource-tbl'); + } + + connectedCallback() { + super.connectedCallback(); + resizeObserver(this.parentElement!, this.gpuResourceTable!); + } + public initHtml(): string { + return ` + + + + + + + + + `; + } +} diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.ts index 041dc4159eca8162b23ef0aec83a1bbf432513e3..68295a39ffee74e1d2d39ce7a500a1aeb0ded9c3 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.ts @@ -13,15 +13,15 @@ * limitations under the License. */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitSelect } from '../../../../../base-ui/select/LitSelect.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { queryProcessPurgeableSelectionTab } from '../../../../database/SqlLite.js'; import { Utils } from '../../base/Utils.js'; import { CompareStruct, compare, resizeObserverFromMemory } from '../SheetUtils.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; @element('tabpane-purgeable-pin-comparison-vm') export class TabPanePurgPinComparisonVM extends BaseElement { private purgeablePinTable: LitTable | null | undefined; @@ -36,9 +36,8 @@ export class TabPanePurgPinComparisonVM extends BaseElement { } public totalData(data: SelectionParam | any, dataList: any): void { //@ts-ignore - this.purgeablePinTable?.shadowRoot?.querySelector('.table')?.style?.height = `${ - this.parentElement!.clientHeight - 45 - }px`; + this.purgeablePinTable?.shadowRoot?.querySelector('.table')?.style?.height = `${this.parentElement!.clientHeight - 45 + }px`; this.purgeablePinSource = []; let fileArr: any[] = []; for (let fileData of dataList) { diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.ts index edc4bec7cfc78a6214d166d26264838d43abc579..c7b1d52d028eda5788cb738fd05a794fc9d97397 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.ts @@ -13,15 +13,15 @@ * limitations under the License. */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; +import { type LitSelect } from '../../../../../base-ui/select/LitSelect.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { queryProcessPurgeableSelectionTab } from '../../../../database/SqlLite.js'; import { Utils } from '../../base/Utils.js'; import { CompareStruct, compare, resizeObserverFromMemory } from '../SheetUtils.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; @element('tabpane-purgeable-total-comparison-vm') export class TabPanePurgTotalComparisonVM extends BaseElement { private purgeableTotalTable: LitTable | null | undefined; @@ -36,9 +36,8 @@ export class TabPanePurgTotalComparisonVM extends BaseElement { } public totalData(data: SelectionParam | any, dataList: any): void { //@ts-ignore - this.purgeableTotalTable?.shadowRoot?.querySelector('.table')?.style?.height = `${ - this.parentElement!.clientHeight - 45 - }px`; + this.purgeableTotalTable?.shadowRoot?.querySelector('.table')?.style?.height = `${this.parentElement!.clientHeight - 45 + }px`; this.purgeableTotalSource = []; let fileArr: any[] = []; for (let file of dataList) { diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.ts index 90f98ae6396047c1f46cc085a4a508fa09e6c1f5..b0480c539ae87c6502350a11bfdfe28647f3c1d4 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.ts @@ -13,8 +13,8 @@ * limitations under the License. */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; -import { SelectionParam } from '../../../../bean/BoxSelection'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type SelectionParam } from '../../../../bean/BoxSelection'; import { queryVmTrackerShmSizeData } from '../../../../database/SqlLite.js'; import { Utils } from '../../base/Utils.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; @@ -34,9 +34,9 @@ export class TabPaneVmTrackerShm extends BaseElement { this.init(); this.clear(); this.range!.textContent = - 'Selected range: ' + - parseFloat(((valVmTrackerShm.rightNs - valVmTrackerShm.leftNs) / 1000000.0).toFixed(5)) + - ' ms'; + 'Selected range: ' + + parseFloat(((valVmTrackerShm.rightNs - valVmTrackerShm.leftNs) / 1000000.0).toFixed(5)) + + ' ms'; this.queryDataByDB(valVmTrackerShm); } } diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts index 4446f54cb45b071c76b9c989c215929cbb04b396..a5f233bfda2a898a8a4bd4a5d2c9a284a51a9f1a 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts @@ -13,15 +13,15 @@ * limitations under the License. */ import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; -import { LitTable } from '../../../../../base-ui/table/lit-table.js'; +import { type LitTable } from '../../../../../base-ui/table/lit-table.js'; import { queryVmTrackerShmSelectionData } from '../../../../database/SqlLite.js'; -import { SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; +import { type SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; import { MemoryConfig } from '../../../../bean/MemoryConfig.js'; import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon.js'; import { Utils } from '../../base/Utils.js'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; -import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; -import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; +import { type LitSelect } from '../../../../../base-ui/select/LitSelect.js'; +import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; import { resizeObserverFromMemory } from '../SheetUtils.js'; @element('tabpane-vmtracker-shm-comparison') @@ -67,7 +67,7 @@ export class TabPaneVmTrackerShmComparison extends BaseElement { that.updateComparisonData(data.startNs, fileArr[0].startNs); } - async updateComparisonData(baseFileTs: number, targetFileTs: number) { + async updateComparisonData(baseFileTs: number, targetFileTs: number): Promise { await queryVmTrackerShmSelectionData(baseFileTs, this.memoryConfig.iPid).then((result) => { this.baseFileData = result; }); @@ -96,7 +96,7 @@ export class TabPaneVmTrackerShmComparison extends BaseElement { return sizeObj; } - initSelect(fileId: number, fileArr: Array) { + initSelect(fileId: number, fileArr: Array): void { let that = this; let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; this.selectEl!.innerHTML = ''; @@ -114,7 +114,7 @@ export class TabPaneVmTrackerShmComparison extends BaseElement { a.addEventListener('onSelected', (e) => { this.comparisonTableEl!.scrollTop = 0; for (let f of fileArr) { - if (input.value == f.name) { + if (input.value === f.name) { that.updateComparisonData(fileId, f.startNs); } } diff --git a/ide/src/trace/component/trace/timer-shaft/CollapseButton.ts b/ide/src/trace/component/trace/timer-shaft/CollapseButton.ts index 37faf443b8eff07282c1d1bd589858a8b12ca75d..25b74d338ca1fafb7b44c81f00d31e2e328471b4 100644 --- a/ide/src/trace/component/trace/timer-shaft/CollapseButton.ts +++ b/ide/src/trace/component/trace/timer-shaft/CollapseButton.ts @@ -39,9 +39,9 @@ export default class CollapseButton extends BaseElement { initElements(): void { this.onclick = (e) => { - this.expand = !this.expand + this.expand = !this.expand; window.publish(window.SmartEvent.UI.CollapseAllLane, this.expand); - } + }; } initHtml(): string { @@ -72,5 +72,4 @@ div:hover{
    `; } - -} \ No newline at end of file +} diff --git a/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts b/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts index be1d6e22f7b1705095edaa0f6e0bb940196d9b56..ce87ea7bd3f5b37fa4627c3f0f0ac771390c3253 100644 --- a/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts +++ b/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts @@ -236,7 +236,7 @@ export class RangeRuler extends Graph { this.range.xs = []; } this.range.scale = this.scale; - if (rangeYu != 0) { + if (rangeYu !== 0) { let first_NodeWidth = ((this.scale - rangeYu) / this.scale) * rangeRealW; rangeStartX += first_NodeWidth; tempNs += rangeYu; @@ -255,7 +255,7 @@ export class RangeRuler extends Graph { } } - private drawSelectionRange() { + private drawSelectionRange(): void { this.context2D.fillStyle = window.getComputedStyle(this.canvas!, null).getPropertyValue('background-color'); this.rangeRect.x = this.markAObj.frame.x < this.markBObj.frame.x ? this.markAObj.frame.x : this.markBObj.frame.x; this.rangeRect.width = Math.abs(this.markBObj.frame.x - this.markAObj.frame.x); @@ -417,7 +417,7 @@ export class RangeRuler extends Graph { } setCacheInterval() { - if (Math.trunc(this.currentDuration / this.cacheInterval.interval) != this.cacheInterval.value) { + if (Math.trunc(this.currentDuration / this.cacheInterval.interval) !== this.cacheInterval.value) { this.cacheInterval.flag = true; this.cacheInterval.value = Math.trunc(this.currentDuration / this.cacheInterval.interval); } else { @@ -465,19 +465,19 @@ export class RangeRuler extends Graph { return this.range; } - cancelPressFrame() { - if (this.pressFrameIdA != -1) cancelAnimationFrame(this.pressFrameIdA); - if (this.pressFrameIdD != -1) cancelAnimationFrame(this.pressFrameIdD); - if (this.pressFrameIdW != -1) cancelAnimationFrame(this.pressFrameIdW); - if (this.pressFrameIdS != -1) cancelAnimationFrame(this.pressFrameIdS); - if (this.pressFrameIdF != -1) cancelAnimationFrame(this.pressFrameIdF); + cancelPressFrame(): void { + if (this.pressFrameIdA !== -1) cancelAnimationFrame(this.pressFrameIdA); + if (this.pressFrameIdD !== -1) cancelAnimationFrame(this.pressFrameIdD); + if (this.pressFrameIdW !== -1) cancelAnimationFrame(this.pressFrameIdW); + if (this.pressFrameIdS !== -1) cancelAnimationFrame(this.pressFrameIdS); + if (this.pressFrameIdF !== -1) cancelAnimationFrame(this.pressFrameIdF); } - cancelUpFrame() { - if (this.upFrameIdA != -1) cancelAnimationFrame(this.upFrameIdA); - if (this.upFrameIdD != -1) cancelAnimationFrame(this.upFrameIdD); - if (this.upFrameIdW != -1) cancelAnimationFrame(this.upFrameIdW); - if (this.upFrameIdS != -1) cancelAnimationFrame(this.upFrameIdS); + cancelUpFrame(): void { + if (this.upFrameIdA !== -1) cancelAnimationFrame(this.upFrameIdA); + if (this.upFrameIdD !== -1) cancelAnimationFrame(this.upFrameIdD); + if (this.upFrameIdW !== -1) cancelAnimationFrame(this.upFrameIdW); + if (this.upFrameIdS !== -1) cancelAnimationFrame(this.upFrameIdS); } cancelTimeOut: any = undefined; @@ -489,7 +489,7 @@ export class RangeRuler extends Graph { if ( this.animaStartTime == undefined || (this.pressedKeys.length > 0 && - this.pressedKeys[this.pressedKeys.length - 1] != keyboardEvent.key.toLocaleLowerCase()) + this.pressedKeys[this.pressedKeys.length - 1] !== keyboardEvent.key.toLocaleLowerCase()) ) { let dat = new Date(); dat.setTime(dat.getTime() - 400); @@ -499,7 +499,7 @@ export class RangeRuler extends Graph { this.setCacheInterval(); this.range.refresh = this.cacheInterval.flag; if (this.pressedKeys.length > 0) { - if (this.pressedKeys[this.pressedKeys.length - 1] != keyboardEvent.key.toLocaleLowerCase()) { + if (this.pressedKeys[this.pressedKeys.length - 1] !== keyboardEvent.key.toLocaleLowerCase()) { this.cancelPressFrame(); this.cancelUpFrame(); this.pressedKeys.push(keyboardEvent.key.toLocaleLowerCase()); @@ -526,7 +526,7 @@ export class RangeRuler extends Graph { }, 1000); } - keyPressF() { + keyPressF(): void { const DIS = 100; let clientWidth = this.canvas?.clientWidth || 0; let midX = Math.round(clientWidth / 2); @@ -551,7 +551,7 @@ export class RangeRuler extends Graph { sliceMidX = Math.round(startX + totalX / 2); let count1 = 0; let count2 = 0; - let animF = () => { + let animF = (): void => { let sliceMidXMap = new Map(); startX = (this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); endX = (this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); @@ -845,7 +845,7 @@ export class RangeRuler extends Graph { this.upFrameIdW = requestAnimationFrame(animW); } - keyUpS() { + keyUpS(): void { let startTime = new Date().getTime(); let animS = () => { if (this.range.startNS <= 0 && this.range.endNS >= this.range.totalNS) { @@ -872,7 +872,7 @@ export class RangeRuler extends Graph { this.upFrameIdS = requestAnimationFrame(animS); } - keyUpA() { + keyUpA(): void { let startTime = new Date().getTime(); let animA = () => { if (this.range.startNS <= 0) { @@ -900,7 +900,7 @@ export class RangeRuler extends Graph { this.upFrameIdA = requestAnimationFrame(animA); } - keyUpD() { + keyUpD(): void { let startTime = new Date().getTime(); let animD = () => { if (this.range.endNS >= this.range.totalNS) { @@ -927,8 +927,8 @@ export class RangeRuler extends Graph { this.upFrameIdD = requestAnimationFrame(animD); } - translate(distance: number) { - const rangeDur = (this.range.endNS - this.range.startNS) + translate(distance: number): void { + const rangeDur = this.range.endNS - this.range.startNS; const time = (distance / this.canvas!.width) * rangeDur; if ( this.range.startNS < 0 || @@ -947,7 +947,7 @@ export class RangeRuler extends Graph { this.range.refresh = false; } - zoomFit(startTime: number, endTime: number) { + zoomFit(startTime: number, endTime: number): void { let startX = (this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); let endX = (this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); let totalX = endX - startX; diff --git a/ide/src/trace/component/trace/timer-shaft/Rect.ts b/ide/src/trace/component/trace/timer-shaft/Rect.ts index 99da364f7862298074d1ad40fa429822481f121b..1d54ba066e1a3f70a40f5f1b479ddfaad594cc74 100644 --- a/ide/src/trace/component/trace/timer-shaft/Rect.ts +++ b/ide/src/trace/component/trace/timer-shaft/Rect.ts @@ -54,7 +54,7 @@ export class Rect { ); } - static intersect(rectA: Rect|DOMRect, rectB: Rect|DOMRect): boolean { + static intersect(rectA: Rect | DOMRect, rectB: Rect | DOMRect): boolean { let maxX = Math.max(rectA.x + rectA.width, rectB.x + rectB.width); let maxY = Math.max(rectA.y + rectA.height, rectB.y + rectB.height); let minX = Math.min(rectA.x, rectB.x); diff --git a/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts b/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts index 990c26f50f931bf0d93c31612eaa75a5c47ceea3..74fa05d1927f977345f5b5d40c09970a41f7b653 100644 --- a/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts +++ b/ide/src/trace/component/trace/timer-shaft/TabPaneFlag.ts @@ -30,8 +30,8 @@ export class TabPaneFlag extends BaseElement { initElements(): void { this.systemTrace = document - .querySelector('body > sp-application')! - .shadowRoot!.querySelector('#sp-system-trace'); + .querySelector('body > sp-application')?. + shadowRoot!.querySelector('#sp-system-trace'); this.panelTable = this.shadowRoot!.querySelector('.notes-editor-panel'); this.panelTable!.addEventListener('row-click', (evt: any) => { this.flagList = this.systemTrace?.timerShaftEL!.sportRuler?.flagList || []; @@ -202,4 +202,4 @@ export class TabPaneFlag extends BaseElement {
    `; } -} \ No newline at end of file +} diff --git a/ide/src/trace/database/ConvertTraceWorker.ts b/ide/src/trace/database/ConvertTraceWorker.ts index 3501a83255d79b6312572e0c276a8f0dfbf0231c..567be06185ecccd7a99c0a1138a51f25378fd0b9 100644 --- a/ide/src/trace/database/ConvertTraceWorker.ts +++ b/ide/src/trace/database/ConvertTraceWorker.ts @@ -55,11 +55,13 @@ self.onmessage = async (e: MessageEvent) => { let headerStr = enc.decode(uint8Array); let currentPosition = 1024; let dataHeader = convertModule._malloc(1100); - if (headerStr.indexOf('OHOSPROF') == 0) { // htrace + if (headerStr.indexOf('OHOSPROF') == 0) { + // htrace let uint8Array = new Uint8Array(fileData.slice(0, 1024)); convertModule.HEAPU8.set(uint8Array, dataHeader); convertModule._SendFileHeader(dataHeader, 1024, traceInsPtr); - } else { // raw trace + } else { + // raw trace let uint8Array = new Uint8Array(fileData.slice(0, 12)); convertModule.HEAPU8.set(uint8Array, dataHeader); convertModule._SendRawFileHeader(dataHeader, 12, traceInsPtr); diff --git a/ide/src/trace/database/IndexedDBHelp.ts b/ide/src/trace/database/IndexedDBHelp.ts index a4a9df0d72beeb6774ac78b93517b98b38fb7daa..bd34adc297fa36f3250782aaedf82cc91139ece1 100644 --- a/ide/src/trace/database/IndexedDBHelp.ts +++ b/ide/src/trace/database/IndexedDBHelp.ts @@ -30,30 +30,30 @@ export class IndexedDBHelp { idbOpenDBRequest.onupgradeneeded = () => { const database: IDBDatabase = idbOpenDBRequest.result; this.db = database; - storeOptions?.forEach(option => { - let optionName = option.name + storeOptions?.forEach((option) => { + let optionName = option.name; if (database.objectStoreNames.contains(optionName) === false) { if (option.objectStoreParameters) { let objectStore = database.createObjectStore(optionName, option.objectStoreParameters); - option.dataItems?.forEach(dataItem => { + option.dataItems?.forEach((dataItem) => { if (dataItem.indexParameters) { - objectStore.createIndex(dataItem.name, dataItem.name, dataItem.indexParameters) + objectStore.createIndex(dataItem.name, dataItem.keypath, dataItem.indexParameters); } else { - objectStore.createIndex(dataItem.name, dataItem.name) + objectStore.createIndex(dataItem.name, dataItem.keypath); } - }) + }); } else { let objectStore = database.createObjectStore(optionName); - option.dataItems?.forEach(dataItem => { + option.dataItems?.forEach((dataItem) => { if (dataItem.indexParameters) { - objectStore.createIndex(dataItem.name, dataItem.name, dataItem.indexParameters) + objectStore.createIndex(dataItem.name, dataItem.name, dataItem.indexParameters); } else { - objectStore.createIndex(dataItem.name, dataItem.name) + objectStore.createIndex(dataItem.name, dataItem.name); } - }) + }); } } - }) + }); resolve(database); }; idbOpenDBRequest.onsuccess = (event) => { @@ -79,17 +79,23 @@ export class IndexedDBHelp { return transaction.objectStore(storeName); } - public get(storeName: string, query: IDBValidKey | IDBKeyRange) { + public get(storeName: string, query: IDBValidKey | IDBKeyRange, queryIndex?: string) { return new Promise((resolve, reject) => { this.getObjectStore(storeName).then((objectStore: IDBObjectStore) => { - const request: IDBRequest = objectStore.get(query); + let request: IDBRequest; + if (queryIndex) { + const index = objectStore.index(queryIndex); + request = index.getAll(query); + } else { + request = objectStore.getAll(query); + } request.onsuccess = function (event) { // @ts-ignore resolve(event.target.result); }; request.onerror = (event) => { reject(event); - } + }; }); }); } @@ -104,7 +110,7 @@ export class IndexedDBHelp { }; request.onerror = (event) => { reject(event); - } + }; }); }); } @@ -112,14 +118,14 @@ export class IndexedDBHelp { public delete(storeName: string, query: IDBValidKey | IDBKeyRange) { return new Promise((resolve, reject) => { this.getObjectStore(storeName).then((objectStore: IDBObjectStore) => { - const request = objectStore.delete(query); + const request = objectStore['delete'](query); request.onsuccess = function (event) { // @ts-ignore resolve(event.target.result); }; request.onerror = (event) => { reject(event); - } + }; }); }); } @@ -134,14 +140,14 @@ export class IndexedDBHelp { }; request.onerror = (event) => { reject(event); - } + }; }); }); } } export class StoreOptions { - name: string = ""; + name: string = ''; objectStoreParameters?: IDBObjectStoreParameters; - dataItems?: Array<{ name: string, indexParameters?: IDBIndexParameters }>; + dataItems?: Array<{ name: string; keypath: string[] | string; indexParameters?: IDBIndexParameters }>; } diff --git a/ide/test/trace/component/trace/sheet/frame/TabPaneFrameAnimation.test.ts b/ide/src/trace/database/LongTraceDBUtils.ts similarity index 41% rename from ide/test/trace/component/trace/sheet/frame/TabPaneFrameAnimation.test.ts rename to ide/src/trace/database/LongTraceDBUtils.ts index 1a53740e94e2fd9122474b24c23145dd57e64cf8..3ca7657829d2b309fdb2dc8ea45bd048f57321a4 100644 --- a/ide/test/trace/component/trace/sheet/frame/TabPaneFrameAnimation.test.ts +++ b/ide/src/trace/database/LongTraceDBUtils.ts @@ -13,31 +13,32 @@ * limitations under the License. */ -// @ts-ignore -import { TabPaneFrameAnimation } from '../../../../../../dist/trace/component/trace/sheet/frame/TabPaneFrameAnimation.js'; +import { IndexedDBHelp } from './IndexedDBHelp.js'; -describe('TabPaneFrameAnimation Test', () => { - let frameAnimation = new TabPaneFrameAnimation(); - let frameAnimationData = { - ts: 0, - dur: 0, - status: 'Response delay', - animationId: 10, - dynamicStartTs: 0, - dynamicEndTs: 0, - fps: 2, - }; - let frameAnimationParam = { leftNs: 211, rightNs: 1252, frameAnimation: [frameAnimationData] }; - it('TabPaneFrameAnimationTest01', function () { - frameAnimation.data = frameAnimationParam; - expect(frameAnimation.data).toBeUndefined(); - }); +export class LongTraceDBUtils { + public static instance: LongTraceDBUtils | undefined; + dbVersion: number = 1; + dbName: string = 'sp'; + tableName: string = 'longTable'; + indexedDBHelp: IndexedDBHelp = new IndexedDBHelp(); - it('TabPaneFrameAnimationTest02', function () { - expect( - frameAnimation.sortByColumn({ - key: 'animation', - }) - ).toBeUndefined(); - }); -}); + public static getInstance(): LongTraceDBUtils { + if (!this.instance) { + this.instance = new LongTraceDBUtils(); + } + return this.instance; + } + + createDBAndTable(): Promise { + return this.indexedDBHelp.open(this.dbName, this.dbVersion, [ + { + name: this.tableName, + objectStoreParameters: { keyPath: 'id' }, + dataItems: [ + { name: 'QueryCompleteFile', keypath: ['timStamp', 'fileType', 'pageNum', 'index'] }, + { name: 'QueryFileByPage', keypath: ['timStamp', 'fileType', 'pageNum'] }, + ], + }, + ]); + } +} diff --git a/ide/src/trace/database/SqlLite.ts b/ide/src/trace/database/SqlLite.ts index 95aeb903970103f09c907c1e8551b374aba257e5..d06547eebd89f1f6da97c87a8bb0773ac3a1a745 100644 --- a/ide/src/trace/database/SqlLite.ts +++ b/ide/src/trace/database/SqlLite.ts @@ -84,12 +84,12 @@ import { AppStartupStruct } from './ui-worker/ProcedureWorkerAppStartup.js'; import { SoStruct } from './ui-worker/ProcedureWorkerSoInit.js'; import { HeapTreeDataBean } from './logic-worker/ProcedureLogicWorkerCommon.js'; import { TaskTabStruct } from '../component/trace/sheet/task/TabPaneTaskFrames.js'; -import { DeviceStruct } from '../bean/FrameComponentBean.js'; -import { FrameSpacingStruct } from './ui-worker/ProcedureWorkerFrameSpacing.js'; -import { FrameDynamicStruct } from './ui-worker/ProcedureWorkerFrameDynamic.js'; -import { FrameAnimationStruct } from './ui-worker/ProcedureWorkerFrameAnimation.js'; -import { SnapshotStruct } from './ui-worker/ProcedureWorkerSnapshot.js'; -import { MemoryConfig } from '../bean/MemoryConfig.js'; +import { type DeviceStruct } from '../bean/FrameComponentBean.js'; +import { type FrameSpacingStruct } from './ui-worker/ProcedureWorkerFrameSpacing.js'; +import { type FrameDynamicStruct } from './ui-worker/ProcedureWorkerFrameDynamic.js'; +import { type FrameAnimationStruct } from './ui-worker/ProcedureWorkerFrameAnimation.js'; +import { type SnapshotStruct } from './ui-worker/ProcedureWorkerSnapshot.js'; +import { type MemoryConfig } from '../bean/MemoryConfig.js'; import { LogStruct } from './ui-worker/ProcedureWorkerLog.js'; class DataWorkerThread extends Worker { @@ -143,7 +143,11 @@ class DbThread extends Worker { this.postMessage(msg); } - cutFileByRange(leftTs: number, rightTs: number, handler: (status: boolean, msg: string, splitBuffer?: ArrayBuffer) => void) { + cutFileByRange( + leftTs: number, + rightTs: number, + handler: (status: boolean, msg: string, splitBuffer?: ArrayBuffer) => void + ) { this.busy = true; let id = this.uuid(); this.taskMap[id] = (res: any) => { @@ -160,7 +164,7 @@ class DbThread extends Worker { action: 'cut-file', leftTs: leftTs, rightTs: rightTs, - buffer: DbPool.sharedBuffer! + buffer: DbPool.sharedBuffer!, }, [DbPool.sharedBuffer!] ); @@ -303,7 +307,7 @@ export class DbPool { } }; - initServer = async (url: string, progress: Function) => { + initServer = async (url: string, progress: Function): Promise<{ status: boolean; msg: string }> => { this.progress = progress; progress('database loaded', 15); DbPool.sharedBuffer = await fetch(url).then((res) => res.arrayBuffer()); @@ -1244,13 +1248,17 @@ export const queryThreads = (): Promise> => export const queryDataDICT = (): Promise> => query('queryDataDICT', `select * from data_dict;`); -export const queryAppStartupProcessIds = (): Promise> => query('queryAppStartupProcessIds', ` +export const queryAppStartupProcessIds = (): Promise> => + query( + 'queryAppStartupProcessIds', + ` SELECT pid FROM process WHERE ipid IN ( SELECT ipid FROM app_startup UNION SELECT t.ipid FROM app_startup a LEFT JOIN thread t ON a.call_id = t.itid -);`); +);` + ); export const queryProcessContentCount = (): Promise> => query(`queryProcessContentCount`, `select pid,switch_count,thread_count,slice_count,mem_count from process;`); export const queryProcessThreadsByTable = (): Promise> => @@ -1384,8 +1392,8 @@ select pid id,name,'p' type from process;`, export const queryThreadStateArgs = (argset: number): Promise> => query('queryThreadStateArgs', ` select args_view.* from args_view where argset = ${argset}`, {}); -export const queryThreadStateArgsByName = (key: string): Promise> => -query('queryThreadStateArgsByName', ` select strValue, argset from args_view where keyName = $key`, {$key: key}); +export const queryThreadStateArgsByName = (key: string): Promise> => + query('queryThreadStateArgsByName', ` select strValue, argset from args_view where keyName = $key`, { $key: key }); export const queryWakeUpThread_Desc = (): Promise> => query( @@ -2779,7 +2787,7 @@ export const queryWakeupListPriority = (itid: number[], ts: number[], cpus: numb and itid in (${itid.join(',')}) and ts - start_ts in (${ts.join(',')}) `, - { } + {} ); export const queryBinderByArgsId = (id: number, startTime: number, isNext: boolean): Promise> => { @@ -3568,10 +3576,10 @@ export const queryGpuTotalType = (): Promise query( 'queryGpuTotalType', ` - select distinct module_name_id id,data + select distinct module_name_id id,data from memory_window_gpu A, trace_range TR left join data_dict B on A.module_name_id = B.id where window_name_id = 0 - and A.ts < TR.end_ts; + and A.ts < TR.end_ts ` ); @@ -3598,11 +3606,14 @@ export const queryGpuDataByTs = ( category_name_id as categoryId, size from memory_window_gpu, trace_range - where ts - start_ts = ${ts} ${condition};`; + where ts - start_ts = ${ts} ${condition} + `; return query('queryGpuDataByTs', sql); }; -export const queryGpuTotalData = (moduleId: number | null): Promise> => { +export const queryGpuTotalData = ( + moduleId: number | null +): Promise> => { let moduleCondition = moduleId === null ? '' : `and module_name_id = ${moduleId}`; let sql = ` select (ts - start_ts) startNs, sum(size) value @@ -3614,45 +3625,47 @@ export const queryGpuTotalData = (moduleId: number | null): Promise> => { +// GL 或 Graph 泳道图 +export const queryGpuData = (ipid: number, name: string): Promise> => { let sql = ` - select (ts - start_ts) startNs,sum(value) value -from process_measure, trace_range -where filter_id = ( - select id - from process_measure_filter - where name = 'mem.gl_pss' and ipid = ${ipid} - ) -and ts between start_ts and end_ts -group by ts; - `; - return query('queryGpuGLData', sql); + select (ts - start_ts) startNs,sum(value) value + from process_measure, trace_range + where filter_id = ( + select id + from process_measure_filter + where name = ${name} and ipid = ${ipid} + ) + and ts between start_ts and end_ts + group by ts; + `; + return query('queryGpuData', sql); }; - -export const queryGpuGLDataByRange = ( +// GL 或 Graph 框选Tab页 +export const queryGpuDataTab = ( ipid: number, leftNs: number, rightNs: number, - interval: number + interval: number, + name: string ): Promise> => { let sql = ` - select (ts - start_ts) startTs,sum(value) size -from process_measure, trace_range -where filter_id = ( - select id - from process_measure_filter - where name = 'mem.gl_pss' and ipid = ${ipid} - ) -and not ((startTs + ${interval} < ${leftNs}) or (startTs > ${rightNs})) -group by ts; - `; + select (ts - start_ts) startTs,sum(value) size + from process_measure, trace_range + where filter_id = ( + select id + from process_measure_filter + where name = ${name} and ipid = ${ipid} + ) + and not ((startTs + ${interval} < ${leftNs}) or (startTs > ${rightNs})) + group by ts; + `; return query('queryGpuGLDataByRange', sql); }; export const queryGpuDataByRange = ( leftNs: number, rightNs: number, - interval: number + interval: number, ): Promise< Array<{ startTs: number; @@ -3681,7 +3694,7 @@ export const queryGpuDataByRange = ( export const queryGpuWindowData = ( windowId: number, - moduleId: number | null + moduleId: number | null, ): Promise> => { let moduleCondition = moduleId === null ? '' : `and module_name_id = ${moduleId}`; let sql = ` @@ -4376,7 +4389,11 @@ export const queryHiPerfProcessCount = ( ); }; -export const queryConcurrencyTask = (itid: number, selectStartTime: number, selectEndTime: number) => +export const queryConcurrencyTask = ( + itid: number, + selectStartTime: number, + selectEndTime: number +): Promise => query( 'queryConcurrencyTask', `SELECT thread.tid, @@ -4519,17 +4536,20 @@ export const queryFrameAnimationData = (): Promise> UNION SELECT a.id AS animationId, 'Completion delay' as status, - (a.start_point - R.start_ts) AS startTs, + (CASE WHEN a.input_time NOT NULL + THEN ( a.input_time - R.start_ts ) + ELSE ( a.start_point - R.start_ts ) END + ) AS startTs, (a.end_point - R.start_ts) AS endTs, a.frame_info AS frameInfo FROM animation AS a, trace_range AS R - ORDER BY - startTs;` + ORDER BY + endTs;` ); -export const queryFrameDynamicData = (): Promise> => +export const queryFrameDynamicData = (): Promise => query( 'queryFrameDynamicData', `SELECT @@ -4658,9 +4678,9 @@ export const queryVmTrackerShmSelectionData = (startNs: number, ipid: number): P where startNS = ${startNs} and ipid = ${ipid};`, {} ); -export const getTabSmapsRecordData = (rightNs: number): Promise> => +export const getTabSmapsSampleData = (rightNs: number): Promise> => query( - 'getTabSmapsRecordData', + 'getTabSmapsSampleData', ` SELECT (A.timestamp - t.start_ts) AS startNs, @@ -4679,6 +4699,27 @@ export const getTabSmapsRecordData = (rightNs: number): Promise> => 'exec' ); +// VM Tracker Smaps Record Tab页 +export const querySmapsRecordTabData = ( + startNs: number, + ipid: number, + pixelmapId: number, + typeId:number +): Promise> => + query( + 'querySmapsRecordTabData', + `select 'RenderServiceCpu' as name, IFNULL(sum(mem_size), 0) as size from memory_rs_image, trace_range tr + where ipid = ${ipid} and (ts - tr.start_ts) = ${startNs} and type_id = ${pixelmapId} + union all + select 'SkiaCpu' as name, total_size as size from memory_cpu,trace_range + where (ts - start_ts) = ${startNs} + union all + select 'GLESHostCache' as name, 0 + union all + select 'VirtaulSize' as name, sum(virtaul_size) * 1024 as size from smaps, trace_range + where type = ${typeId} and (timeStamp - start_ts) = ${startNs}` + ); + export const getTabSmapsStatisticMaxSize = (rightNs: number): Promise> => query( 'getTabSmapsStatisticMaxRss', @@ -4766,6 +4807,41 @@ export const queryGpuMemoryData = (processId: number): Promise> => + query( + 'queryGpuResourceData', + `SELECT + subquery1.startNs, + IFNULL(subquery1.totalSize, 0) as aSize, + IFNULL(subquery2.size, 0) as bSize, + (IFNULL(subquery1.totalSize, 0) - IFNULL(subquery2.size, 0)) AS value + FROM + (SELECT (ts - start_ts) AS startNs,SUM(total_size) AS totalSize + FROM memory_profile, trace_range + WHERE ts between start_ts and end_ts + GROUP BY ts) AS subquery1 + LEFT JOIN + (SELECT (ts - start_ts) AS startNs, SUM(size) AS size + FROM memory_window_gpu, trace_range + WHERE ts between start_ts and end_ts + AND category_name_id = ${categoryNameId} + GROUP BY ts) AS subquery2 + ON subquery1.startNs = subquery2.startNs`, + ); + +// VM Tracker Gpu Resource Tab页 +export const queryGpuResourceTabData = ( + startNs: number +): Promise> => + query( + 'queryGpuResourceTabData', + `SELECT (ts - start_ts) as startNs, channel_id as channelId, sum(total_size) as totalSize + FROM memory_profile, trace_range + WHERE (ts - start_ts) = ${startNs} + GROUP by ts, channelId` + ); + // Ability Monitor Purgeable泳道图 export const queryPurgeableSysData = (isPin?: boolean): Promise> => { const pinCondition = isPin ? ' AND a.ref_count > 0' : ''; @@ -5377,23 +5453,25 @@ export const queryLogData = (oneDayTime: number): Promise> => LEFT JOIN process p ON p.pid = l.pid ORDER BY l.ts;`, - {$oneDayTime: oneDayTime} + { $oneDayTime: oneDayTime } ); export const queryMetric = (metricName: string): Promise> => query('queryMetric', metricName, '', 'exec-metric'); export const queryExistFtrace = (): Promise> => - query( - 'queryExistFtrace', - `select 1 from thread_state + query( + 'queryExistFtrace', + `select 1 from thread_state UNION select 1 from args;` - ); + ); -export const queryTraceType = (): Promise> => +export const queryTraceType = (): Promise< + Array<{ + value: string; + }> +> => query( 'queryTraceType', `SELECT m.value diff --git a/ide/src/trace/database/SqlLiteWorker.ts b/ide/src/trace/database/SqlLiteWorker.ts index aea9d7be152bdefb921b9d384ce8ea1bb9753ee4..b0f4a020cf06ca1d871f34ccc34e89299a7a7e3c 100644 --- a/ide/src/trace/database/SqlLiteWorker.ts +++ b/ide/src/trace/database/SqlLiteWorker.ts @@ -37,25 +37,25 @@ function initIndexedDB() { function readConnection(store: IDBObjectStore) { return new Promise((resolve, reject) => { let readRequest = store.get(1); - readRequest.onsuccess = function (event) { + readRequest.onsuccess = function (event): void { // @ts-ignore resolve(event.target.result); }; - readRequest.onerror = function (event) { + readRequest.onerror = function (event): void { // @ts-ignore reject(event.target.result); }; }); } -function deleteConnection(store: IDBObjectStore, id: number) { +function deleteConnection(store: IDBObjectStore, id: number): Promise { return new Promise((resolve, reject) => { let deleteRequest = store.delete(id); - deleteRequest.onsuccess = function (event) { + deleteRequest.onsuccess = function (event): void { // @ts-ignore resolve(event.target.result); }; - deleteRequest.onerror = function (event) { + deleteRequest.onerror = function (event): void { // @ts-ignore reject(event.target.result); }; diff --git a/ide/src/trace/database/TempSql.ts b/ide/src/trace/database/TempSql.ts index 837a58e61428d8267f68bc0e13420512de306339..ec61a763dafca8e76675230addae9080b564f58f 100644 --- a/ide/src/trace/database/TempSql.ts +++ b/ide/src/trace/database/TempSql.ts @@ -398,4 +398,4 @@ let delete_callstack_binder_data = `DELETE or name = 'binder transaction async' or name = 'binder async rcv';`; -let temp_init_sql_list = [temp_query_process]; \ No newline at end of file +let temp_init_sql_list = [temp_query_process]; diff --git a/ide/src/trace/database/TraceWorker.ts b/ide/src/trace/database/TraceWorker.ts index adb0b407ce3722106ed971defd3ab4dc2aa3a554..691fef71ddd41ad57b7c5a4c33af4ee29200a73e 100644 --- a/ide/src/trace/database/TraceWorker.ts +++ b/ide/src/trace/database/TraceWorker.ts @@ -29,6 +29,9 @@ let headUnitArray: Uint8Array | undefined; let thirdWasmMap = new Map(); let thirdJsonResult = new Map(); +let arkTsData: Array = []; +let arkTsDataSize: number = 0; + let currentAction: string = ''; let currentActionId: string = ''; @@ -113,7 +116,7 @@ let merged = () => { let translateJsonString = (str: string): string => { return str // .padding - .replace(/[\t|\r|\n]/g, '') + .replace(/[\t|\r|\n]/g, ''); }; let convertJSON = () => { @@ -124,9 +127,9 @@ let convertJSON = () => { if (!str) { } else { let parse; - let tansStr:string; + let tansStr: string; try { - tansStr = str.replace(/[\t|\r|\n]/g, ''); + tansStr = str.replace(/[\t\r\n]/g, ''); parse = JSON.parse(tansStr); } catch { try { @@ -139,9 +142,9 @@ let convertJSON = () => { } let columns = parse.columns; let values = parse.values; - for (let i = 0 ; i < values.length ; i++) { + for (let i = 0; i < values.length; i++) { let obj: any = {}; - for (let j = 0 ; j < columns.length ; j++) { + for (let j = 0; j < columns.length; j++) { obj[columns[j]] = values[i][j]; } jsonArray.push(obj); @@ -404,9 +407,409 @@ self.onmessage = async (e: MessageEvent) => { } } else if (e.data.action === 'cut-file') { cutFileByRange(e); + } else if (e.data.action === 'long_trace') { + await initWASM(); + let result = {}; + let headArray = e.data.params.headArray; + let timStamp = e.data.params.timeStamp; + let allIndexDataList = e.data.params.splitDataList; + let splitFileInfos = e.data.params.splitFileInfo as Array<{ + fileType: string; + startIndex: number; + endIndex: number; + size: number; + }>; + let maxSize = 48 * 1024 * 1024; + let maxPageNum = headArray.length / 1024; + let currentPageNum = 0; + let splitReqBufferAddr: number; + if (splitFileInfos) { + let splitFileInfo = splitFileInfos.filter((splitFileInfo) => splitFileInfo.fileType !== 'trace'); + if (splitFileInfo && splitFileInfo.length > 0) { + let traceFileType: string = ''; + let db = await openDB(); + let newCutFilePageInfo: Map< + string, + { + traceFileType: string; + dataArray: [{ data: Uint8Array | Array<{ offset: number; size: number }>; dataTypes: string }]; + } + > = new Map(); + let cutFileCallBack = (heapPtr: number, size: number, dataType: number, isEnd: number) => { + let key = `${traceFileType}_${currentPageNum}`; + let out: Uint8Array = Module.HEAPU8.slice(heapPtr, heapPtr + size); + if (DataTypeEnum.data === dataType) { + if (traceFileType === 'arkts') { + arkTsData.push(out); + arkTsDataSize += size; + } else { + if (newCutFilePageInfo.has(key)) { + let newVar = newCutFilePageInfo.get(key); + newVar?.dataArray.push({ data: out, dataTypes: 'data' }); + } else { + newCutFilePageInfo.set(key, { + traceFileType: traceFileType, + dataArray: [{ data: out, dataTypes: 'data' }], + }); + } + } + } else if (DataTypeEnum.json === dataType) { + let cutFilePageInfo = newCutFilePageInfo.get(key); + if (cutFilePageInfo) { + let jsonStr: string = dec.decode(out); + let jsonObj = JSON.parse(jsonStr); + let valueArray: Array<{ offset: number; size: number }> = jsonObj.value; + cutFilePageInfo.dataArray.push({ data: valueArray, dataTypes: 'json' }); + } + } + }; + splitReqBufferAddr = Module._InitializeSplitFile(Module.addFunction(cutFileCallBack, 'viiii'), REQ_BUF_SIZE); + Module.HEAPU8.set(headArray, splitReqBufferAddr); + Module._TraceStreamerGetLongTraceTimeSnapEx(headArray.length); + for (let fileIndex = 0; fileIndex < splitFileInfo.length; fileIndex++) { + let fileInfo = splitFileInfo[fileIndex]; + traceFileType = fileInfo.fileType; + for (let pageNum = 0; pageNum < maxPageNum; pageNum++) { + currentPageNum = pageNum; + await splitFileAndSave( + timStamp, + fileInfo.fileType, + fileInfo.startIndex, + fileInfo.endIndex, + fileInfo.size, + db, + pageNum, + maxSize, + splitReqBufferAddr + ); + await initWASM(); + splitReqBufferAddr = Module._InitializeSplitFile( + Module.addFunction(cutFileCallBack, 'viiii'), + REQ_BUF_SIZE + ); + Module.HEAPU8.set(headArray, splitReqBufferAddr); + Module._TraceStreamerGetLongTraceTimeSnapEx(headArray.length); + } + } + for (const [fileTypePageNum, fileMessage] of newCutFilePageInfo) { + let fileTypePageNumArr = fileTypePageNum.split('_'); + let fileType = fileTypePageNumArr[0]; + let pageNum = Number(fileTypePageNumArr[1]); + let saveIndex = 0; + let saveStartOffset = 0; + let dataArray = fileMessage.dataArray; + let currentChunk = new Uint8Array(maxSize); + let currentChunkOffset = 0; + for (let fileDataIndex = 0; fileDataIndex < dataArray.length; fileDataIndex++) { + let receiveData = dataArray[fileDataIndex]; + if (receiveData.dataTypes === 'data') { + let receiveDataArray = receiveData.data as Uint8Array; + if (currentChunkOffset + receiveDataArray.length > maxSize) { + let freeSize = maxSize - currentChunkOffset; + let freeSaveData = receiveDataArray.slice(0, freeSize); + currentChunk.set(freeSaveData, currentChunkOffset); + await addDataToIndexeddb(db, { + buf: currentChunk, + id: `${fileType}_new_${timStamp}_${pageNum}_${saveIndex}`, + fileType: `${fileType}_new`, + pageNum: pageNum, + startOffset: saveStartOffset, + endOffset: saveStartOffset + maxSize, + index: saveIndex, + timStamp: timStamp, + }); + saveStartOffset += maxSize; + saveIndex++; + currentChunk = new Uint8Array(maxSize); + let remnantArray = receiveDataArray.slice(freeSize); + currentChunkOffset = 0; + currentChunk.set(remnantArray, currentChunkOffset); + currentChunkOffset += remnantArray.length; + } else { + currentChunk.set(receiveDataArray, currentChunkOffset); + currentChunkOffset += receiveDataArray.length; + } + } else { + if (receiveData.data.length > 0) { + let needCutMessage = receiveData.data as Array<{ offset: number; size: number }>; + let startOffset = needCutMessage[0].offset; + let endOffset = + needCutMessage[needCutMessage.length - 1].offset + needCutMessage[needCutMessage.length - 1].size; + let searchDataInfo = allIndexDataList + .filter( + (value: { + fileType: string; + index: number; + pageNum: number; + startOffsetSize: number; + endOffsetSize: number; + }) => { + return ( + value.fileType === fileType && + value.startOffsetSize <= endOffset && + value.endOffsetSize >= startOffset + ); + } + ) + .sort((valueA: { startOffsetSize: number }, valueB: { startOffsetSize: number }) => { + return valueA.startOffsetSize - valueB.startOffsetSize; + }); + let startIndex = searchDataInfo[0].index; + let endIndex = searchDataInfo[searchDataInfo.length - 1].index; + let startQueryIndex = startIndex; + let endQueryIndex = startIndex + 10; + do { + endQueryIndex = Math.min(endQueryIndex, endIndex); + let searchCutFilter = searchDataInfo.filter( + (value: { + fileType: string; + index: number; + pageNum: number; + startOffsetSize: number; + endOffsetSize: number; + }) => { + if (endQueryIndex === startQueryIndex) { + return value.index >= startQueryIndex; + } + return value.index >= startQueryIndex && value.index <= endQueryIndex; + } + ); + let minStartOffsetSize = Math.min( + ...searchCutFilter.map((item: { startOffsetSize: number }) => item.startOffsetSize) + ); + let maxEndOffsetSize = Math.max( + ...searchCutFilter.map((item: { endOffsetSize: number }) => item.endOffsetSize) + ); + let cutUseOffsetObjs = needCutMessage.filter((offseObj) => { + return offseObj.offset > minStartOffsetSize && offseObj.offset < maxEndOffsetSize; + }); + let transaction = db.transaction(STORE_NAME, 'readonly'); + let store = transaction.objectStore(STORE_NAME); + let index = store.index('QueryCompleteFile'); + let range = IDBKeyRange.bound( + [timStamp, fileType, 0, startQueryIndex], + [timStamp, fileType, 0, endQueryIndex], + false, + false + ); + const getRequest = index.openCursor(range); + let queryAllData = await queryDataFromIndexeddb(getRequest); + let mergeData = indexedDataToBufferData(queryAllData); + for (let cutOffsetObjIndex = 0; cutOffsetObjIndex < cutUseOffsetObjs.length; cutOffsetObjIndex++) { + let cutUseOffsetObj = cutUseOffsetObjs[cutOffsetObjIndex]; + let endOffset = cutUseOffsetObj.offset + cutUseOffsetObj.size; + let sliceData = mergeData.slice( + cutUseOffsetObj.offset - minStartOffsetSize, + endOffset - minStartOffsetSize + ); + let sliceDataLength = sliceData.length; + if (currentChunkOffset + sliceDataLength >= maxSize) { + let handleCurrentData = new Uint8Array(currentChunkOffset + sliceDataLength); + let freeSaveArray = currentChunk.slice(0, currentChunkOffset); + handleCurrentData.set(freeSaveArray, 0); + handleCurrentData.set(sliceData, freeSaveArray.length); + let newSliceDataLength: number = Math.ceil(handleCurrentData.length / maxSize); + for (let newSliceIndex = 0; newSliceIndex < newSliceDataLength; newSliceIndex++) { + let newSliceSize = newSliceIndex * maxSize; + let number = Math.min(newSliceSize + maxSize, handleCurrentData.length); + let saveArray = handleCurrentData.slice(newSliceSize, number); + if (newSliceIndex === newSliceDataLength - 1 && number - newSliceSize < maxSize) { + currentChunk = new Uint8Array(maxSize); + currentChunkOffset = 0; + currentChunk.set(saveArray, currentChunkOffset); + currentChunkOffset += saveArray.length; + } else { + await addDataToIndexeddb(db, { + buf: saveArray, + id: `${fileType}_new_${timStamp}_${pageNum}_${saveIndex}`, + fileType: `${fileType}_new`, + pageNum: pageNum, + startOffset: saveStartOffset, + endOffset: saveStartOffset + maxSize, + index: saveIndex, + timStamp: timStamp, + }); + saveStartOffset += maxSize; + saveIndex++; + } + } + } else { + currentChunk.set(sliceData, currentChunkOffset); + currentChunkOffset += sliceDataLength; + } + } + startQueryIndex += 10; + endQueryIndex += 10; + } while (startQueryIndex <= endIndex && endQueryIndex <= endIndex); + } + } + } + if (currentChunkOffset !== 0) { + let freeArray = currentChunk.slice(0, currentChunkOffset); + await addDataToIndexeddb(db, { + buf: freeArray, + id: `${fileType}_new_${timStamp}_${pageNum}_${saveIndex}`, + fileType: `${fileType}_new`, + pageNum: pageNum, + startOffset: saveStartOffset, + endOffset: saveStartOffset + maxSize, + index: saveIndex, + timStamp: timStamp, + }); + saveStartOffset += maxSize; + saveIndex++; + } + } + } + } + self.postMessage({ + id: e.data.id, + action: e.data.action, + results: result, + }); + return; } }; +function indexedDataToBufferData(sourceData: any): Uint8Array { + let uintArrayLength = 0; + let uintDataList = sourceData.map((item: any) => { + let currentBufData = new Uint8Array(item.buf); + uintArrayLength += currentBufData.length; + return currentBufData; + }); + let resultUintArray = new Uint8Array(uintArrayLength); + let offset = 0; + uintDataList.forEach((currentArray: Uint8Array) => { + resultUintArray.set(currentArray, offset); + offset += currentArray.length; + }); + return resultUintArray; +} + +async function splitFileAndSave( + timStamp: number, + fileType: string, + startIndex: number, + endIndex: number, + fileSize: number, + db: IDBDatabase, + pageNum: number, + maxSize: number, + splitReqBufferAddr?: any +) { + let queryStartIndex = startIndex; + let queryEndIndex = startIndex; + let saveIndex = 0; + let saveStartOffset = 0; + let currentChunk = new Uint8Array(maxSize); + let currentChunkOffset = 0; + do { + queryEndIndex = queryStartIndex + 9; + if (queryEndIndex > endIndex) { + queryEndIndex = endIndex; + } + const transaction = db.transaction(STORE_NAME, 'readonly'); + const store = transaction.objectStore(STORE_NAME); + const index = store.index('QueryCompleteFile'); + let range = IDBKeyRange.bound([timStamp, fileType, 0, startIndex], [timStamp, fileType, 0, endIndex], false, false); + const getRequest = index.openCursor(range); + let res = await queryDataFromIndexeddb(getRequest); + queryStartIndex = queryEndIndex + 1; + let resultFileSize = 0; + for (let i = 0; i < res.length; i++) { + let arrayBuffer = res[i]; + let uint8Array = new Uint8Array(arrayBuffer.buf); + let cutFileSize = 0; + while (cutFileSize < uint8Array.length) { + const sliceLen = Math.min(uint8Array.length - cutFileSize, REQ_BUF_SIZE); + const dataSlice = uint8Array.subarray(cutFileSize, cutFileSize + sliceLen); + Module.HEAPU8.set(dataSlice, splitReqBufferAddr); + cutFileSize += sliceLen; + resultFileSize += sliceLen; + if (resultFileSize >= fileSize) { + Module._TraceStreamerLongTraceSplitFileEx(sliceLen, 1, pageNum); + } else { + Module._TraceStreamerLongTraceSplitFileEx(sliceLen, 0, pageNum); + } + if (arkTsDataSize > 0 && fileType === 'arkts') { + for (let arkTsAllDataIndex = 0; arkTsAllDataIndex < arkTsData.length; arkTsAllDataIndex++) { + let currentArkTsData = arkTsData[arkTsAllDataIndex]; + let freeSize = maxSize - currentChunkOffset; + if (currentArkTsData.length > freeSize) { + let freeSaveData = currentArkTsData.slice(0, freeSize); + currentChunk.set(freeSaveData, currentChunkOffset); + await addDataToIndexeddb(db, { + buf: currentChunk, + id: `${fileType}_new_${timStamp}_${pageNum}_${saveIndex}`, + fileType: `${fileType}_new`, + pageNum: pageNum, + startOffset: saveStartOffset, + endOffset: saveStartOffset + maxSize, + index: saveIndex, + timStamp: timStamp, + }); + saveStartOffset += maxSize; + saveIndex++; + let remnantData = currentArkTsData.slice(freeSize); + let remnantDataLength: number = Math.ceil(remnantData.length / maxSize); + for (let newSliceIndex = 0; newSliceIndex < remnantDataLength; newSliceIndex++) { + let newSliceSize = newSliceIndex * maxSize; + let number = Math.min(newSliceSize + maxSize, remnantData.length); + let saveArray = remnantData.slice(newSliceSize, number); + if (newSliceIndex === remnantDataLength - 1 && number - newSliceSize < maxSize) { + currentChunk = new Uint8Array(maxSize); + currentChunkOffset = 0; + currentChunk.set(saveArray, currentChunkOffset); + currentChunkOffset += saveArray.length; + } else { + await addDataToIndexeddb(db, { + buf: saveArray, + id: `${fileType}_new_${timStamp}_${pageNum}_${saveIndex}`, + fileType: `${fileType}_new`, + pageNum: pageNum, + startOffset: saveStartOffset, + endOffset: saveStartOffset + maxSize, + index: saveIndex, + timStamp: timStamp, + }); + saveStartOffset += maxSize; + saveIndex++; + } + } + } else { + currentChunk.set(currentArkTsData, currentChunkOffset); + currentChunkOffset += currentArkTsData.length; + } + } + } + } + } + } while (queryEndIndex < endIndex); + if (fileType === 'arkts' && currentChunkOffset > 0) { + let remnantArray = new Uint8Array(currentChunkOffset); + let remnantChunk = currentChunk.slice(0, currentChunkOffset); + remnantArray.set(remnantChunk, 0); + await addDataToIndexeddb(db, { + buf: remnantArray, + id: `${fileType}_new_${timStamp}_${pageNum}_${saveIndex}`, + fileType: `${fileType}_new`, + pageNum: pageNum, + startOffset: saveStartOffset, + endOffset: saveStartOffset + maxSize, + index: saveIndex, + timStamp: timStamp, + }); + arkTsDataSize = 0; + arkTsData.length = 0; + } +} + +enum DataTypeEnum { + data, + json, +} + let uploadSoActionId: string = ''; let uploadFileIndex: number = 0; let uploadSoCallbackFn: any; @@ -464,13 +867,13 @@ let splitReqBufferAddr = -1; enum FileTypeEnum { data, - json + json, } 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; + 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; @@ -487,7 +890,7 @@ function cutFileByRange(e: MessageEvent) { let cutRightTs = e.data.rightTs; let uint8Array = new Uint8Array(e.data.buffer); let resultBuffer: Array = []; - let cutFileCallBack = (heapPtr: number, size: number, fileType: number, isEnd:number) => { + let cutFileCallBack = (heapPtr: number, size: number, fileType: number, isEnd: number) => { let out: Uint8Array = Module.HEAPU8.slice(heapPtr, heapPtr + size); if (FileTypeEnum.data === fileType) { resultBuffer.push(out); @@ -511,7 +914,7 @@ function cutFileByRange(e: MessageEvent) { cutStatus: true, msg: 'split success', buffer: e.data.buffer, - cutBuffer: cutBuffer.buffer + cutBuffer: cutBuffer.buffer, }, // @ts-ignore [e.data.buffer, cutBuffer.buffer] @@ -564,11 +967,11 @@ function queryJSON(name: string, sql: string, params: any) { return convertJSON(); } -function query(name: string, sql: string, params: any) { +function query(name: string, sql: string, params: any): void { if (params) { Reflect.ownKeys(params).forEach((key: any) => { if (typeof params[key] === 'string') { - sql = sql.replace(new RegExp(`\\${key}`, 'g'), `'${ params[key] }'`); + sql = sql.replace(new RegExp(`\\${key}`, 'g'), `'${params[key]}'`); } else { sql = sql.replace(new RegExp(`\\${key}`, 'g'), params[key]); } @@ -584,7 +987,7 @@ function querySdk(name: string, sql: string, sdkParams: any, action: string) { if (sdkParams) { Reflect.ownKeys(sdkParams).forEach((key: any) => { if (typeof sdkParams[key] === 'string') { - sql = sql.replace(new RegExp(`\\${key}`, 'g'), `'${ sdkParams[key] }'`); + sql = sql.replace(new RegExp(`\\${key}`, 'g'), `'${sdkParams[key]}'`); } else { sql = sql.replace(new RegExp(`\\${key}`, 'g'), sdkParams[key]); } @@ -607,3 +1010,53 @@ function queryMetric(name: string): void { Module.HEAPU8.set(metricArray, reqBufferAddr); Module._TraceStreamerSqlMetricsQuery(metricArray.length); } + +const DB_NAME = 'sp'; +const DB_VERSION = 1; +const STORE_NAME = 'longTable'; + +function openDB(): Promise { + return new Promise((resolve, reject) => { + const openRequest = indexedDB.open(DB_NAME, DB_VERSION); + openRequest.onerror = () => reject(openRequest.error); + openRequest.onsuccess = () => { + resolve(openRequest.result); + }; + }); +} + +function queryDataFromIndexeddb(getRequest: IDBRequest): Promise { + return new Promise((resolve, reject) => { + let results: any[] = []; + getRequest.onerror = (event) => { + // @ts-ignore + reject(event.target.error); + }; + getRequest.onsuccess = (event) => { + // @ts-ignore + const cursor = event.target!.result; + if (cursor) { + results.push(cursor.value); + cursor['continue'](); + } else { + // @ts-ignore + resolve(results); + } + }; + }); +} + +function addDataToIndexeddb(db: IDBDatabase, value: any, key?: IDBValidKey) { + return new Promise((resolve, reject) => { + const transaction = db.transaction(STORE_NAME, 'readwrite'); + const objectStore = transaction.objectStore(STORE_NAME); + const request = objectStore.add(value, key); + request.onsuccess = function (event) { + // @ts-ignore + resolve(event.target.result); + }; + request.onerror = (event) => { + reject(event); + }; + }); +} diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorker.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorker.ts index 0600daf8cf81adc2c5d785a9d8f7f75525c44703..36f548bdff4fd8e7ef076e9e346d1c1210d50021 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorker.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorker.ts @@ -34,7 +34,7 @@ let logicWorker: any = { function match(req: any) { if (req.type === 'clear') { - Reflect.ownKeys(logicWorker).forEach(key => logicWorker[key].clearAll()); + Reflect.ownKeys(logicWorker).forEach((key) => logicWorker[key].clearAll()); DataCache.getInstance().clearAll(); return; } diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerCommon.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerCommon.ts index 0bec2bcd8406efde632c25fefcd6d69026a11c7e..f2e6fcd90323d3bceb9689a1337bc689d68d93d2 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerCommon.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerCommon.ts @@ -494,7 +494,7 @@ export function timeMsFormat2p(timeNs: number): string { commonResult += currentNs.toFixed(2) + 'ms'; return commonResult; } - if (commonResult == '') { + if (commonResult === '') { commonResult = '0s'; } return commonResult; diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts index ef473d1ede7526c1967a06fa77e44f20e3062dbb..582366a4f97a5ea0b4876ca6ba2761cac8c2ca5f 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts @@ -590,18 +590,18 @@ where s.end_ts between $startTime + t.start_ts and $endTime + t.start_ts ${sql} queryIOSamples(selectionParam: any) { let sql = ''; - const types : number[] = []; + const types: number[] = []; if (selectionParam.diskIOReadIds.length > 0) { - types.push(...[1,3]); + types.push(...[1, 3]); } if (selectionParam.diskIOWriteIds.length > 0) { - types.push(...[2,4]) + types.push(...[2, 4]); } if (selectionParam.diskIOipids.length > 0) { - types.push(...[5,6]) + types.push(...[5, 6]); sql += `and (s.ipid in (${selectionParam.diskIOipids.join(',')}) and s.type in (${types.join(',')})) `; } - + this.queryData( this.currentEventId, 'fileSystem-queryIoSamples', @@ -680,7 +680,7 @@ where s.end_ts between $startTime + t.start_ts and $endTime + t.start_ts ${sql} fileMerageBean.count = merageData.count; fileMerageBean.total = totalCount; fileMerageBean.tsArray = [...merageData.tsArray]; - fileMerageBean.durArray = [...merageData.durArray] + fileMerageBean.durArray = [...merageData.durArray]; rootMerageMap[merageData.pid] = fileMerageBean; } else { rootMerageMap[merageData.pid].children.push(merageData); @@ -723,9 +723,9 @@ where s.end_ts between $startTime + t.start_ts and $endTime + t.start_ts ${sql} let map: any = {}; if (this.currentDataType == 'fileSystem') { map = FILE_TYPE_MAP; - } else if (this.currentDataType == 'io') { + } else if (this.currentDataType === 'io') { map = DISKIO_TYPE_MAP; - } else if (this.currentDataType == 'virtualMemory') { + } else if (this.currentDataType === 'virtualMemory') { map = VM_TYPE_MAP; } // @ts-ignore diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerJsCpuProfiler.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerJsCpuProfiler.ts index aceb8a95c7e78695dd84e753308d74227c62a61b..f680e42b1404bd9b216c0d11b5030361701405da 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerJsCpuProfiler.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerJsCpuProfiler.ts @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { JsCpuProfilerChartFrame, JsCpuProfilerTabStruct, JsCpuProfilerUIStruct } from '../../bean/JsStruct.js'; -import { DataCache, JsProfilerSymbol, LogicHandler, convertJSON } from './ProcedureLogicWorkerCommon.js'; +import { JsCpuProfilerChartFrame, JsCpuProfilerTabStruct, type JsCpuProfilerUIStruct } from '../../bean/JsStruct.js'; +import { DataCache, type JsProfilerSymbol, LogicHandler, convertJSON } from './ProcedureLogicWorkerCommon.js'; const ROOT_ID = 1; const LAMBDA_FUNCTION_NAME = '(anonymous)'; @@ -127,7 +127,7 @@ export class ProcedureLogicWorkerJsCpuProfiler extends LogicHandler { chartData: Array, lastLayerData: Array, samplesIds: Array - ) { + ): number[] { for (const data of chartData) { if (data.isSelect && data.selfTime > 0 && !lastLayerData.includes(data)) { lastLayerData.push(data); @@ -329,7 +329,7 @@ export class ProcedureLogicWorkerJsCpuProfiler extends LogicHandler { private reverseChartFrameTree( chartTreeArray: Array, reverseTreeArray: Array - ) { + ): void { const that = this; function recursionTree(chartFrame: JsCpuProfilerChartFrame) { // isSelect为框选/点选范围内的函数,其他都不需要处理 diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.ts index 0d464d2eb816c6ccd355efa04558b6ebc348d7cb..5f59594b1090b48e402a8e739c0be4b1c4ac0f09 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.ts @@ -255,7 +255,7 @@ export class ProcedureLogicWorkerNativeMemory extends LogicHandler { ); } - queryNativeHookStatistic(type: number) { + queryNativeHookStatistic(type: number): void { let condition: string; if (type === 0) { condition = 'and type = 0'; @@ -277,7 +277,7 @@ where ts between start_ts and end_ts ${condition}; this.queryData(this.currentEventId, 'native-memory-queryNativeHookStatistic', sql, {}); } - queryNativeHookEvent(leftNs: number, rightNs: number, types: Array) { + queryNativeHookEvent(leftNs: number, rightNs: number, types: Array): void { let condition = types.length === 1 ? `and A.event_type = ${types[0]}` @@ -325,7 +325,7 @@ where ts between start_ts and end_ts ${condition}; this.queryData(this.currentEventId, 'native-memory-queryNativeHookEvent', sql, {}); } - supplementNativeHoodData() { + supplementNativeHoodData(): void { let len = this.boxRangeNativeHook.length; for (let i = 0, j = len - 1; i <= j; i++, j--) { this.fillNativeHook(this.boxRangeNativeHook[i], i); @@ -649,17 +649,17 @@ where ts between start_ts and end_ts ${condition}; } } - sortByNativeMemoryColumn(nmMemoryColumn: string, nmMemorySort: number, list: Array) { + sortByNativeMemoryColumn(nmMemoryColumn: string, nmMemorySort: number, list: Array): NativeMemory[] { if (nmMemorySort === 0) { return list; } else { return list.sort((memoryLeftData: any, memoryRightData: any) => { if (nmMemoryColumn === 'index' || nmMemoryColumn === 'startTs' || nmMemoryColumn === 'heapSize') { - return nmMemorySort == 1 + return nmMemorySort === 1 ? memoryLeftData[nmMemoryColumn] - memoryRightData[nmMemoryColumn] : memoryRightData[nmMemoryColumn] - memoryLeftData[nmMemoryColumn]; } else { - if (nmMemorySort == 1) { + if (nmMemorySort === 1) { if (memoryLeftData[nmMemoryColumn] > memoryRightData[nmMemoryColumn]) { return 1; } else if (memoryLeftData[nmMemoryColumn] === memoryRightData[nmMemoryColumn]) { @@ -670,7 +670,7 @@ where ts between start_ts and end_ts ${condition}; } else { if (memoryRightData[nmMemoryColumn] > memoryLeftData[nmMemoryColumn]) { return 1; - } else if (memoryLeftData[nmMemoryColumn] == memoryRightData[nmMemoryColumn]) { + } else if (memoryLeftData[nmMemoryColumn] === memoryRightData[nmMemoryColumn]) { return 0; } else { return -1; diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts index f9a9fcfdb68e0af41119d9bace5f32c0d3eab3d3..3b7fdc78a39121e9b846a0ef74783ef6309dd987 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts @@ -326,7 +326,7 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { return this.allProcess; } - addOtherCallchainsData(countSample: PerfCountSample, list: any[]) { + addOtherCallchainsData(countSample: PerfCountSample, list: any[]): void { let threadCallChain = new PerfCallChain(); //新增的线程数据 threadCallChain.tid = countSample.tid; threadCallChain.canCharge = false; @@ -334,7 +334,7 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { let threadStateCallChain = new PerfCallChain(); //新增的线程状态数据 threadStateCallChain.tid = countSample.tid; threadStateCallChain.name = countSample.threadState || 'Unknown State'; - threadStateCallChain.fileName = threadStateCallChain.name == '-' ? 'Unknown Thread State' : ''; + threadStateCallChain.fileName = threadStateCallChain.name === '-' ? 'Unknown Thread State' : ''; threadStateCallChain.canCharge = false; list.unshift(threadCallChain, threadStateCallChain); } @@ -351,7 +351,7 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { let topIndex = isTopDown ? 0 : perfCallChains.length - 1; if (perfCallChains.length > 0) { let perfRootNode = this.currentTreeMapData[perfCallChains[topIndex].name + perfSample.pid]; - if (perfRootNode == undefined) { + if (perfRootNode === undefined) { perfRootNode = new PerfCallChainMerageData(); this.currentTreeMapData[perfCallChains[topIndex].name + perfSample.pid] = perfRootNode; this.currentTreeList.push(perfRootNode); @@ -365,7 +365,7 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { let rootMerageMap: any = {}; // @ts-ignore Object.values(this.currentTreeMapData).forEach((merageData: any) => { - if (rootMerageMap[merageData.pid] == undefined) { + if (rootMerageMap[merageData.pid] === undefined) { let perfProcessMerageData = new PerfCallChainMerageData(); //新增进程的节点数据 perfProcessMerageData.canCharge = false; perfProcessMerageData.symbolName = @@ -394,12 +394,12 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { let id = 0; this.currentTreeList.forEach((perfTreeNode) => { perfTreeNode.total = totalSamplesCount; - if (perfTreeNode.id == '') { + if (perfTreeNode.id === '') { perfTreeNode.id = id + ''; id++; } if (perfTreeNode.parentNode) { - if (perfTreeNode.parentNode.id == '') { + if (perfTreeNode.parentNode.id === '') { perfTreeNode.parentNode.id = id + ''; id++; } @@ -609,7 +609,7 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { } hideNumMaxAndMin(startNum: number, endNum: string) { - let max = endNum == '∞' ? Number.POSITIVE_INFINITY : parseInt(endNum); + let max = endNum === '∞' ? Number.POSITIVE_INFINITY : parseInt(endNum); this.allProcess.forEach((item) => { item.children = []; this.recursionChargeByRule(item, numRuleName, (node) => { @@ -768,7 +768,7 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { return this.dataSource; } - combineCallChainForAnalysis() { + combineCallChainForAnalysis(): PerfAnalysisSample[] { let sampleCallChainList = new Array(); for (let sample of this.samplesData) { let callChains = [...this.callChainData[sample.sampleId]]; @@ -796,7 +796,7 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { return sampleCallChainList; } - getBottomUp() { + getBottomUp(): PerfBottomUpStruct[] { const topUp = new PerfBottomUpStruct('topUp'); let perfTime = this.dataCache.perfCountToMs; for (let sample of this.samplesData) { @@ -1048,7 +1048,7 @@ export class PerfCallChainMerageData extends ChartStruct { } static merageCallChain(currentNode: PerfCallChainMerageData, callChain: PerfCallChain, isTopDown: boolean) { - if (currentNode.symbolName == '') { + if (currentNode.symbolName === '') { currentNode.symbol = `${callChain.name} ${callChain.fileName ? `(${callChain.fileName})` : ''}`; currentNode.symbolName = callChain.name; currentNode.pid = callChain.pid; @@ -1062,7 +1062,7 @@ export class PerfCallChainMerageData extends ChartStruct { currentNode.path = callChain.path; } } - if (callChain[isTopDown ? 'nextNode' : 'previousNode'] == undefined) { + if (callChain[isTopDown ? 'nextNode' : 'previousNode'] === undefined) { currentNode.selfDur += callChain.count; currentNode.self = timeMsFormat2p(currentNode.selfDur * (DataCache.getInstance().perfCountToMs || 1)); } @@ -1076,7 +1076,7 @@ export class PerfCallChainMerageData extends ChartStruct { sample: PerfCountSample, isEnd: boolean ) { - if (currentNode.symbolName == '') { + if (currentNode.symbolName === '') { currentNode.symbol = `${callChain.name} ${callChain.fileName ? `(${callChain.fileName})` : ''}`; currentNode.symbolName = callChain.name; currentNode.pid = sample.pid; @@ -1170,7 +1170,7 @@ export function timeMsFormat2p(ns: number) { perfResult += currentNs.toFixed(2) + 'ms'; return perfResult; } - if (perfResult == '') { + if (perfResult === '') { perfResult = '0s'; } return perfResult; diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerSchedulingAnalysis.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerSchedulingAnalysis.ts index 383bd7858fc7f7c243b5972678b3c4bde3b1f1b1..c624534fd1850bf82a6807cd7339526b696d2f95 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerSchedulingAnalysis.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerSchedulingAnalysis.ts @@ -558,9 +558,9 @@ where cpu not null block: '', ts: 0, dur: ca.ts, - }) + }); } - cpuArr.push(ca) + cpuArr.push(ca); map.set(ca.cpu, cpuArr); } } @@ -654,7 +654,10 @@ where cpu not null handlerFreqThreadData(arr: FreqThread[]) { let cpuFreqArr: CpuMeasure[] = (this.cpuFreqMap.get(this.cpu) || []).filter((it) => it.value === this.freq); - let map: Map = new Map(); + let map: Map< + number, + { tid: number; tName: string; pid: number; pName: string; dur: number; durStr: string; ratio: string } + > = new Map(); let sumFreqDur = 0; cpuFreqArr.map((it) => { sumFreqDur += it.dur; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerAppStartup.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerAppStartup.ts index e6adb94806ce62004bb66745ad17b0e18b4eee02..177ddcfe952c703c5a542535d832dcbe65585532 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerAppStartup.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerAppStartup.ts @@ -13,10 +13,7 @@ * limitations under the License. */ -import { - BaseStruct, - dataFilterHandler, drawString, -} from './ProcedureWorkerCommon.js'; +import { BaseStruct, dataFilterHandler, drawString } from './ProcedureWorkerCommon.js'; import { TraceRow } from '../../component/trace/base/TraceRow.js'; import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; @@ -47,7 +44,9 @@ export class AppStartupRender { for (let re of filter) { AppStartupStruct.draw(req.appStartupContext, re); if (appStartUpRow.isHover) { - if (re.frame && appStartUpRow.hoverX >= re.frame.x - offset && + if ( + re.frame && + appStartUpRow.hoverX >= re.frame.x - offset && appStartUpRow.hoverX <= re.frame.x + re.frame.width + offset ) { AppStartupStruct.hoverStartupStruct = re; @@ -72,7 +71,7 @@ export class AppStartupStruct extends BaseStruct { 'UI Ability Launching', 'UI Ability OnForeground', 'First Frame - APP Phase', - 'First Frame - Render Phase' + 'First Frame - Render Phase', ]; dur: number | undefined; value: string | undefined; @@ -94,21 +93,17 @@ export class AppStartupStruct extends BaseStruct { ctx.textBaseline = 'middle'; ctx.lineWidth = 1; if (data.stepName === undefined) { - data.stepName = `${ AppStartupStruct.getStartupName(data.startName) } (${ (data.dur! / 1000000).toFixed(2) }ms)`; + data.stepName = `${AppStartupStruct.getStartupName(data.startName)} (${(data.dur! / 1000000).toFixed(2)}ms)`; } - let textColor = ColorUtils.FUNC_COLOR[ColorUtils.hashFunc(data.stepName || '', 0, ColorUtils.FUNC_COLOR.length)]; + let textColor = + ColorUtils.FUNC_COLOR[ColorUtils.hashFunc(data.stepName || '', 0, ColorUtils.FUNC_COLOR.length)]; ctx.fillStyle = ColorUtils.funcTextColor(textColor); drawString(ctx, data.stepName, 2, data.frame, data); } if (data === AppStartupStruct.selectStartupStruct) { ctx.strokeStyle = '#232c5d'; ctx.lineWidth = 2; - ctx.strokeRect( - data.frame.x, - data.frame.y, - data.frame.width, - data.frame.height - ); + ctx.strokeRect(data.frame.x, data.frame.y, data.frame.width, data.frame.height); } } } @@ -120,5 +115,4 @@ export class AppStartupStruct extends BaseStruct { return AppStartupStruct.StartUpStep[step]; } } - } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerCPU.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerCPU.ts index ed5d605485d3ff19d227fc63837a181a86d23e41..cc09e7bf2a0a1a662756232569d9a6321cd562c9 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerCPU.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerCPU.ts @@ -114,13 +114,11 @@ export class CpuRender { TraceRow.range!.endNS, TraceRow.range!.totalNS, row.frame, - req.type == `cpu-data-${SpSystemTrace.wakeupList[i]?.cpu || 0}` - ? SpSystemTrace.wakeupList[i] - : undefined, + req.type == `cpu-data-${SpSystemTrace.wakeupList[i]?.cpu || 0}` ? SpSystemTrace.wakeupList[i] : undefined, currentCpu, true ); - }; + } } render(cpuReq: RequestMessage, list: Array, filter: Array, translateY: number) { diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerClock.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerClock.ts index fc7d9cb1282e526fcbc391160965fe4609614e30..734274b33807a7fd0d37e3fd1beee2add9fb0a28 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerClock.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerClock.ts @@ -103,7 +103,7 @@ export class ClockStruct extends BaseStruct { } else { clockContext.lineWidth = 1; clockContext.globalAlpha = 1.0; - clockContext.strokeRect(data.frame.x, data.frame.y + data.frame.height - drawHeight, width, drawHeight) + clockContext.strokeRect(data.frame.x, data.frame.y + data.frame.height - drawHeight, width, drawHeight); clockContext.globalAlpha = 0.6; clockContext.fillRect(data.frame.x, data.frame.y + data.frame.height - drawHeight, width, drawHeight); } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts index 1611d4eb6e18d102c10d654e2dfb75334cd2a55b..7b70000303e87bbf5f894c8312050fdc8f91dc3d 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts @@ -13,10 +13,10 @@ * limitations under the License. */ -import {CpuStruct, WakeupBean} from './ProcedureWorkerCPU.js'; -import {TraceRow} from '../../component/trace/base/TraceRow.js'; -import {TimerShaftElement} from '../../component/trace/TimerShaftElement'; -import {Flag} from '../../component/trace/timer-shaft/Flag.js'; +import { CpuStruct, WakeupBean } from './ProcedureWorkerCPU.js'; +import { TraceRow } from '../../component/trace/base/TraceRow.js'; +import { TimerShaftElement } from '../../component/trace/TimerShaftElement'; +import { Flag } from '../../component/trace/timer-shaft/Flag.js'; export abstract class Render { abstract renderMainThread(req: any, row: TraceRow): void; @@ -103,11 +103,26 @@ export function ns2Timestamp(ns: number): string { .padStart(3, '0')}:${nanosecond.toString().padStart(3, '0')}`; } -export function isFrameContainPoint(frame: Rect, x: number, y: number): boolean { - return x >= frame.x && x <= frame.x + frame.width && y >= frame.y && y <= frame.y + frame.height; +const offsetX = 5; + +export function isFrameContainPoint(frame: Rect, x: number, y: number, strict: boolean = true, offset: boolean = false): boolean { + if (strict) { + if (offset) { + return x >= frame.x - offsetX && x <= frame.x + frame.width + offsetX && y >= frame.y && y <= frame.y + frame.height; + } else { + return x >= frame.x && x <= frame.x + frame.width && y >= frame.y && y <= frame.y + frame.height; + } + } else { + if (offset) { + return x >= frame.x - offsetX && x <= frame.x + frame.width + offsetX; + } else { + return x >= frame.x && x <= frame.x + frame.width; + } + } } + export const isSurroundingPoint = function (pointX: number, currentRect: Rect, unitPointXRange: number): boolean { - return (pointX >= currentRect?.x - unitPointXRange) && pointX <= currentRect?.x + unitPointXRange; + return pointX >= currentRect?.x - unitPointXRange && pointX <= currentRect?.x + unitPointXRange; }; export const computeUnitWidth = function ( @@ -170,62 +185,62 @@ export function fillCacheData(filterList: Array, condition: FilterConfig): } export function fillCacheDataIdx(filterData: Array, slice: number[], condition: FilterConfig): boolean { - if (condition.useCache && filterData.length > 0) { - let pns = (condition.endNS - condition.startNS) / condition.frame.width; - let y = condition.frame.y + condition.paddingTop; - let height = condition.frame.height - condition.paddingTop * 2; - for (let i = slice[0]; i <= slice[1]; i++) { - let it = filterData[i]; - if (!it) continue; - if ( - (it[condition.startKey] || 0) + (it[condition.durKey] || 0) > condition.startNS && - (it[condition.startKey] || 0) < condition.endNS - ) { - if (!filterData[i].frame) { - filterData[i].frame = {}; - filterData[i].frame.y = y; - filterData[i].frame.height = height; - } - setNodeFrame( - filterData[i], - pns, - condition.startNS, - condition.endNS, - condition.frame, - condition.startKey, - condition.durKey - ); - } else { - filterData[i].frame = null; - } + if (condition.useCache && filterData.length > 0) { + let pns = (condition.endNS - condition.startNS) / condition.frame.width; + let y = condition.frame.y + condition.paddingTop; + let height = condition.frame.height - condition.paddingTop * 2; + for (let i = slice[0]; i <= slice[1]; i++) { + let it = filterData[i]; + if (!it) continue; + if ( + (it[condition.startKey] || 0) + (it[condition.durKey] || 0) > condition.startNS && + (it[condition.startKey] || 0) < condition.endNS + ) { + if (!filterData[i].frame) { + filterData[i].frame = {}; + filterData[i].frame.y = y; + filterData[i].frame.height = height; } - return true; + setNodeFrame( + filterData[i], + pns, + condition.startNS, + condition.endNS, + condition.frame, + condition.startKey, + condition.durKey + ); + } else { + filterData[i].frame = null; + } } - return false; + return true; + } + return false; } export function bsearch(haystack: ArrayLike, needle: any): number { - return searchImpl(haystack, needle, 0, haystack.length); + return searchImpl(haystack, needle, 0, haystack.length); } function searchImpl(stack: ArrayLike, cfg: FilterConfig, i: number, j: number): number { - if (i === j) return -1; - if (i + 1 === j) { - return (cfg.endNS >= stack[i][cfg.startKey]) ? i : -1; - } - const middle = Math.floor((j - i) / 2) + i; - const middleValue = stack[middle][cfg.startKey]; - if (cfg.endNS < middleValue) { - return searchImpl(stack, cfg, i, middle); - } else { - return searchImpl(stack, cfg, middle, j); - } + if (i === j) return -1; + if (i + 1 === j) { + return cfg.endNS >= stack[i][cfg.startKey] ? i : -1; + } + const middle = Math.floor((j - i) / 2) + i; + const middleValue = stack[middle][cfg.startKey]; + if (cfg.endNS < middleValue) { + return searchImpl(stack, cfg, i, middle); + } else { + return searchImpl(stack, cfg, middle, j); + } } export function findRangeIdx(fullData: Array, condition: FilterConfig): number[] { - let a = fullData.findIndex(it => it[condition.startKey] + it[condition.durKey] >= condition.startNS); - let b = bsearch(fullData, condition); - return [a, b + 1]; + let a = fullData.findIndex((it) => it[condition.startKey] + it[condition.durKey] >= condition.startNS); + let b = bsearch(fullData, condition); + return [a, b + 1]; } export function findRange(fullData: Array, condition: FilterConfig): Array { @@ -556,7 +571,13 @@ export function drawFlagLine( } } -export function drawFlagLineSegment(ctx: any, hoverFlag: any, selectFlag: any, frame: any, tse: TimerShaftElement) { +export function drawFlagLineSegment( + ctx: any, + hoverFlag: any, + selectFlag: any, + frame: any, + tse: TimerShaftElement +): void { if (ctx) { if (hoverFlag) { ctx.beginPath(); @@ -588,8 +609,20 @@ export function drawFlagLineSegment(ctx: any, hoverFlag: any, selectFlag: any, f ctx.beginPath(); ctx.lineWidth = 1; ctx.strokeStyle = slicesTime.color || '#dadada'; - let x1 = ns2x(slicesTime.startTime, TraceRow.range!.startNS, TraceRow.range!.endNS, TraceRow.range!.totalNS, frame); - let x2 = ns2x(slicesTime.endTime, TraceRow.range!.startNS, TraceRow.range!.endNS, TraceRow.range!.totalNS, frame); + let x1 = ns2x( + slicesTime.startTime, + TraceRow.range!.startNS, + TraceRow.range!.endNS, + TraceRow.range!.totalNS, + frame + ); + let x2 = ns2x( + slicesTime.endTime, + TraceRow.range!.startNS, + TraceRow.range!.endNS, + TraceRow.range!.totalNS, + frame + ); // 划线逻辑 ctx.moveTo(Math.floor(x1), 0); ctx.lineTo(Math.floor(x1), frame.height); //左边的线 @@ -785,8 +818,24 @@ export function drawLinkLines( let maxWidth = tm.getBoundingClientRect().width - 268; for (let i = 0; i < nodes.length; i++) { let it = nodes[i]; - let newFirstNode = new PairPoint(it[0].rowEL, it[0].x, it[0].y, it[0].ns, it[0].offsetY, it[0].isRight, it[0].business); - let newSecondNode = new PairPoint(it[1].rowEL, it[0].x, it[1].y, it[1].ns, it[1].offsetY, it[1].isRight, it[1].business); + let newFirstNode = new PairPoint( + it[0].rowEL, + it[0].x, + it[0].y, + it[0].ns, + it[0].offsetY, + it[0].isRight, + it[0].business + ); + let newSecondNode = new PairPoint( + it[1].rowEL, + it[0].x, + it[1].y, + it[1].ns, + it[1].offsetY, + it[1].isRight, + it[1].business + ); if (it[0].hidden) { continue; } @@ -912,7 +961,7 @@ function drawBezierCurve(it: PairPoint[], maxWidth: number, context: CanvasRende } } -function drawBrokenLine(it: PairPoint[], maxWidth: number, context: CanvasRenderingContext2D) { +function drawBrokenLine(it: PairPoint[], maxWidth: number, context: CanvasRenderingContext2D): void { let brokenLineStart = it[0].x > it[1].x ? it[1] : it[0]; let brokenLineEnd = it[0].x > it[1].x ? it[0] : it[1]; if (brokenLineStart && brokenLineEnd) { @@ -1070,7 +1119,7 @@ export function hiPerf( frame: any, groupBy10MS: boolean, use: boolean -) { +): void { if (use && res.length > 0) { let pns = (endNS - startNS) / frame.width; let y = frame.y; @@ -1302,12 +1351,10 @@ export function drawWakeUpList( frame: Rect, wakeup: WakeupBean | undefined = undefined, currentCpu: number | undefined | null = undefined, - noVerticalLine = false, + noVerticalLine = false ) { if (wake) { - let x1 = Math.floor( - ns2x(wake.wakeupTime || 0, startNS, endNS, totalNS, frame) - ); + let x1 = Math.floor(ns2x(wake.wakeupTime || 0, startNS, endNS, totalNS, frame)); wakeUpListContext.beginPath(); wakeUpListContext.lineWidth = 2; wakeUpListContext.fillStyle = '#000000'; @@ -1327,24 +1374,14 @@ export function drawWakeUpList( } } if (wakeup) { - let x2 = Math.floor( - ns2x( - wakeup.ts || 0, - startNS, - endNS, - totalNS, - frame - ) - ); + let x2 = Math.floor(ns2x(wakeup.ts || 0, startNS, endNS, totalNS, frame)); let y = frame.y + frame.height - 10; wakeUpListContext.moveTo(x1, y); wakeUpListContext.lineTo(x2, y); wakeUpListContext.moveTo(x2, y - 25); wakeUpListContext.lineTo(x2, y + 5); - let s = ns2s( - (wakeup.ts || 0) - (wake.wakeupTime || 0) - ); + let s = ns2s((wakeup.ts || 0) - (wake.wakeupTime || 0)); let wakeUpListDistance = x2 - x1; if (wakeUpListDistance > 12) { wakeUpListContext.moveTo(x1, y); @@ -1356,18 +1393,11 @@ export function drawWakeUpList( wakeUpListContext.moveTo(x2, y); wakeUpListContext.lineTo(x2 - 6, y + 3); let measure = wakeUpListContext.measureText(s); - let tHeight = - measure.actualBoundingBoxAscent + - measure.actualBoundingBoxDescent; + let tHeight = measure.actualBoundingBoxAscent + measure.actualBoundingBoxDescent; let xStart = x1 + Math.floor(wakeUpListDistance / 2 - measure.width / 2); if (wakeUpListDistance > measure.width + 4) { wakeUpListContext.fillStyle = '#ffffff'; - wakeUpListContext.fillRect( - xStart - 2, - y - 4 - tHeight, - measure.width + 4, - tHeight + 4 - ); + wakeUpListContext.fillRect(xStart - 2, y - 4 - tHeight, measure.width + 4, tHeight + 4); wakeUpListContext.font = '10px solid'; wakeUpListContext.fillStyle = '#000000'; wakeUpListContext.textBaseline = 'bottom'; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerCpuAbility.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerCpuAbility.ts index 8b38550b8f8db14a12ff27cfa92d42d4e74c6b12..71d2c66f0debe1b075b4d9a5b78ce947a9aaf540 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerCpuAbility.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerCpuAbility.ts @@ -52,7 +52,9 @@ export class CpuAbilityRender extends Render { req.context.beginPath(); for (let re of cpuAbilityFilter) { CpuAbilityMonitorStruct.draw(req.context, re, req.maxCpuUtilization, cpuAbilityRow.isHover); - if (cpuAbilityRow.isHover && re.frame && + if ( + cpuAbilityRow.isHover && + re.frame && isFrameContainPoint(re.frame, cpuAbilityRow.hoverX, cpuAbilityRow.hoverY) ) { CpuAbilityMonitorStruct.hoverCpuAbilityStruct = re; @@ -89,7 +91,14 @@ export function cpuAbility( for (let index = 0; index < cpuAbilityFilters.length; index++) { let item = cpuAbilityFilters[index]; if ((item.startNS || 0) + (item.dur || 0) > (startNS || 0) && (item.startNS || 0) < (endNS || 0)) { - CpuAbilityMonitorStruct.setCpuAbilityFrame(cpuAbilityFilters[index], 5, startNS || 0, endNS || 0, totalNS || 0, frame); + CpuAbilityMonitorStruct.setCpuAbilityFrame( + cpuAbilityFilters[index], + 5, + startNS || 0, + endNS || 0, + totalNS || 0, + frame + ); } else { cpuAbilityFilters[index].frame = null; } @@ -152,7 +161,9 @@ export class CpuAbilityMonitorStruct extends BaseStruct { if (cpuAbilityData.startNS === CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.startNS && isHover) { cpuAbilityContext2D.lineWidth = 1; cpuAbilityContext2D.globalAlpha = 0.6; - let drawHeight: number = Math.floor(((cpuAbilityData.value || 0) * (cpuAbilityData.frame.height || 0) * 1.0) / maxCpuUtilization); + let drawHeight: number = Math.floor( + ((cpuAbilityData.value || 0) * (cpuAbilityData.frame.height || 0) * 1.0) / maxCpuUtilization + ); cpuAbilityContext2D.fillRect( cpuAbilityData.frame.x, cpuAbilityData.frame.y + cpuAbilityData.frame.height - drawHeight + 4, @@ -172,14 +183,22 @@ export class CpuAbilityMonitorStruct extends BaseStruct { cpuAbilityContext2D.globalAlpha = 1.0; cpuAbilityContext2D.stroke(); cpuAbilityContext2D.beginPath(); - cpuAbilityContext2D.moveTo(cpuAbilityData.frame.x + 3, cpuAbilityData.frame.y + cpuAbilityData.frame.height - drawHeight + 4); + cpuAbilityContext2D.moveTo( + cpuAbilityData.frame.x + 3, + cpuAbilityData.frame.y + cpuAbilityData.frame.height - drawHeight + 4 + ); cpuAbilityContext2D.lineWidth = 3; - cpuAbilityContext2D.lineTo(cpuAbilityData.frame.x + width, cpuAbilityData.frame.y + cpuAbilityData.frame.height - drawHeight + 4); + cpuAbilityContext2D.lineTo( + cpuAbilityData.frame.x + width, + cpuAbilityData.frame.y + cpuAbilityData.frame.height - drawHeight + 4 + ); cpuAbilityContext2D.stroke(); } else { cpuAbilityContext2D.globalAlpha = 0.6; cpuAbilityContext2D.lineWidth = 1; - let drawHeight: number = Math.floor(((cpuAbilityData.value || 0) * (cpuAbilityData.frame.height || 0)) / maxCpuUtilization); + let drawHeight: number = Math.floor( + ((cpuAbilityData.value || 0) * (cpuAbilityData.frame.height || 0)) / maxCpuUtilization + ); cpuAbilityContext2D.fillRect( cpuAbilityData.frame.x, cpuAbilityData.frame.y + cpuAbilityData.frame.height - drawHeight + 4, diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerCpuProfiler.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerCpuProfiler.ts index 0a8c1f3b0bcf7be1378a61329633c1d11739269d..deeddbfed01788a1d8b9cf9c7ad748cd19fab944 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerCpuProfiler.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerCpuProfiler.ts @@ -13,10 +13,10 @@ * limitations under the License. */ -import { BaseStruct, Rect, Render, drawString, isFrameContainPoint, ns2x } from './ProcedureWorkerCommon.js'; +import { BaseStruct, type Rect, Render, drawString, isFrameContainPoint, ns2x } from './ProcedureWorkerCommon.js'; import { TraceRow } from '../../component/trace/base/TraceRow.js'; import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; -import { JsCpuProfilerChartFrame } from '../../bean/JsStruct.js'; +import { type JsCpuProfilerChartFrame } from '../../bean/JsStruct.js'; export class JsCpuProfilerRender extends Render { renderMainThread( @@ -26,7 +26,7 @@ export class JsCpuProfilerRender extends Render { type: string; }, jsCpuProfilerRow: TraceRow - ) { + ): void { let list = jsCpuProfilerRow.dataList; let filter = jsCpuProfilerRow.dataListCache; jsCpuProfiler( @@ -44,9 +44,9 @@ export class JsCpuProfilerRender extends Render { JsCpuProfilerStruct.draw(req.context, re); if (jsCpuProfilerRow.isHover) { if ( - re.endTime - re.startTime == 0 || + re.endTime - re.startTime === 0 || re.endTime - re.startTime == null || - re.endTime - re.startTime == undefined + re.endTime - re.startTime === undefined ) { if ( re.frame && @@ -66,7 +66,9 @@ export class JsCpuProfilerRender extends Render { } } } - if (!jsCpuProfilerFind && jsCpuProfilerRow.isHover) JsCpuProfilerStruct.hoverJsCpuProfilerStruct = undefined; + if (!jsCpuProfilerFind && jsCpuProfilerRow.isHover) { + JsCpuProfilerStruct.hoverJsCpuProfilerStruct = undefined; + } req.context.closePath(); } } @@ -78,7 +80,7 @@ export function jsCpuProfiler( totalNS: number, frame: Rect, use: boolean -) { +): void { if (use && filter.length > 0) { for (let i = 0, len = filter.length; i < len; i++) { if ((filter[i].startTime || 0) + (filter[i].totalTime || 0) >= startNS && (filter[i].startTime || 0) <= endNS) { @@ -125,7 +127,13 @@ export class JsCpuProfilerStruct extends BaseStruct { children!: Array; isSelect: boolean = false; - static setJsCpuProfilerFrame(jsCpuProfilerNode: any, startNS: number, endNS: number, totalNS: number, frame: Rect) { + static setJsCpuProfilerFrame( + jsCpuProfilerNode: any, + startNS: number, + endNS: number, + totalNS: number, + frame: Rect + ): void { let x1: number, x2: number; if ((jsCpuProfilerNode.startTime || 0) > startNS && (jsCpuProfilerNode.startTime || 0) < endNS) { x1 = ns2x(jsCpuProfilerNode.startTime || 0, startNS, endNS, totalNS, frame); @@ -156,9 +164,9 @@ export class JsCpuProfilerStruct extends BaseStruct { jsCpuProfilerNode.frame.height = 20; } - static draw(jsCpuProfilerCtx: CanvasRenderingContext2D, data: JsCpuProfilerStruct) { + static draw(jsCpuProfilerCtx: CanvasRenderingContext2D, data: JsCpuProfilerStruct): void { if (data.frame) { - if (data.endTime - data.startTime == undefined || data.endTime - data.startTime == null) { + if (data.endTime - data.startTime === undefined || data.endTime - data.startTime === null) { } else { jsCpuProfilerCtx.globalAlpha = 1; if (data.name === '(program)') { @@ -170,7 +178,7 @@ export class JsCpuProfilerStruct extends BaseStruct { ColorUtils.FUNC_COLOR[ColorUtils.hashFunc(data.name || '', 0, ColorUtils.FUNC_COLOR.length)]; } let miniHeight = 20; - if (JsCpuProfilerStruct.hoverJsCpuProfilerStruct && data == JsCpuProfilerStruct.hoverJsCpuProfilerStruct) { + if (JsCpuProfilerStruct.hoverJsCpuProfilerStruct && data === JsCpuProfilerStruct.hoverJsCpuProfilerStruct) { jsCpuProfilerCtx.globalAlpha = 0.7; } jsCpuProfilerCtx.fillRect(data.frame.x, data.frame.y, data.frame.width, miniHeight - padding * 2); diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts index c3b650ffc01409a419132a4402d0797205c51997..f8987b41e3ab4596a8db511e75923a2aeb303fae 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts @@ -55,7 +55,9 @@ export class DiskIoAbilityRender extends Render { let find = false; for (let re of diskIoFilter) { DiskAbilityMonitorStruct.draw(req.context, re, req.maxDiskRate, diskIoAbilityRow.isHover); - if (diskIoAbilityRow.isHover && re.frame && + if ( + diskIoAbilityRow.isHover && + re.frame && isFrameContainPoint(re.frame, diskIoAbilityRow.hoverX, diskIoAbilityRow.hoverY) ) { DiskAbilityMonitorStruct.hoverDiskAbilityStruct = re; @@ -255,7 +257,9 @@ export class DiskAbilityMonitorStruct extends BaseStruct { if (diskIoAbilityData.startNS === DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.startNS && isHover) { diskIoAbilityContext.lineWidth = 1; diskIoAbilityContext.globalAlpha = 0.6; - let drawHeight: number = Math.floor(((diskIoAbilityData.value || 0) * (diskIoAbilityData.frame.height || 0) * 1.0) / maxDiskRate); + let drawHeight: number = Math.floor( + ((diskIoAbilityData.value || 0) * (diskIoAbilityData.frame.height || 0) * 1.0) / maxDiskRate + ); diskIoAbilityContext.fillRect( diskIoAbilityData.frame.x, diskIoAbilityData.frame.y + diskIoAbilityData.frame.height - drawHeight + 4, @@ -275,14 +279,22 @@ export class DiskAbilityMonitorStruct extends BaseStruct { diskIoAbilityContext.globalAlpha = 1.0; diskIoAbilityContext.stroke(); diskIoAbilityContext.beginPath(); - diskIoAbilityContext.moveTo(diskIoAbilityData.frame.x + 3, diskIoAbilityData.frame.y + diskIoAbilityData.frame.height - drawHeight + 4); + diskIoAbilityContext.moveTo( + diskIoAbilityData.frame.x + 3, + diskIoAbilityData.frame.y + diskIoAbilityData.frame.height - drawHeight + 4 + ); diskIoAbilityContext.lineWidth = 3; - diskIoAbilityContext.lineTo(diskIoAbilityData.frame.x + width, diskIoAbilityData.frame.y + diskIoAbilityData.frame.height - drawHeight + 4); + diskIoAbilityContext.lineTo( + diskIoAbilityData.frame.x + width, + diskIoAbilityData.frame.y + diskIoAbilityData.frame.height - drawHeight + 4 + ); diskIoAbilityContext.stroke(); } else { diskIoAbilityContext.globalAlpha = 0.6; diskIoAbilityContext.lineWidth = 1; - let drawHeight: number = Math.floor(((diskIoAbilityData.value || 0) * (diskIoAbilityData.frame.height || 0)) / maxDiskRate); + let drawHeight: number = Math.floor( + ((diskIoAbilityData.value || 0) * (diskIoAbilityData.frame.height || 0)) / maxDiskRate + ); diskIoAbilityContext.fillRect( diskIoAbilityData.frame.x, diskIoAbilityData.frame.y + diskIoAbilityData.frame.height - drawHeight + 4, diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerEnergySystem.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerEnergySystem.ts index ffe72d25f1b7f97f698cbbf1eeb90c39643735f2..5867740b323531de245bf9b5d650b6876d131779 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerEnergySystem.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerEnergySystem.ts @@ -55,23 +55,23 @@ export class EnergySystemRender extends Render { EnergySystemStruct.draw(req.context, energySysStruct); if (row.isHover && energySysStruct.frame && isFrameContainPoint(energySysStruct.frame, row.hoverX, row.hoverY)) { EnergySystemStruct.hoverEnergySystemStruct = energySysStruct; - if (energySysStruct.type == 0) { - if (energySysStruct.count != undefined) { + if (energySysStruct.type === 0) { + if (energySysStruct.count !== undefined) { energySystemData.workScheduler = energySysStruct.count; } else { energySystemData.workScheduler = '0'; } } - if (energySysStruct.type == 1) { - if (energySysStruct.count != undefined) { + if (energySysStruct.type === 1) { + if (energySysStruct.count !== undefined) { energySystemData.power = energySysStruct.count + ''; } else { energySystemData.power = '0'; } } - if (energySysStruct.type == 2) { - if (energySysStruct.count != undefined) { + if (energySysStruct.type === 2) { + if (energySysStruct.count !== undefined) { energySystemData.location = energySysStruct.count + ''; } else { energySystemData.location = '0'; @@ -82,9 +82,12 @@ export class EnergySystemRender extends Render { } if (!find && row.isHover) EnergySystemStruct.hoverEnergySystemStruct = undefined; if (EnergySystemStruct.hoverEnergySystemStruct) { - EnergySystemStruct.hoverEnergySystemStruct!.workScheduler = energySystemData.workScheduler == undefined ? '0' : energySystemData.workScheduler; - EnergySystemStruct.hoverEnergySystemStruct!.power = energySystemData.power == undefined ? '0' : energySystemData.power; - EnergySystemStruct.hoverEnergySystemStruct!.location = energySystemData.location == undefined ? '0' : energySystemData.location; + EnergySystemStruct.hoverEnergySystemStruct!.workScheduler = + energySystemData.workScheduler === undefined ? '0' : energySystemData.workScheduler; + EnergySystemStruct.hoverEnergySystemStruct!.power = + energySystemData.power === undefined ? '0' : energySystemData.power; + EnergySystemStruct.hoverEnergySystemStruct!.location = + energySystemData.location === undefined ? '0' : energySystemData.location; } let spApplication = document.getElementsByTagName('sp-application')[0]; let isDark = spApplication.hasAttribute('dark'); @@ -152,23 +155,23 @@ export class EnergySystemRender extends Render { energySysRequest.hoverX <= filterElement.frame.x + filterElement.frame.width ) { EnergySystemStruct.hoverEnergySystemStruct = filterElement; - if (filterElement.type == 0) { - if (filterElement.count != undefined) { + if (filterElement.type === 0) { + if (filterElement.count !== undefined) { a.workScheduler = filterElement.count; } else { a.workScheduler = '0'; } } - if (filterElement.type == 1) { - if (filterElement.count != undefined) { + if (filterElement.type === 1) { + if (filterElement.count !== undefined) { a.power = filterElement.count + ''; } else { a.power = '0'; } } - if (filterElement.type == 2) { - if (filterElement.count != undefined) { + if (filterElement.type === 2) { + if (filterElement.count !== undefined) { a.location = filterElement.count + ''; } else { a.location = '0'; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerFileSystem.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerFileSystem.ts index a4374793f8259ed0e2ce3dfe1378a4ba475d07a2..1cf4f75e20e6c2e4db1e5f12cc7f4d2d6681cfa4 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerFileSystem.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerFileSystem.ts @@ -39,8 +39,9 @@ export class FileSystemRender extends PerfRender { let groupBy10MS = (TraceRow.range?.scale || 50) > 40_000_000; let isDiskIO: boolean = req.type.includes('disk-io'); if (list && fileSystemRow.dataList2.length === 0) { - fileSystemRow.dataList2 = isDiskIO ? - FileSysChartStruct.groupBy10MSWithMaxLatency(list) : FileSysChartStruct.groupBy10MSWithCount(list); + fileSystemRow.dataList2 = isDiskIO + ? FileSysChartStruct.groupBy10MSWithMaxLatency(list) + : FileSysChartStruct.groupBy10MSWithCount(list); } fileSysChart( list, @@ -59,7 +60,10 @@ export class FileSystemRender extends PerfRender { let find = false; let hoverRect: FileSysChartStruct | undefined = undefined; for (let re of filter) { - if (fileSystemRow.isHover && re.frame && fileSystemRow.hoverX >= re.frame.x && + if ( + fileSystemRow.isHover && + re.frame && + fileSystemRow.hoverX >= re.frame.x && fileSystemRow.hoverX <= re.frame.x + re.frame.width ) { if (hoverRect == undefined || re.size! > hoverRect.size!) { diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameAnimation.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameAnimation.ts index 97ac6161c5a865b4c8ca4d97249ee39b77201558..e433354d6d2a8e6c05ef8edc2a6b49a3be0a41a8 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameAnimation.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameAnimation.ts @@ -42,8 +42,11 @@ export class FrameAnimationRender extends Render { for (let index: number = 0; index < frameAnimationFilter.length; index++) { let currentAnimationStruct: FrameAnimationStruct = frameAnimationFilter[index]; FrameAnimationStruct.draw(req.context, index, currentAnimationStruct, row); - if (row.isHover && currentAnimationStruct.frame && - isFrameContainPoint(currentAnimationStruct.frame, row.hoverX, row.hoverY)) { + if ( + row.isHover && + currentAnimationStruct.frame && + isFrameContainPoint(currentAnimationStruct.frame, row.hoverX, row.hoverY) + ) { FrameAnimationStruct.hoverFrameAnimationStruct = currentAnimationStruct; find = true; } @@ -75,15 +78,23 @@ export class FrameAnimationRender extends Render { if (frameAnimationList) { for (let index: number = 0; index < frameAnimationList.length; index++) { let currentFrameAnimation: FrameAnimationStruct = frameAnimationList[index]; - if ((currentFrameAnimation.startTs || 0) + (currentFrameAnimation.dur || 0) > startNS && - (currentFrameAnimation.startTs || 0) < endNS) { - FrameAnimationStruct.setFrameAnimation(currentFrameAnimation, padding, startNS, - endNS || 0, totalNS || 0, frame); + if ( + (currentFrameAnimation.startTs || 0) + (currentFrameAnimation.dur || 0) > startNS && + (currentFrameAnimation.startTs || 0) < endNS + ) { + FrameAnimationStruct.setFrameAnimation( + currentFrameAnimation, + padding, + startNS, + endNS || 0, + totalNS || 0, + frame + ); frameAnimationFilter.push(currentFrameAnimation); } } } - }; + } } export class FrameAnimationStruct extends BaseStruct { @@ -118,8 +129,8 @@ export class FrameAnimationStruct extends BaseStruct { } else { stateEndPointX = ns2x((animationNode.startTs || 0) + (animationNode.dur || 0), startNS, endNS, totalNS, frame); } - let frameWidth: number = stateEndPointX - stateStartPointX <= unitIndex ? unitIndex : - stateEndPointX - stateStartPointX; + let frameWidth: number = + stateEndPointX - stateStartPointX <= unitIndex ? unitIndex : stateEndPointX - stateStartPointX; if (!animationNode.frame) { animationNode.frame = new Rect(0, 0, 0, 0); } @@ -143,24 +154,43 @@ export class FrameAnimationStruct extends BaseStruct { ctx.lineWidth = 1; ctx.lineJoin = 'round'; ctx.fillStyle = ColorUtils.ANIMATION_COLOR[6]; - ctx.fillRect(frameAnimationNode.frame.x, frameAnimationNode.frame.y, - frameAnimationNode.frame.width, frameAnimationNode.frame.height); + ctx.fillRect( + frameAnimationNode.frame.x, + frameAnimationNode.frame.y, + frameAnimationNode.frame.width, + frameAnimationNode.frame.height + ); ctx.fillStyle = ColorUtils.ANIMATION_COLOR[3]; ctx.textBaseline = 'middle'; ctx.font = '8px sans-serif'; - drawString(ctx, `${frameAnimationNode.status} (${(frameAnimationNode.dur / nsToMillisecond). - toFixed(tsFixed)} ms)`, textPadding, frameAnimationNode.frame, frameAnimationNode); + drawString( + ctx, + `${frameAnimationNode.status} (${(frameAnimationNode.dur / nsToMillisecond).toFixed(tsFixed)} ms)`, + textPadding, + frameAnimationNode.frame, + frameAnimationNode + ); ctx.lineWidth = 2; - if ((frameAnimationNode === FrameAnimationStruct.hoverFrameAnimationStruct && isHover) || - frameAnimationNode === FrameAnimationStruct.selectFrameAnimationStruct) { + if ( + (frameAnimationNode === FrameAnimationStruct.hoverFrameAnimationStruct && isHover) || + frameAnimationNode === FrameAnimationStruct.selectFrameAnimationStruct + ) { ctx.globalAlpha = 0.8; ctx.strokeStyle = ColorUtils.ANIMATION_COLOR[3]; - ctx.strokeRect(frameAnimationNode.frame.x + padding, frameAnimationNode.frame.y, - frameAnimationNode.frame.width - padding, frameAnimationNode.frame.height); + ctx.strokeRect( + frameAnimationNode.frame.x + padding, + frameAnimationNode.frame.y, + frameAnimationNode.frame.width - padding, + frameAnimationNode.frame.height + ); } else { ctx.strokeStyle = ColorUtils.ANIMATION_COLOR[2]; - ctx.strokeRect(frameAnimationNode.frame.x + padding, frameAnimationNode.frame.y, - frameAnimationNode.frame.width - padding, frameAnimationNode.frame.height); + ctx.strokeRect( + frameAnimationNode.frame.x + padding, + frameAnimationNode.frame.y, + frameAnimationNode.frame.width - padding, + frameAnimationNode.frame.height + ); } } } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameDynamic.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameDynamic.ts index 3cb515ac1099f850aaceb3aaa34f22500ba4102b..01e5dce0e7f2f766b28876f1d011ba9890186f0d 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameDynamic.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameDynamic.ts @@ -15,7 +15,7 @@ import { TraceRow } from '../../component/trace/base/TraceRow.js'; import { BaseStruct, computeUnitWidth, isSurroundingPoint, ns2x, Rect, Render } from './ProcedureWorkerCommon.js'; -import { AnimationRanges } from '../../bean/FrameComponentBean.js'; +import { type AnimationRanges } from '../../bean/FrameComponentBean.js'; import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; export class FrameDynamicRender extends Render { @@ -68,8 +68,9 @@ export class FrameDynamicRender extends Render { selectUnitWidth: number ): boolean { let find: boolean = false; - let findStructList = frameDynamicFilter.filter(filter => - row.isHover && isSurroundingPoint(row.hoverX, filter.frame!, selectUnitWidth / multiple)); + let findStructList = frameDynamicFilter.filter( + (filter) => row.isHover && isSurroundingPoint(row.hoverX, filter.frame!, selectUnitWidth / multiple) + ); if (findStructList.length > 0) { find = true; let hoverIndex: number = 0; @@ -111,34 +112,56 @@ export class FrameDynamicRender extends Render { break; } } - if (currentDynamic.ts < startNS && (dataIndex + unitIndex) < frameDynamicList.length && - frameDynamicList[dataIndex + unitIndex].ts >= startNS && currentDynamic.groupId !== invalidGroupId) { - this.refreshFilterDynamicFrame(frameDynamicFilter, currentDynamic, row.frame, startNS, - endNS, totalNS, groupIdList); + if ( + currentDynamic.ts < startNS && + dataIndex + unitIndex < frameDynamicList.length && + frameDynamicList[dataIndex + unitIndex].ts >= startNS && + currentDynamic.groupId !== invalidGroupId + ) { + this.refreshFilterDynamicFrame( + frameDynamicFilter, + currentDynamic, + row.frame, + startNS, + endNS, + totalNS, + groupIdList + ); } if (currentDynamic.ts >= startNS && currentDynamic.ts <= endNS && currentDynamic.groupId !== invalidGroupId) { - this.refreshFilterDynamicFrame(frameDynamicFilter, currentDynamic, row.frame, startNS, - endNS, totalNS, groupIdList); + this.refreshFilterDynamicFrame( + frameDynamicFilter, + currentDynamic, + row.frame, + startNS, + endNS, + totalNS, + groupIdList + ); } if (currentDynamic.ts >= endNS && currentDynamic.groupId !== invalidGroupId) { - this.refreshFilterDynamicFrame(frameDynamicFilter, currentDynamic, row.frame, startNS, - endNS, totalNS, groupIdList); + this.refreshFilterDynamicFrame( + frameDynamicFilter, + currentDynamic, + row.frame, + startNS, + endNS, + totalNS, + groupIdList + ); break; } } } this.setSimpleGroupId(groupIdList, frameDynamicFilter); } - }; + } - private setSimpleGroupId( - groupIdList: number[], - frameDynamicFilter: FrameDynamicStruct[] - ): void { - let simpleGroup = groupIdList.filter(groupId => { + private setSimpleGroupId(groupIdList: number[], frameDynamicFilter: FrameDynamicStruct[]): void { + let simpleGroup = groupIdList.filter((groupId) => { return groupId !== invalidGroupId && groupIdList.indexOf(groupId) === groupIdList.lastIndexOf(groupId); }); - frameDynamicFilter.forEach(dynamic => { + frameDynamicFilter.forEach((dynamic) => { if (simpleGroup.indexOf(dynamic.groupId!) > invalidGroupId) { dynamic.groupId = 0; } @@ -160,7 +183,7 @@ export class FrameDynamicRender extends Render { FrameDynamicStruct.setFrameDynamic(frameDynamicNode, startNS, endNS, totalNS, frame); } } - }; + } private drawSinglePoint( ctx: CanvasRenderingContext2D, @@ -173,8 +196,10 @@ export class FrameDynamicRender extends Render { let smallArcRadius: number = 2; // @ts-ignore currDynamic.typeValue = currDynamic[modelType]; - currDynamic.frame!.y = row.frame.height - padding - - ((row.frame.height - padding * multiple) * ((currDynamic.typeValue || 0) - minValue) / (maxValue - minValue)); + currDynamic.frame!.y = + row.frame.height - + padding - + ((row.frame.height - padding * multiple) * ((currDynamic.typeValue || 0) - minValue)) / (maxValue - minValue); ctx.beginPath(); ctx.lineWidth = 1; ctx.globalAlpha = 1; @@ -199,7 +224,7 @@ export class FrameDynamicRender extends Render { let pointY = (row.frame.height - padding * multiple) * ((currDynamicValue - minValue) / (maxValue - minValue)); curDynamic.frame.y = row.frame.height - padding - pointY; } - }; + } private drawDynamicPointYStr( ctx: CanvasRenderingContext2D, @@ -218,7 +243,7 @@ export class FrameDynamicRender extends Render { let pointYInterval = totalValue / (yScaleNumber - unitIndex); for (let index = 0; index < yScaleNumber; index++) { let pointYValue = minValue + pointYInterval * index; - let pointYHeight = (frame.height - padding * multiple) * (pointYValue - minValue) / totalValue; + let pointYHeight = ((frame.height - padding * multiple) * (pointYValue - minValue)) / totalValue; let pointY = frame.height - multiple * padding - pointYHeight; if (pointYValue !== 0) { if (maxValue - minValue <= minUnitValue) { @@ -229,20 +254,23 @@ export class FrameDynamicRender extends Render { } } } - }; + } - private getMinAndMaxData( - frameDynamicFilter: FrameDynamicStruct[], - modelType: string - ): [number, number] { - let min: number = Math.min.apply(Math, frameDynamicFilter.map(filterData => { - // @ts-ignore - return filterData[modelType]; - })); - let max: number = Math.max.apply(Math, frameDynamicFilter.map(filterData => { - // @ts-ignore - return filterData[modelType]; - })); + private getMinAndMaxData(frameDynamicFilter: FrameDynamicStruct[], modelType: string): [number, number] { + let min: number = Math.min.apply( + Math, + frameDynamicFilter.map((filterData) => { + // @ts-ignore + return filterData[modelType]; + }) + ); + let max: number = Math.max.apply( + Math, + frameDynamicFilter.map((filterData) => { + // @ts-ignore + return filterData[modelType]; + }) + ); let yScaleMinValue: number = 1; let yScaleMinSpacing: number = 10; @@ -259,7 +287,7 @@ export class FrameDynamicRender extends Render { } } return [min, max]; - }; + } private refreshFilterDynamicFrame( frameDynamicFilter: FrameDynamicStruct[], @@ -273,7 +301,7 @@ export class FrameDynamicRender extends Render { groupIdList.push(currentFrameDynamic.groupId!); frameDynamicFilter.push(currentFrameDynamic); FrameDynamicStruct.setFrameDynamic(currentFrameDynamic, startNS, endNS, totalNS, frame); - }; + } } export class FrameDynamicStruct extends BaseStruct { @@ -339,8 +367,10 @@ export class FrameDynamicStruct extends BaseStruct { currDynamicStruct: FrameDynamicStruct, row: TraceRow ): void { - if ((currDynamicStruct === FrameDynamicStruct.hoverFrameDynamicStruct && row.isHover) || - currDynamicStruct === FrameDynamicStruct.selectFrameDynamicStruct) { + if ( + (currDynamicStruct === FrameDynamicStruct.hoverFrameDynamicStruct && row.isHover) || + currDynamicStruct === FrameDynamicStruct.selectFrameDynamicStruct + ) { FrameDynamicStruct.drawSelectOrHoverArc(ctx, currDynamicStruct); } if (row.getAttribute('check-type') === '2' && FrameDynamicStruct.isSelect(currDynamicStruct)) { @@ -348,13 +378,12 @@ export class FrameDynamicStruct extends BaseStruct { } } - static drawSelectOrHoverArc( - ctx: CanvasRenderingContext2D, - currDynamicStruct: FrameDynamicStruct - ): void { - if (currDynamicStruct.frame && + static drawSelectOrHoverArc(ctx: CanvasRenderingContext2D, currDynamicStruct: FrameDynamicStruct): void { + if ( + currDynamicStruct.frame && currDynamicStruct.ts > TraceRow.range!.startNS && - currDynamicStruct.ts < TraceRow.range!.endNS) { + currDynamicStruct.ts < TraceRow.range!.endNS + ) { let bigArcRadius: number = 3; ctx.beginPath(); ctx.lineWidth = 3; @@ -368,11 +397,13 @@ export class FrameDynamicStruct extends BaseStruct { } static isSelect(currDynamicStruct: FrameDynamicStruct): boolean | 0 | undefined { - return TraceRow.rangeSelectObject && + return ( + TraceRow.rangeSelectObject && TraceRow.rangeSelectObject.startNS && TraceRow.rangeSelectObject.endNS && currDynamicStruct.ts >= TraceRow.rangeSelectObject.startNS && - currDynamicStruct.ts <= TraceRow.rangeSelectObject.endNS; + currDynamicStruct.ts <= TraceRow.rangeSelectObject.endNS + ); } } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameSpacing.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameSpacing.ts index 0a72036e339d346f80c6506f1dc18637c2b9e283..69b29e3a42dc61591d5cd3f495a75f20e0868b65 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameSpacing.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameSpacing.ts @@ -15,7 +15,7 @@ import { TraceRow } from '../../component/trace/base/TraceRow.js'; import { BaseStruct, computeUnitWidth, isSurroundingPoint, ns2x, Rect, Render } from './ProcedureWorkerCommon.js'; -import { AnimationRanges } from '../../bean/FrameComponentBean.js'; +import { type AnimationRanges } from '../../bean/FrameComponentBean.js'; import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; export class FrameSpacingRender extends Render { @@ -24,8 +24,8 @@ export class FrameSpacingRender extends Render { useCache: boolean; context: CanvasRenderingContext2D; type: string; - frameRate: number - animationRanges: AnimationRanges[] + frameRate: number; + animationRanges: AnimationRanges[]; }, row: TraceRow ): void { @@ -44,29 +44,47 @@ export class FrameSpacingRender extends Render { this.render(req, frameSpacingFilter, row); } - private render(req: { useCache: boolean; context: CanvasRenderingContext2D; type: string; frameRate: number; - animationRanges: AnimationRanges[] }, frameSpacingFilter: Array, - row: TraceRow) : void { + private render( + req: { + useCache: boolean; + context: CanvasRenderingContext2D; + type: string; + frameRate: number; + animationRanges: AnimationRanges[]; + }, + frameSpacingFilter: Array, + row: TraceRow + ): void { if (req.animationRanges.length > 0 && req.animationRanges[0] && frameSpacingFilter.length > 0) { let preFrameSpacing: FrameSpacingStruct = frameSpacingFilter[0]; // @ts-ignore let smallTickStandard = smallTick[req.frameRate]; - let [minValue, maxValue] = this.maxMinData(smallTickStandard.firstLine, - smallTickStandard.thirdLine, frameSpacingFilter); + let [minValue, maxValue] = this.maxMinData( + smallTickStandard.firstLine, + smallTickStandard.thirdLine, + frameSpacingFilter + ); let isDraw = false; let selectUnitWidth: number = 0; for (let index: number = 0; index < frameSpacingFilter.length; index++) { let currentStruct = frameSpacingFilter[index]; - selectUnitWidth = computeUnitWidth(preFrameSpacing.currentTs, currentStruct.currentTs, - row.frame.width, selectUnitWidth); + selectUnitWidth = computeUnitWidth( + preFrameSpacing.currentTs, + currentStruct.currentTs, + row.frame.width, + selectUnitWidth + ); FrameSpacingStruct.refreshHoverStruct(preFrameSpacing, currentStruct, row, minValue, maxValue); if (currentStruct.groupId === 0) { if (currentStruct.currentTs > TraceRow.range!.startNS && currentStruct.currentTs < TraceRow.range!.endNS) { isDraw = true; this.drawPoint(req.context, currentStruct, row, minValue, maxValue); } - } else if (currentStruct.groupId !== invalidGroupId && index > 0 && - currentStruct.groupId === preFrameSpacing!.groupId) { + } else if ( + currentStruct.groupId !== invalidGroupId && + index > 0 && + currentStruct.groupId === preFrameSpacing!.groupId + ) { isDraw = true; FrameSpacingStruct.draw(req.context, preFrameSpacing, currentStruct, row, minValue, maxValue); } @@ -76,8 +94,9 @@ export class FrameSpacingRender extends Render { if (isDraw) { this.drawDashedLines(Object.values(smallTickStandard), req, row, minValue, maxValue); } - let findStructList = frameSpacingFilter.filter(filter => - row.isHover && isSurroundingPoint(row.hoverX, filter.frame!, selectUnitWidth / multiple)); + let findStructList = frameSpacingFilter.filter( + (filter) => row.isHover && isSurroundingPoint(row.hoverX, filter.frame!, selectUnitWidth / multiple) + ); let find = false; if (findStructList.length > 0) { find = true; @@ -93,11 +112,20 @@ export class FrameSpacingRender extends Render { } } - private drawPoint(ctx: CanvasRenderingContext2D, currentStruct: FrameSpacingStruct, - row: TraceRow, minValue: number, maxValue: number): void { - let currentPointY = row.frame.height - Math.floor((currentStruct.frameSpacingResult! - - minValue) * (row.frame.height - padding * multiple) / - (maxValue - minValue)) - padding; + private drawPoint( + ctx: CanvasRenderingContext2D, + currentStruct: FrameSpacingStruct, + row: TraceRow, + minValue: number, + maxValue: number + ): void { + let currentPointY = + row.frame.height - + Math.floor( + ((currentStruct.frameSpacingResult! - minValue) * (row.frame.height - padding * multiple)) / + (maxValue - minValue) + ) - + padding; ctx.beginPath(); ctx.lineWidth = 1; ctx.globalAlpha = 1; @@ -155,8 +183,12 @@ export class FrameSpacingRender extends Render { break; } } - if (item.currentTs < startNS && index + unitIndex < frameSpacingList.length && - frameSpacingList[index + unitIndex].currentTs >= startNS && item.groupId !== invalidGroupId) { + if ( + item.currentTs < startNS && + index + unitIndex < frameSpacingList.length && + frameSpacingList[index + unitIndex].currentTs >= startNS && + item.groupId !== invalidGroupId + ) { this.refreshFrame(frameSpacingFilter, item, startNS, endNS, totalNS, frame, groupIdList); } if (item.currentTs >= startNS && item.currentTs <= endNS && item.groupId !== invalidGroupId) { @@ -173,10 +205,10 @@ export class FrameSpacingRender extends Render { } private grouping(groupIdList: number[], frameSpacingFilter: Array): void { - let simpleGroup = groupIdList.filter(groupId => { + let simpleGroup = groupIdList.filter((groupId) => { return groupId !== invalidGroupId && groupIdList.indexOf(groupId) === groupIdList.lastIndexOf(groupId); }); - frameSpacingFilter.forEach(frameSpacing => { + frameSpacingFilter.forEach((frameSpacing) => { if (simpleGroup.indexOf(frameSpacing.groupId!) > invalidGroupId) { frameSpacing.groupId = 0; frameSpacing.frameSpacingResult = 0; @@ -189,20 +221,33 @@ export class FrameSpacingRender extends Render { }); } - private refreshFrame(frameSpacingFilter: Array, item: FrameSpacingStruct, - startNS: number, endNS: number, totalNS: number, frame: Rect, groupIdList: number[]): void { + private refreshFrame( + frameSpacingFilter: Array, + item: FrameSpacingStruct, + startNS: number, + endNS: number, + totalNS: number, + frame: Rect, + groupIdList: number[] + ): void { frameSpacingFilter.push(item); FrameSpacingStruct.setFrameSpacingFrame(item, startNS, endNS, totalNS, frame); groupIdList.push(item.groupId!); } private maxMinData(tickStandardMin: number, tickStandardMax: number, filter: FrameSpacingStruct[]): [number, number] { - let min = Math.min.apply(Math, filter.map(filterData => { - return filterData.frameSpacingResult!; - })); - let max = Math.max.apply(Math, filter.map(filterData => { - return filterData.frameSpacingResult!; - })); + let min = Math.min.apply( + Math, + filter.map((filterData) => { + return filterData.frameSpacingResult!; + }) + ); + let max = Math.max.apply( + Math, + filter.map((filterData) => { + return filterData.frameSpacingResult!; + }) + ); if (max < tickStandardMax) { max = tickStandardMax + padding; } @@ -247,22 +292,33 @@ export class FrameSpacingStruct extends BaseStruct { frameSpacingNode.frame.x = Math.floor(pointX); } - static isSelect(currSpacingStruct: FrameSpacingStruct) : boolean | 0 | undefined { - return TraceRow.rangeSelectObject && + static isSelect(currSpacingStruct: FrameSpacingStruct): boolean | 0 | undefined { + return ( + TraceRow.rangeSelectObject && TraceRow.rangeSelectObject.startNS && TraceRow.rangeSelectObject.endNS && currSpacingStruct.currentTs >= TraceRow.rangeSelectObject.startNS && - currSpacingStruct.currentTs <= TraceRow.rangeSelectObject.endNS; + currSpacingStruct.currentTs <= TraceRow.rangeSelectObject.endNS + ); } - static refreshHoverStruct(preFrameSpacing: FrameSpacingStruct, frameSpacing: FrameSpacingStruct, - row: TraceRow, minValue: number, maxValue: number): void { + static refreshHoverStruct( + preFrameSpacing: FrameSpacingStruct, + frameSpacing: FrameSpacingStruct, + row: TraceRow, + minValue: number, + maxValue: number + ): void { if (frameSpacing.frame) { - frameSpacing.frame.y = row.frame.height - Math.floor((frameSpacing.frameSpacingResult! - - minValue) * (row.frame.height - padding * multiple) / - (maxValue - minValue)) - padding; + frameSpacing.frame.y = + row.frame.height - + Math.floor( + ((frameSpacing.frameSpacingResult! - minValue) * (row.frame.height - padding * multiple)) / + (maxValue - minValue) + ) - + padding; } - }; + } static draw( ctx: CanvasRenderingContext2D, @@ -277,13 +333,20 @@ export class FrameSpacingStruct extends BaseStruct { } } - static drawSelect(currentStruct: FrameSpacingStruct, ctx: CanvasRenderingContext2D, - rowFrame: TraceRow): void { - if (currentStruct.frame && + static drawSelect( + currentStruct: FrameSpacingStruct, + ctx: CanvasRenderingContext2D, + rowFrame: TraceRow + ): void { + if ( + currentStruct.frame && currentStruct.currentTs > TraceRow.range!.startNS && - currentStruct.currentTs < TraceRow.range!.endNS) { - if ((currentStruct === FrameSpacingStruct.hoverFrameSpacingStruct && rowFrame.isHover) || - currentStruct === FrameSpacingStruct.selectFrameSpacingStruct) { + currentStruct.currentTs < TraceRow.range!.endNS + ) { + if ( + (currentStruct === FrameSpacingStruct.hoverFrameSpacingStruct && rowFrame.isHover) || + currentStruct === FrameSpacingStruct.selectFrameSpacingStruct + ) { ctx.lineWidth = 3; ctx.beginPath(); ctx.arc(currentStruct.frame.x, currentStruct.frame.y, selectRadius, 0, multiple * Math.PI); @@ -318,8 +381,10 @@ export class FrameSpacingStruct extends BaseStruct { minValue: number, maxValue: number ): void { - let pointY = rowFrame.height - Math.floor((dashedLines[index] - minValue) * - (rowFrame.height - padding * multiple) / (maxValue - minValue)) - padding; + let pointY = + rowFrame.height - + Math.floor(((dashedLines[index] - minValue) * (rowFrame.height - padding * multiple)) / (maxValue - minValue)) - + padding; let lineDash = 10; let textPadding = 4; ctx.beginPath(); @@ -351,12 +416,20 @@ export class FrameSpacingStruct extends BaseStruct { maxValue: number ): void { ctx.beginPath(); - let prePointY = rowFrame.frame.height - Math.floor((preFrameSpacing.frameSpacingResult! - - minValue) * (rowFrame.frame.height - padding * multiple) / - (maxValue - minValue)) - padding; - let currentPointY = rowFrame.frame.height - Math.floor((currentStruct.frameSpacingResult! - - minValue) * (rowFrame.frame.height - padding * multiple) / - (maxValue - minValue)) - padding; + let prePointY = + rowFrame.frame.height - + Math.floor( + ((preFrameSpacing.frameSpacingResult! - minValue) * (rowFrame.frame.height - padding * multiple)) / + (maxValue - minValue) + ) - + padding; + let currentPointY = + rowFrame.frame.height - + Math.floor( + ((currentStruct.frameSpacingResult! - minValue) * (rowFrame.frame.height - padding * multiple)) / + (maxValue - minValue) + ) - + padding; if (preFrameSpacing.frame && currentStruct.frame) { ctx.strokeStyle = ColorUtils.ANIMATION_COLOR[2]; ctx.fillStyle = ColorUtils.ANIMATION_COLOR[2]; @@ -381,16 +454,16 @@ const smallTick = { 60: { firstLine: 11.4, secondLine: 13, - thirdLine: 14.6 + thirdLine: 14.6, }, 90: { firstLine: 13.7, secondLine: 19.4, - thirdLine: 25 + thirdLine: 25, }, 120: { firstLine: 13.7, secondLine: 19.4, - thirdLine: 25 - } + thirdLine: 25, + }, }; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerFunc.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerFunc.ts index 3da7303107ea7ab32f5790cac754d95e1a7ac930..363d3c87f6c83b3fc9bd7640a9d78f874fc904fe 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerFunc.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerFunc.ts @@ -196,7 +196,7 @@ export class FuncStruct extends BaseFuncStruct { y: number, radius: number, data: FuncStruct - ) { + ): void { ctx.strokeStyle = '#FFC880'; ctx.lineWidth = 1; ctx.beginPath(); @@ -213,7 +213,7 @@ export class FuncStruct extends BaseFuncStruct { y: number, radius: number, data: FuncStruct - ) { + ): void { canvas.strokeStyle = '#FFC880'; canvas.lineWidth = 1; canvas.beginPath(); diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerHeapTimeline.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerHeapTimeline.ts index d1780927b9df68852231e6db49ea4c5f80af2fe4..c5960e14a570a40954ab26e047b0d994492204de 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerHeapTimeline.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerHeapTimeline.ts @@ -61,7 +61,9 @@ export class HeapTimelineRender { } } } - if (!heapTimelineFind && row.isHover) HeapTimelineStruct.hoverHeapTimelineStruct = undefined; + if (!heapTimelineFind && row.isHover) { + HeapTimelineStruct.hoverHeapTimelineStruct = undefined; + } } } export function HeapTimeline( diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfCPU.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfCPU.ts index 0ef9aee5220717739ff3802bce6f7c0aeb03cc92..e535924fff3367531f758801f04b5928bd7def32 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfCPU.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfCPU.ts @@ -29,7 +29,7 @@ import { TraceRow } from '../../component/trace/base/TraceRow.js'; import { HiPerfThreadStruct } from './ProcedureWorkerHiPerfThread.js'; export class HiperfCpuRender extends PerfRender { - renderMainThread(req: any, row: TraceRow) { + renderMainThread(req: any, row: TraceRow): void { let list = row.dataList; let filter = row.dataListCache; let groupBy10MS = req.scale > 30_000_000; @@ -75,7 +75,7 @@ export class HiperfCpuRender extends PerfRender { req.context.closePath(); } - render(hiPerfCpuRequest: RequestMessage, list: Array, filter: Array, dataList2: Array) {} + render(hiPerfCpuRequest: RequestMessage, list: Array, filter: Array, dataList2: Array): void {} } export class HiPerfCpuStruct extends HiPerfStruct { diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfEvent.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfEvent.ts index 88ea697ea1d464688cb27cb20722f30151441dd5..ba3749efce87b617a719142e14313e976670ae47 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfEvent.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfEvent.ts @@ -14,12 +14,7 @@ */ import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; -import { - hiPerf, - HiPerfStruct, - PerfRender, - RequestMessage, -} from './ProcedureWorkerCommon.js'; +import { hiPerf, HiPerfStruct, PerfRender, RequestMessage } from './ProcedureWorkerCommon.js'; import { TraceRow } from '../../component/trace/base/TraceRow.js'; export class HiperfEventRender extends PerfRender { diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfProcess.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfProcess.ts index 0666b49e8f1065e8745d8ff59b387d267dcc4a27..fb79f36307706cbe0df7c3bfd779651908ee04ae 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfProcess.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfProcess.ts @@ -14,12 +14,7 @@ */ import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; -import { - hiPerf, - HiPerfStruct, - PerfRender, - RequestMessage, -} from './ProcedureWorkerCommon.js'; +import { hiPerf, HiPerfStruct, PerfRender, RequestMessage } from './ProcedureWorkerCommon.js'; import { TraceRow } from '../../component/trace/base/TraceRow.js'; export class HiperfProcessRender extends PerfRender { diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfReport.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfReport.ts index 3e78457ce8bac095533640742d88ec77e6a41b12..043bab3675a9d6d5648da42dd79dd566f93207b7 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfReport.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfReport.ts @@ -13,10 +13,10 @@ * limitations under the License. */ -import {ColorUtils} from '../../component/trace/base/ColorUtils.js'; -import {HiPerfStruct, PerfRender, RequestMessage,} from './ProcedureWorkerCommon.js'; +import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; +import { HiPerfStruct, PerfRender, type RequestMessage } from './ProcedureWorkerCommon.js'; -import {TraceRow} from '../../component/trace/base/TraceRow.js'; +import { TraceRow } from '../../component/trace/base/TraceRow.js'; export class HiperfReportRender extends PerfRender { renderMainThread(hiPerfReportReq: any, row: TraceRow): void { @@ -124,10 +124,11 @@ export function HiPerfReport( if (groupBy10MS) { hiPerfFilters.push(current); } else { - if (hiPerfFilters.length == 0) { + if (hiPerfFilters.length === 0) { hiPerfFilters.push(current); } - if (hiPerfFilters[hiPerfFilters.length - 1] && + if ( + hiPerfFilters[hiPerfFilters.length - 1] && Math.abs(current.frame.x - hiPerfFilters[hiPerfFilters.length - 1].frame.x) > 4 ) { hiPerfFilters.push(current); diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfThread.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfThread.ts index b005cdad581cdee8dea98d39a32337844a6428bc..012890c892461685b9db695d0968863ecb7ad05e 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfThread.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfThread.ts @@ -14,12 +14,7 @@ */ import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; -import { - hiPerf, - HiPerfStruct, - PerfRender, - RequestMessage, -} from './ProcedureWorkerCommon.js'; +import { hiPerf, HiPerfStruct, PerfRender, RequestMessage } from './ProcedureWorkerCommon.js'; import { TraceRow } from '../../component/trace/base/TraceRow.js'; export class HiperfThreadRender extends PerfRender { @@ -68,8 +63,7 @@ export class HiperfThreadRender extends PerfRender { hiPerfThreadReq.context.closePath(); } - render(req: RequestMessage, list: Array, filter: Array, dataList2: Array): void { - } + render(req: RequestMessage, list: Array, filter: Array, dataList2: Array): void {} } export class HiPerfThreadStruct extends HiPerfStruct { diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerJank.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerJank.ts index 7dab688b45f894d72ab08faf9b728df9095de7cf..88924004e14e2a61de4a1f3c8562dc30825e58bf 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerJank.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerJank.ts @@ -16,14 +16,7 @@ import { JanksStruct } from '../../bean/JanksStruct.js'; import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; import { TraceRow } from '../../component/trace/base/TraceRow.js'; -import { - BaseStruct, - isFrameContainPoint, - ns2x, - Render, - RequestMessage, - drawString, -} from './ProcedureWorkerCommon.js'; +import { BaseStruct, isFrameContainPoint, ns2x, Render, RequestMessage, drawString } from './ProcedureWorkerCommon.js'; export class JankRender extends Render { renderMainThread( @@ -87,7 +80,7 @@ export function jank( use: boolean ): void { if (use && jankFilter.length > 0) { - for (let i = 0, len = jankFilter.length ; i < len ; i++) { + for (let i = 0, len = jankFilter.length; i < len; i++) { if ((jankFilter[i].ts || 0) + (jankFilter[i].dur || 0) >= startNS && (jankFilter[i].ts || 0) <= endNS) { JankStruct.setJankFrame(jankFilter[i], 0, startNS, endNS, totalNS, frame); } else { @@ -105,7 +98,7 @@ export function jank( return it; }) .reduce((pre, current, index, arr) => { - (pre[`${ current.frame.x }-${ current.depth }`] = pre[`${ current.frame.x }-${ current.depth }`] || []).push(current); + (pre[`${current.frame.x}-${current.depth}`] = pre[`${current.frame.x}-${current.depth}`] || []).push(current); return pre; }, {}); Reflect.ownKeys(groups).map((kv) => { @@ -120,7 +113,14 @@ export class JankStruct extends JanksStruct { static selectJankStruct: JankStruct | undefined; static selectJankStructList: Array = new Array(); - static setJankFrame(jankNode: any, padding: number, startNS: number, endNS: number, totalNS: number, frame: any): void { + static setJankFrame( + jankNode: any, + padding: number, + startNS: number, + endNS: number, + totalNS: number, + frame: any + ): void { let x1: number, x2: number; if ((jankNode.ts || 0) > startNS && (jankNode.ts || 0) < endNS) { x1 = ns2x(jankNode.ts || 0, startNS, endNS, totalNS, frame); @@ -170,7 +170,7 @@ export class JankStruct extends JanksStruct { } if (data.frame.width > 10) { ctx.fillStyle = '#fff'; - drawString(ctx, `${ data.name || '' }`, 5, data.frame, data); + drawString(ctx, `${data.name || ''}`, 5, data.frame, data); } if (JankStruct.isSelected(data)) { ctx.strokeStyle = '#000'; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerLog.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerLog.ts index 64c5eda97362de27bccaaf32cb9b9efc077a7f58..88fad80c6521631c7e52b5a0462e894b0ee3d091 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerLog.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerLog.ts @@ -13,11 +13,11 @@ * limitations under the License. */ -import {TraceRow} from '../../component/trace/base/TraceRow.js'; +import { TraceRow } from '../../component/trace/base/TraceRow.js'; import { ns2x, Rect, Render } from './ProcedureWorkerCommon.js'; -import {BaseStruct} from '../../bean/BaseStruct.js'; -import {ColorUtils} from "../../component/trace/base/ColorUtils.js"; +import { BaseStruct } from '../../bean/BaseStruct.js'; +import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; const LOG_STRUCT_HEIGHT = 7; const X_PADDING = 5; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts index 64895a773743e04ee8c5bcc822a8b8075bf5a2dc..1183cbe069dd541433f7ce1af39a44f92ae4f1ac 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts @@ -55,7 +55,9 @@ export class MemoryAbilityRender extends Render { let find = false; for (let re of memoryAbilityFilter) { MemoryAbilityMonitorStruct.draw(req.context, re, req.maxMemoryByte, memoryAbilityRow.isHover); - if (memoryAbilityRow.isHover && re.frame && + if ( + memoryAbilityRow.isHover && + re.frame && isFrameContainPoint(re.frame, memoryAbilityRow.hoverX, memoryAbilityRow.hoverY) ) { MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = re; @@ -264,7 +266,9 @@ export class MemoryAbilityMonitorStruct extends BaseStruct { if (memoryAbilityData.startNS === MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.startNS && isHover) { memoryAbilityContext2D.lineWidth = 1; memoryAbilityContext2D.globalAlpha = 0.6; - let drawHeight: number = Math.floor(((memoryAbilityData.value || 0) * (memoryAbilityData.frame.height || 0) * 1.0) / maxMemoryByte); + let drawHeight: number = Math.floor( + ((memoryAbilityData.value || 0) * (memoryAbilityData.frame.height || 0) * 1.0) / maxMemoryByte + ); memoryAbilityContext2D.fillRect( memoryAbilityData.frame.x, memoryAbilityData.frame.y + memoryAbilityData.frame.height - drawHeight + 4, @@ -284,14 +288,22 @@ export class MemoryAbilityMonitorStruct extends BaseStruct { memoryAbilityContext2D.globalAlpha = 1.0; memoryAbilityContext2D.stroke(); memoryAbilityContext2D.beginPath(); - memoryAbilityContext2D.moveTo(memoryAbilityData.frame.x + 3, memoryAbilityData.frame.y + memoryAbilityData.frame.height - drawHeight + 4); + memoryAbilityContext2D.moveTo( + memoryAbilityData.frame.x + 3, + memoryAbilityData.frame.y + memoryAbilityData.frame.height - drawHeight + 4 + ); memoryAbilityContext2D.lineWidth = 3; - memoryAbilityContext2D.lineTo(memoryAbilityData.frame.x + width, memoryAbilityData.frame.y + memoryAbilityData.frame.height - drawHeight + 4); + memoryAbilityContext2D.lineTo( + memoryAbilityData.frame.x + width, + memoryAbilityData.frame.y + memoryAbilityData.frame.height - drawHeight + 4 + ); memoryAbilityContext2D.stroke(); } else { memoryAbilityContext2D.globalAlpha = 0.6; memoryAbilityContext2D.lineWidth = 1; - let drawHeight: number = Math.floor(((memoryAbilityData.value || 0) * (memoryAbilityData.frame.height || 0)) / maxMemoryByte); + let drawHeight: number = Math.floor( + ((memoryAbilityData.value || 0) * (memoryAbilityData.frame.height || 0)) / maxMemoryByte + ); memoryAbilityContext2D.fillRect( memoryAbilityData.frame.x, memoryAbilityData.frame.y + memoryAbilityData.frame.height - drawHeight + 4, diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerNetworkAbility.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerNetworkAbility.ts index 0f3de43f1f3c93aa8ddd3cc04cc7752667860827..f98577c51b1b7e59385259b3d253ecfa1f0c6c1c 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerNetworkAbility.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerNetworkAbility.ts @@ -43,7 +43,9 @@ export class NetworkAbilityRender extends Render { let find = false; for (let re of networkAbilityFilter) { NetworkAbilityMonitorStruct.draw(req.context, re, req.maxNetworkRate, networkAbilityRow.isHover); - if (networkAbilityRow.isHover && re.frame && + if ( + networkAbilityRow.isHover && + re.frame && isFrameContainPoint(re.frame, networkAbilityRow.hoverX, networkAbilityRow.hoverY) ) { NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = re; @@ -89,7 +91,9 @@ export class NetworkAbilityMonitorStruct extends BaseStruct { if (networkAbilityData.startNS === NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.startNS && isHover) { networkAbilityContext2D.lineWidth = 1; networkAbilityContext2D.globalAlpha = 0.6; - let drawHeight: number = Math.floor(((networkAbilityData.value || 0) * (networkAbilityData.frame.height || 0) * 1.0) / maxNetworkRate); + let drawHeight: number = Math.floor( + ((networkAbilityData.value || 0) * (networkAbilityData.frame.height || 0) * 1.0) / maxNetworkRate + ); networkAbilityContext2D.fillRect( networkAbilityData.frame.x, networkAbilityData.frame.y + networkAbilityData.frame.height - drawHeight + 4, @@ -109,14 +113,22 @@ export class NetworkAbilityMonitorStruct extends BaseStruct { networkAbilityContext2D.globalAlpha = 1.0; networkAbilityContext2D.stroke(); networkAbilityContext2D.beginPath(); - networkAbilityContext2D.moveTo(networkAbilityData.frame.x + 3, networkAbilityData.frame.y + networkAbilityData.frame.height - drawHeight + 4); + networkAbilityContext2D.moveTo( + networkAbilityData.frame.x + 3, + networkAbilityData.frame.y + networkAbilityData.frame.height - drawHeight + 4 + ); networkAbilityContext2D.lineWidth = 3; - networkAbilityContext2D.lineTo(networkAbilityData.frame.x + width, networkAbilityData.frame.y + networkAbilityData.frame.height - drawHeight + 4); + networkAbilityContext2D.lineTo( + networkAbilityData.frame.x + width, + networkAbilityData.frame.y + networkAbilityData.frame.height - drawHeight + 4 + ); networkAbilityContext2D.stroke(); } else { networkAbilityContext2D.globalAlpha = 0.6; networkAbilityContext2D.lineWidth = 1; - let drawHeight: number = Math.floor(((networkAbilityData.value || 0) * (networkAbilityData.frame.height || 0)) / maxNetworkRate); + let drawHeight: number = Math.floor( + ((networkAbilityData.value || 0) * (networkAbilityData.frame.height || 0)) / maxNetworkRate + ); networkAbilityContext2D.fillRect( networkAbilityData.frame.x, networkAbilityData.frame.y + networkAbilityData.frame.height - drawHeight + 4, diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerSnapshot.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerSnapshot.ts index 43e059d41e681b95b7f362e7728b6f72d8265c2d..f2076b253fec435d83c4c5982667f5d5c786f3b2 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerSnapshot.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerSnapshot.ts @@ -32,7 +32,14 @@ export class SnapshotRender extends Render { for (let item of list) { maxValue = Math.max(maxValue, item.value || 0); } - snapshot(list, filter, maxValue, TraceRow.range?.startNS ?? 0, (TraceRow.range?.endNS ?? 0) - (TraceRow.range?.startNS! ?? 0), row.frame); + snapshot( + list, + filter, + maxValue, + TraceRow.range?.startNS ?? 0, + (TraceRow.range?.endNS ?? 0) - (TraceRow.range?.startNS! ?? 0), + row.frame + ); req.context!.beginPath(); let find = false; for (let re of filter) { @@ -72,6 +79,8 @@ export class SnapshotStruct extends BaseStruct { endNs: number = 0; dur: number = 0; name: string = ''; + aSize: number = 0; + categoryNameId: number = 0; textWidth: number = 0; value: number = 0; type: string = ''; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerSoInit.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerSoInit.ts index 9ad9548d51ed627f546680d6ac089bef36fd7ce4..1bb93b1e15cdbf86d1743642043676e064b38b10 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerSoInit.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerSoInit.ts @@ -15,14 +15,7 @@ import { ColorUtils } from '../../component/trace/base/ColorUtils.js'; import { TraceRow } from '../../component/trace/base/TraceRow.js'; -import { - BaseStruct, - isFrameContainPoint, - ns2x, - Render, - RequestMessage, - drawString, -} from './ProcedureWorkerCommon.js'; +import { BaseStruct, isFrameContainPoint, ns2x, Render, RequestMessage, drawString } from './ProcedureWorkerCommon.js'; export class SoRender extends Render { renderMainThread( @@ -85,7 +78,7 @@ export function soDataFilter( use: boolean ): void { if (use && soFilter.length > 0) { - for (let i = 0, len = soFilter.length ; i < len ; i++) { + for (let i = 0, len = soFilter.length; i < len; i++) { if ((soFilter[i].startTs || 0) + (soFilter[i].dur || 0) >= startNS && (soFilter[i].startTs || 0) <= endNS) { SoStruct.setSoFrame(soFilter[i], 0, startNS, endNS, totalNS, frame); } else { @@ -104,7 +97,7 @@ export function soDataFilter( }) .reduce((pre: any, current, index, arr) => { if (current.frame) { - (pre[`${ current.frame.x }-${ current.depth }`] = pre[`${ current.frame.x }-${ current.depth }`] || []).push(current); + (pre[`${current.frame.x}-${current.depth}`] = pre[`${current.frame.x}-${current.depth}`] || []).push(current); } return pre; }, {}); @@ -136,10 +129,7 @@ export class SoStruct extends BaseStruct { } else { x1 = 0; } - if ( - (soNode.startTs || 0) + (soNode.dur || 0) > startNS && - (soNode.startTs || 0) + (soNode.dur || 0) < endNS - ) { + if ((soNode.startTs || 0) + (soNode.dur || 0) > startNS && (soNode.startTs || 0) + (soNode.dur || 0) < endNS) { x2 = ns2x((soNode.startTs || 0) + (soNode.dur || 0), startNS, endNS, totalNS, frame); } else { x2 = frame.width; @@ -158,7 +148,6 @@ export class SoStruct extends BaseStruct { if (data.frame) { if (data.dur === undefined || data.dur === null) { } else { - ctx.globalAlpha = 1; ctx.fillStyle = ColorUtils.FUNC_COLOR[ColorUtils.hashFunc(data.soName || '', 0, ColorUtils.FUNC_COLOR.length)]; let textColor = ColorUtils.FUNC_COLOR[ColorUtils.hashFunc(data.soName || '', 0, ColorUtils.FUNC_COLOR.length)]; @@ -172,7 +161,7 @@ export class SoStruct extends BaseStruct { ctx.lineWidth = 1; ctx.strokeRect(data.frame.x, data.frame.y, data.frame.width, miniHeight - padding * 2); ctx.fillStyle = ColorUtils.funcTextColor(textColor); - drawString(ctx, `${ data.soName || '' }`, 5, data.frame, data); + drawString(ctx, `${data.soName || ''}`, 5, data.frame, data); } if (data === SoStruct.selectSoStruct) { ctx.strokeStyle = '#000'; @@ -182,7 +171,6 @@ export class SoStruct extends BaseStruct { } } } - } const padding = 1; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerTimeline.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerTimeline.ts index 76c94cb9e666357800b575f8080f6ed488f466ab..5d93c9b80b39e60ce5c09415daa2671e9b46e9a4 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerTimeline.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerTimeline.ts @@ -523,7 +523,7 @@ export class RangeRuler extends Graph { } else { this.range.xsTxt = []; } - if (timeLineYu != 0) { + if (timeLineYu !== 0) { let firstNodeWidth = ((this.scale - timeLineYu) / this.scale) * timeLineRealW; timeLineStartX += firstNodeWidth; tmpNs += timeLineYu; @@ -542,7 +542,7 @@ export class RangeRuler extends Graph { } } - private drawRangeSelection() { + private drawRangeSelection(): void { this.c.fillStyle = '#ffffff'; this.rangeRect.x = this.markA.frame.x < this.markB.frame.x ? this.markA.frame.x : this.markB.frame.x; this.rangeRect.width = Math.abs(this.markB.frame.x - this.markA.frame.x); diff --git a/ide/src/trace/database/ui-worker/ProduceWorkerSdkCounter.ts b/ide/src/trace/database/ui-worker/ProduceWorkerSdkCounter.ts index ee7a6887b117111a92cee01988fed2eab60d1fb5..807daaac5e4503dc83397ab42b55994a7a2b5f65 100644 --- a/ide/src/trace/database/ui-worker/ProduceWorkerSdkCounter.ts +++ b/ide/src/trace/database/ui-worker/ProduceWorkerSdkCounter.ts @@ -207,8 +207,8 @@ export class SdkCounterRender extends Render { CounterStruct.setCounterFrame(sdkCounterList[index], 5, startNS || 0, endNS || 0, totalNS || 0, frame); if ( index > 0 && - (sdkCounterList[index - 1].frame?.x || 0) == (sdkCounterList[index].frame?.x || 0) && - (sdkCounterList[index - 1].frame?.width || 0) == (sdkCounterList[index].frame?.width || 0) + (sdkCounterList[index - 1].frame?.x || 0) === (sdkCounterList[index].frame?.x || 0) && + (sdkCounterList[index - 1].frame?.width || 0) === (sdkCounterList[index].frame?.width || 0) ) { } else { sdkCounterFilters.push(item); diff --git a/ide/test/base-ui/table/LitTable.test.ts b/ide/test/base-ui/table/LitTable.test.ts index aefc33a4c349e91da6d2f6345de1370e101e380e..f88f2e725de5ddd073d23b2c33bf64dca813e953 100644 --- a/ide/test/base-ui/table/LitTable.test.ts +++ b/ide/test/base-ui/table/LitTable.test.ts @@ -325,38 +325,13 @@ describe('LitTable Test', () => { it('LitTableTest28', () => { document.body.innerHTML = ``; let litTable = document.querySelector('#aaa') as LitTable; - let tableColmn = document.createElement('lit-table-column') as LitTableColumn; - tableColmn.setAttribute('title', '0'); - tableColmn.setAttribute('data-index', '22'); - tableColmn.setAttribute('key', '22'); - tableColmn.setAttribute('align', 'flex-start'); - tableColmn.setAttribute('height', '321px'); - let tableColmn1 = document.createElement('lit-table-column') as LitTableColumn; - tableColmn1.setAttribute('title', '12'); - tableColmn1.setAttribute('data-index', '2'); - tableColmn1.setAttribute('key', '4'); - tableColmn1.setAttribute('align', 'flex-start'); - tableColmn1.setAttribute('height', '2px'); - litTable.tableColumns = [tableColmn, tableColmn1]; - litTable.columns = [tableColmn, tableColmn1]; - litTable.selectable = true; - litTable.ds = [ - { id: 1, pid: null, name: '1' }, - { id: 2, pid: 1, name: '2' }, - { id: 3, pid: 1, name: '3' }, - { id: 4, pid: null, name: '4' }, - { id: 5, pid: 4, name: '4' }, - { id: 6, pid: 4, name: '5' }, - { id: 7, pid: 3, name: '7' }, - { id: 8, pid: 4, name: '8' }, - ]; - expect(litTable.renderTreeTable()).toBeUndefined(); + expect(litTable.setMouseIn(true, [])).toBeUndefined(); }); it('LitTableTest29', () => { - document.body.innerHTML = ``; - let litTable = document.querySelector('#aaa') as LitTable; - expect(litTable.setMouseIn(true, [])).toBeUndefined(); + let tableIcon = document.createElement('lit-icon') as LitIcon; + let mouseClickEvent: MouseEvent = new MouseEvent('click', { movementX: 1, movementY: 2 }); + tableIcon.dispatchEvent(mouseClickEvent); }); it('LitTableTest30', () => { @@ -639,9 +614,4 @@ describe('LitTable Test', () => { it('LitTableTest50', () => { expect(litTable.clearAllHover({})).toBeUndefined(); }); - it('LitTableTest52', () => { - let tableIcon = document.createElement('lit-icon') as LitIcon; - let mouseClickEvent: MouseEvent = new MouseEvent('click', { movementX: 1, movementY: 2 }); - tableIcon.dispatchEvent(mouseClickEvent); - }); }); diff --git a/ide/test/trace/SpApplication.test.ts b/ide/test/trace/SpApplication.test.ts index 29dab57f4e4e06680b629e5c8f52dd957a4809fb..8397dc9bd39c61936ec91f028d3b2a77fe908b6c 100644 --- a/ide/test/trace/SpApplication.test.ts +++ b/ide/test/trace/SpApplication.test.ts @@ -25,6 +25,8 @@ window.IntersectionObserver = jest.fn().mockImplementation(intersectionObserverM // @ts-ignore import { SpApplication } from '../../dist/trace/SpApplication.js'; // @ts-ignore +import { LongTraceDBUtils } from '../../dist/trace/database/LongTraceDBUtils.js'; +// @ts-ignore window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ disconnect: jest.fn(), @@ -33,136 +35,106 @@ window.ResizeObserver = window.ResizeObserver || })); describe('spApplication Test', () => { + LongTraceDBUtils.getInstance().indexedDBHelp = jest.fn(()=>{}) + LongTraceDBUtils.getInstance().indexedDBHelp.open = jest.fn(()=>{}) + LongTraceDBUtils.getInstance().createDBAndTable = jest.fn(()=>{ + return { + then: Function + } + }) document.body.innerHTML = ''; + let spApplication = document.querySelector('#sss') as SpApplication; it('spApplicationTest01', function () { - let spApplication = document.querySelector('#sss') as SpApplication; spApplication.dark = true; expect(SpApplication.name).toEqual('SpApplication'); }); it('spApplicationTest02', function () { - let spApplication = document.querySelector('#sss') as SpApplication; spApplication.dark = false; expect(spApplication.dark).toBeFalsy(); }); it('spApplicationTest03', function () { - let element = document.querySelector('#sss') as SpApplication; - element.vs = true; - expect(element.vs).toBeTruthy(); + spApplication.vs = true; + expect(spApplication.vs).toBeTruthy(); }); it('spApplicationTest04', function () { - document.body.innerHTML = ''; - let ele = document.querySelector('#sss') as SpApplication; - ele.vs = false; - expect(ele.vs).toBeFalsy(); + spApplication.vs = false; + expect(spApplication.vs).toBeTruthy(); }); it('spApplicationTest05', function () { - let element = document.querySelector('#sss') as SpApplication; - element.server = true; - expect(element.server).toBeTruthy(); + spApplication.server = true; + expect(spApplication.server).toBeTruthy(); }); it('spApplicationTest06', function () { - let element = document.querySelector('#sss') as SpApplication; - element.server = false; - expect(element.server).toBeFalsy(); + spApplication.server = false; + expect(spApplication.server).toBeFalsy(); }); it('spApplicationTest07', function () { - let element = document.querySelector('#sss') as SpApplication; - element.querySql = true; - expect(element.querySql).toBeTruthy(); + spApplication.querySql = true; + expect(spApplication.querySql).toBeTruthy(); }); it('spApplicationTest08', function () { - let element = document.querySelector('#sss') as SpApplication; - element.querySql = false; - expect(element.querySql).toBeFalsy(); + spApplication.querySql = false; + expect(spApplication.querySql).toBeFalsy(); }); it('spApplicationTest09', function () { - let element = document.querySelector('#sss') as SpApplication; - element.search = true; - expect(element.search).toBeTruthy(); + spApplication.search = true; + expect(spApplication.search).toBeTruthy(); }); it('spApplicationTest10', function () { - let element = document.querySelector('#sss') as SpApplication; - element.search = false; - expect(element.search).toBeFalsy(); + spApplication.search = false; + expect(spApplication.search).toBeFalsy(); }); it('spApplicationTest11', function () { - let element = document.querySelector('#sss') as SpApplication; - expect(element.removeSkinListener([])).toBeUndefined(); + expect(spApplication.removeSkinListener([])).toBeUndefined(); }); it('spApplicationTest15', function () { - let spApplication = document.querySelector('#sss') as SpApplication; expect(spApplication.freshMenuDisable()).toBeUndefined(); }); it('spApplicationTest16', function () { - let spApplication = document.querySelector('#sss') as SpApplication; expect(spApplication.addSkinListener()).toBeUndefined(); }); it('spApplicationTest17', function () { - let spApplication = document.querySelector('#sss') as SpApplication; expect(spApplication.removeSkinListener()).toBeUndefined(); }); it('spApplicationTest18', function () { - let element = document.querySelector('#sss') as SpApplication; - element.dispatchEvent(new Event('dragleave')); + spApplication.dispatchEvent(new Event('dragleave')); }); it('spApplicationTest19', function () { - let element = document.querySelector('#sss') as SpApplication; - element.dispatchEvent(new Event('drop')); - SpApplication.removeSkinListener = jest.fn(() => undefined); - expect(element.removeSkinListener({})).toBeUndefined(); + spApplication.dispatchEvent(new Event('drop')); + spApplication.removeSkinListener = jest.fn(() => undefined); + expect(spApplication.removeSkinListener({})).toBeUndefined(); }); it('spApplicationTest21', function () { - let element = document.querySelector('#sss') as SpApplication; - expect(element.vsDownload()).toBeUndefined(); + expect(spApplication.vsDownload()).toBeUndefined(); }); it('spApplicationTest22', function () { - let spApplication = document.querySelector('#sss') as SpApplication; spApplication.showConten = false; expect(spApplication.showContent).toBeFalsy(); }); it('spApplicationTest26', function () { - let spApplication = document.querySelector('#sss') as SpApplication; spApplication.dark = false; spApplication.skinChangeArray = ['value']; expect(spApplication.dark).toBeFalsy(); }); - it('spApplicationTest27', function () { - document.body.innerHTML = ''; - let spApplication = document.querySelector('#ss') as SpApplication; - spApplication.dark = true; - spApplication.skinChange = jest.fn(() => true); - expect(spApplication.dark).toBeTruthy(); - }); - - it('spApplicationTest28', function () { - document.body.innerHTML = ''; - let spApplication = document.querySelector('#sp') as SpApplication; - spApplication.dark = false; - spApplication.skinChange2 = jest.fn(() => true); - expect(spApplication.dark).toBeFalsy(); - }); - it('spApplicationTest29', function () { - document.body.innerHTML = ''; - let spApplication = document.querySelector('#ap') as SpApplication; spApplication.querySql = false; expect(spApplication.querySql).toBeFalsy(); }); diff --git a/ide/test/trace/bean/AbilityMonitor.test.ts b/ide/test/trace/bean/AbilityMonitor.test.ts index 2fa48dbc3252c2f968b3abe7c60150f8de1af813..589364140a0ebbf4e6295351a7e294667872927a 100644 --- a/ide/test/trace/bean/AbilityMonitor.test.ts +++ b/ide/test/trace/bean/AbilityMonitor.test.ts @@ -23,6 +23,10 @@ import { Dma } from '../../../dist/trace/bean/AbilityMonitor.js'; +jest.mock('../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); + describe('AbilityMonitor Test', () => { let systemCpuSummary = new SystemCpuSummary(); let systemDiskIOSummary = new SystemDiskIOSummary(); diff --git a/ide/test/trace/component/SpRecordTrace.test.ts b/ide/test/trace/component/SpRecordTrace.test.ts index 81187de1b99954b89d858a4660c01a571a122d49..1822289050ea0f8997840f7bf610baee7ea24aa0 100644 --- a/ide/test/trace/component/SpRecordTrace.test.ts +++ b/ide/test/trace/component/SpRecordTrace.test.ts @@ -17,6 +17,11 @@ import { SpRecordTrace } from '../../../dist/trace/component/SpRecordTrace.js'; // @ts-ignore import { EventCenter } from '../../../dist/trace/component/trace/base/EventCenter.js'; +import '../../../dist/trace/SpApplication.js'; +// @ts-ignore +import { SpApplication } from '../../../dist/trace/SpApplication.js'; +// @ts-ignore +import { BaseElement } from '../../../dist/base-ui/BaseElement.js'; declare global { interface Window { SmartEvent: { @@ -54,11 +59,14 @@ window.ResizeObserver = unobserve: jest.fn(), })); +const intersectionObserverMock = () => ({ + observe: () => null, +}); +window.IntersectionObserver = jest.fn().mockImplementation(intersectionObserverMock); + describe('SpRecordTrace Test', () => { - document.body.innerHTML = ` - - `; - let spRecordTrace = document.querySelector('#aaa') as SpRecordTrace; + SpRecordTrace.patentNode = jest.fn(()=> document.createElement('div')) + let spRecordTrace = new SpRecordTrace(); it('SpRecordTraceTest01', function () { expect(SpRecordTrace.initHtml).not.toBe(''); }); diff --git a/ide/test/trace/component/trace/TimerShaftElement.test.ts b/ide/test/trace/component/trace/TimerShaftElement.test.ts index 06fbdd7152e2691828197f717cfd5a467bb2d074..406cdc5823c7d7c788bd18e4c8269bc218380e0a 100644 --- a/ide/test/trace/component/trace/TimerShaftElement.test.ts +++ b/ide/test/trace/component/trace/TimerShaftElement.test.ts @@ -16,6 +16,9 @@ jest.mock('../../../../dist/trace/component/trace/base/TraceRow.js', () => { return {}; }); +jest.mock('../../../../dist/trace/component/trace/base/ColorUtils.js', () => { + return {}; +}); // @ts-ignore import { TimerShaftElement, ns2s, ns2x } from '../../../../dist/trace/component/trace/TimerShaftElement.js'; @@ -71,17 +74,18 @@ describe('TimerShaftElement Test', () => { timerShaftElement.startNS = 1000; timerShaftElement.endNS = 2000; - timerShaftElement.cpuUsage = 'cpuUsage'; + timerShaftElement.cpuUsage = { + cpu:2, + ts: 251, + dur:125 + }; it('TimerShaftElementTest01', function () { - timerShaftElement.rangeRuler = jest.fn(() => true); - timerShaftElement.rangeRuler.cpuUsage = jest.fn(() => true); expect(timerShaftElement.cpuUsage).toBeUndefined(); }); it('TimerShaftElementTest03', function () { timerShaftElement.timeRuler = jest.fn(() => false); - timerShaftElement.rangeRuler = jest.fn(() => false); timerShaftElement.rangeRuler.getScale = jest.fn(() => true); timerShaftElement.timeRuler.frame = jest.fn(() => { return document.createElement('canvas') as HTMLCanvasElement; @@ -135,19 +139,16 @@ describe('TimerShaftElement Test', () => { }); it('TimerShaftElementTest21', function () { - timerShaftElement.rangeRuler = jest.fn(() => undefined); timerShaftElement.rangeRuler.setRangeNS = jest.fn(() => true); expect(timerShaftElement.setRangeNS()).toBeFalsy(); }); it('TimerShaftElementTest22', function () { - timerShaftElement.rangeRuler = jest.fn(() => undefined); timerShaftElement.rangeRuler.getRange = jest.fn(() => true); expect(timerShaftElement.getRange()).toBeTruthy(); }); it('TimerShaftElementTest23', function () { - timerShaftElement.rangeRuler = jest.fn(() => undefined); timerShaftElement.rangeRuler.frame = jest.fn(() => Rect); timerShaftElement.rangeRuler.frame.width = jest.fn(() => 1); timerShaftElement._sportRuler = jest.fn(() => undefined); @@ -186,7 +187,6 @@ describe('TimerShaftElement Test', () => { }); it('TimerShaftElementTest28', function () { - timerShaftElement.rangeRuler = jest.fn(() => undefined); timerShaftElement.rangeRuler.render = jest.fn(() => true); expect(timerShaftElement.render()).not.toBeUndefined(); }); @@ -196,7 +196,6 @@ describe('TimerShaftElement Test', () => { }); it('TimerShaftElementTest30', function () { - timerShaftElement.rangeRuler = jest.fn(() => true); timerShaftElement.rangeRuler.cpuUsage = jest.fn(() => true); expect(timerShaftElement.cpuUsage).toBe(undefined); }); @@ -207,7 +206,6 @@ describe('TimerShaftElement Test', () => { }); it('TimerShaftElementTest32', function () { - timerShaftElement.rangeRuler = jest.fn(() => true); expect(timerShaftElement.totalNS).toBe(1000); }); @@ -217,13 +215,11 @@ describe('TimerShaftElement Test', () => { }); it('TimerShaftElementTest35', function () { - timerShaftElement.rangeRuler = jest.fn(() => undefined); timerShaftElement.rangeRuler.cancelPressFrame = jest.fn(() => undefined); expect(timerShaftElement.cancelPressFrame()).toBeUndefined(); }); it('TimerShaftElementTest36', function () { - timerShaftElement.rangeRuler = jest.fn(() => undefined); timerShaftElement.rangeRuler.cancelUpFrame = jest.fn(() => undefined); expect(timerShaftElement.cancelUpFrame()).toBeUndefined(); }); diff --git a/ide/test/trace/component/trace/base/ColorUtils.test.ts b/ide/test/trace/component/trace/base/ColorUtils.test.ts index f4f6c5d30d298b3043c46e09623caab5c9be24f3..a957f19c2101a90336dc3d328bccd0f44dd0c649 100644 --- a/ide/test/trace/component/trace/base/ColorUtils.test.ts +++ b/ide/test/trace/component/trace/base/ColorUtils.test.ts @@ -29,16 +29,16 @@ describe('testColorUtils Test', () => { it('testColorUtils03', () => { // @ts-ignore let thread = { processId: 1 }; - expect(ColorUtils.colorForThread(thread)).toEqual('#9785D3'); + expect(ColorUtils.colorForThread(thread)).toEqual('#7a9160'); }); - it('testColorUtils03', () => { + it('testColorUtils05', () => { // @ts-ignore let thread = { processId: 0, tid: 1, }; - expect(ColorUtils.colorForThread(thread)).toEqual('#9785D3'); + expect(ColorUtils.colorForThread(thread)).toEqual('#7a9160'); }); it('testColorUtils04', () => { diff --git a/ide/test/trace/component/trace/base/RangeSelect.test.ts b/ide/test/trace/component/trace/base/RangeSelect.test.ts index f9182b93b6cc582fd752b5a27d6d5a5dc9526521..275ab3bc6d0871cf611bb345d7ad3ad4db9f7af5 100644 --- a/ide/test/trace/component/trace/base/RangeSelect.test.ts +++ b/ide/test/trace/component/trace/base/RangeSelect.test.ts @@ -17,10 +17,25 @@ import { RangeSelect } from '../../../../../dist/trace/component/trace/base/RangeSelect.js'; // @ts-ignore import { TraceRow } from '../../../../../dist/trace/component/trace/base/TraceRow.js'; +// @ts-ignore +import { SpSystemTrace } from '../../../../../dist/trace/component/SpSystemTrace.js'; jest.mock('../../../../../dist/trace/database/ui-worker/ProcedureWorker.js', () => { return {}; }); +const intersectionObserverMock = () => ({ + observe: () => null, +}); +window.IntersectionObserver = jest.fn().mockImplementation(intersectionObserverMock); + +window.ResizeObserver = + window.ResizeObserver || + jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), + })); + describe('RangeSelect Test', () => { beforeAll(() => {}); @@ -47,7 +62,7 @@ describe('RangeSelect Test', () => { expect(rangeSelect.isInRowsEl(mouseEvent)).toBeFalsy(); }); it('Utils Test09', () => { - let rangeSelect = new RangeSelect(); + let rangeSelect = new RangeSelect(new SpSystemTrace()); rangeSelect.rowsEL = document.createElement('div'); let mouseEvent = new MouseEvent('mousedown', { button: 0, @@ -128,7 +143,7 @@ describe('RangeSelect Test', () => { }); it('Utils Test08', () => { - let rangeSelect = new RangeSelect(); + let rangeSelect = new RangeSelect(new SpSystemTrace()); rangeSelect.isInRowsEl = jest.fn(() => true); rangeSelect.isDrag = jest.fn(() => true); rangeSelect.isMouseDown = true; @@ -177,7 +192,7 @@ describe('RangeSelect Test', () => { let rowElement = document.createElement('div'); rangeSelect.rowsPaneEL = rowElement; rangeSelect.favoriteRowsEL = rowElement; - let traceRowElement = document.createElement('trace-row') as TraceRow; + let traceRowElement = new TraceRow() expect(rangeSelect.mouseMove([traceRowElement], mouseEvent)).toBeUndefined(); }); @@ -260,7 +275,7 @@ describe('RangeSelect Test', () => { expect(rangeSelect.mouseOut(mouseEvent)).toBeUndefined(); }); it('Utils Test12', () => { - let rangeSelect = new RangeSelect(); + let rangeSelect = new RangeSelect(new SpSystemTrace()); rangeSelect.isInRowsEl = jest.fn(() => true); rangeSelect.isDrag = jest.fn(() => true); rangeSelect.isMouseDown = false; @@ -289,7 +304,7 @@ describe('RangeSelect Test', () => { let rowElement = document.createElement('div'); rangeSelect.rowsPaneEL = rowElement; rangeSelect.favoriteRowsEL = rowElement; - let traceRowElement = document.createElement('trace-row') as TraceRow; + let traceRowElement = new TraceRow(); rangeSelect.ns2x = jest.fn(() => 1); rangeSelect.mouseX = jest.fn(() => 10); rangeSelect.markA = jest.fn(() => 8); diff --git a/ide/test/trace/component/trace/base/TraceRow.test.ts b/ide/test/trace/component/trace/base/TraceRow.test.ts index 5f1a5803eeb1eab5d7aa27bc50042998a333f159..5fc6e4b2d0f3b661392debca1aa344fa5db9bd44 100644 --- a/ide/test/trace/component/trace/base/TraceRow.test.ts +++ b/ide/test/trace/component/trace/base/TraceRow.test.ts @@ -17,6 +17,8 @@ import { TraceRow } from '../../../../../dist/trace/component/trace/base/TraceRow.js'; // @ts-ignore import { Sptext } from '../../../../../dist/trace/component/Sptext.js'; +// @ts-ignore +import { ThreadStruct } from '../../../../../dist/trace/database/ui-worker/ProcedureWorkerThread.js'; jest.mock('../../../../../dist/trace/database/ui-worker/ProcedureWorker.js', () => { return {}; }); @@ -210,15 +212,6 @@ describe('TraceRow Test', () => { expect(traceRow.frame).toBeTruthy(); }); - it('TraceRow Test60', () => { - expect(traceRow.disabledCheck).not.toBeUndefined(); - }); - - it('TraceRow Test61', () => { - traceRow.disabledCheck = true; - expect(traceRow.disabledCheck).toBeTruthy(); - }); - it('TraceRow Test62', () => { expect(traceRow.folderPaddingLeft).toBeUndefined(); }); @@ -385,16 +378,9 @@ describe('TraceRow Test', () => { traceRow.expansion = false; expect(traceRow.expansion).toBeFalsy(); }); - it('TraceRow Test73', () => { - expect(traceRow.replaceTraceRow([],[])).toBeUndefined(); - }); it('TraceRow Test74', () => { - let child = [{ - parentRowEl:[], - }]; - // @ts-ignore - child.setAttribute = jest.fn(); - expect(traceRow.addChildTraceRowSpecifyLocation(child,[])).toBeUndefined(); + let threadRow = TraceRow.skeleton(); + expect(traceRow.addChildTraceRowSpecifyLocation(threadRow,0)).toBeUndefined(); }); it('TraceRow Test75', () => { expect(traceRow.drawLine(false,'top')).toBeUndefined(); diff --git a/ide/test/trace/component/trace/base/TraceSheet.test.ts b/ide/test/trace/component/trace/base/TraceSheet.test.ts index 90ec415f5d5c1d3294214d6ef134138507a43a30..0144613ac6984b79e60cc21c41b1adfc528950aa 100644 --- a/ide/test/trace/component/trace/base/TraceSheet.test.ts +++ b/ide/test/trace/component/trace/base/TraceSheet.test.ts @@ -17,7 +17,10 @@ import { TraceSheet } from '../../../../../dist/trace/component/trace/base/TraceSheet.js'; const sqlit = require('../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../dist/trace/database/SqlLite.js'); - +const intersectionObserverMock = () => ({ + observe: () => null, +}); +window.IntersectionObserver = jest.fn().mockImplementation(intersectionObserverMock); window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ @@ -76,6 +79,7 @@ describe('TraceSheet Test', () => { }, ], }; + document.body.innerHTML = ''; it('TraceSheet Test01', () => { let traceSheet = new TraceSheet(); expect(traceSheet).not.toBeUndefined(); diff --git a/ide/test/trace/component/trace/sheet/ability/TabPaneCpuAbility.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPaneCpuAbility.test.ts index 723df48e1ba3f1e772930d3f422ebdba56612c37..c603dba22b0fcad77d01c4e8810f3c1f9683ad2a 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPaneCpuAbility.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPaneCpuAbility.test.ts @@ -17,6 +17,10 @@ import { TabPaneCpuAbility } from '../../../../../../dist/trace/component/trace/ const sqlite = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/component/trace/sheet/SheetUtils.js', () => { + return {}; +}); + window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ diff --git a/ide/test/trace/component/trace/sheet/ability/TabPaneDiskAbility.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPaneDiskAbility.test.ts index 6e3ddee21019c6c5431a1e1d0e238970f516538a..f47c17753fd9cbbcdf20ed2a7801a99a68966b6b 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPaneDiskAbility.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPaneDiskAbility.test.ts @@ -14,6 +14,9 @@ */ //@ts-ignore import { TabPaneDiskAbility } from '../../../../../../dist/trace/component/trace/sheet/ability/TabPaneDiskAbility.js'; +jest.mock('../../../../../../dist/trace/component/trace/sheet/SheetUtils.js', () => { + return {}; +}); const sqlite = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); window.ResizeObserver = diff --git a/ide/test/trace/component/trace/sheet/ability/TabPaneDmaAbility.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPaneDmaAbility.test.ts index 792213e91c326f3b85dcb4f3094321a9cecc9c01..32396b0fb078565fa930728d46356eaa1883586d 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPaneDmaAbility.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPaneDmaAbility.test.ts @@ -14,6 +14,11 @@ */ // @ts-ignore import { TabPaneDmaAbility } from '../../../../../../dist/trace/component/trace/sheet/ability/TabPaneDmaAbility.js'; + +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); + // @ts-ignore window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ diff --git a/ide/test/trace/component/trace/sheet/ability/TabPaneDmaAbilityComparison.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPaneDmaAbilityComparison.test.ts index e94c29364fa285d4b0e95a774f6e530c9084f19b..b8f3b4a81f2ea8fe2aa47310ab687fccd905bdf0 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPaneDmaAbilityComparison.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPaneDmaAbilityComparison.test.ts @@ -25,6 +25,11 @@ jest.mock('../../../../../../dist/base-ui/table/lit-table.js', () => { snapshotDataSource: () => {}, }; }); + +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); + jest.mock('../../../../../../dist/js-heap/model/DatabaseStruct.js', () => {}); // @ts-ignore window.ResizeObserver = diff --git a/ide/test/trace/component/trace/sheet/ability/TabPaneGpuMemoryAbility.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPaneGpuMemoryAbility.test.ts index f0f7788f7ac0e9bc8676e7d884f98e2c001c27b1..118fe1428cb35eb5e5916f55e7bfbc4ea30e97ff 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPaneGpuMemoryAbility.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPaneGpuMemoryAbility.test.ts @@ -20,6 +20,9 @@ jest.mock('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/base-ui/table/lit-table.js', () => { return {} }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/js-heap/model/DatabaseStruct.js', () => {}); // @ts-ignore window.ResizeObserver = window.ResizeObserver || diff --git a/ide/test/trace/component/trace/sheet/ability/TabPaneGpuMemoryComparison.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPaneGpuMemoryComparison.test.ts index b60a0b649a152673b6354d86f6ab6d2addf6bb79..26f0e84214e64e9387e05b65138ba4847859cc42 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPaneGpuMemoryComparison.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPaneGpuMemoryComparison.test.ts @@ -19,6 +19,9 @@ jest.mock('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/base-ui/select/LitSelect.js', () => { return {}; }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/js-heap/model/DatabaseStruct.js', () => {}); // @ts-ignore window.ResizeObserver = diff --git a/ide/test/trace/component/trace/sheet/ability/TabPaneHistoryProcesses.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPaneHistoryProcesses.test.ts index 7e55e79195248e4e4ddaf7144bf458ddaf58f9dc..cd51444ee884c95313802ec0f4bec231afd144f3 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPaneHistoryProcesses.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPaneHistoryProcesses.test.ts @@ -16,6 +16,9 @@ import { TabPaneHistoryProcesses } from '../../../../../../dist/trace/component/trace/sheet/ability/TabPaneHistoryProcesses.js'; const sqlite = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ diff --git a/ide/test/trace/component/trace/sheet/ability/TabPaneLiveProcesses.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPaneLiveProcesses.test.ts index eda5cab24b4fb0f0fad1effcf3f125690db5eef0..01ca4df2bb32a7e5000df61edf5f1280d74080c9 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPaneLiveProcesses.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPaneLiveProcesses.test.ts @@ -16,6 +16,9 @@ import { TabPaneLiveProcesses } from '../../../../../../dist/trace/component/trace/sheet/ability/TabPaneLiveProcesses.js'; const sqlite = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/trace/database/ui-worker/ProcedureWorker.js', () => { return {}; }); diff --git a/ide/test/trace/component/trace/sheet/ability/TabPaneMemoryAbility.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPaneMemoryAbility.test.ts index 3a43a6e08cc35d88bc66155242c50afb4491e5d4..c78c99b69cbe3a7ae0f4b9f7805f155d80b42ad6 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPaneMemoryAbility.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPaneMemoryAbility.test.ts @@ -26,6 +26,9 @@ window.ResizeObserver = const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); describe('TabPaneMemoryAbility Test', () => { let tabPaneMemoryAbility = new TabPaneMemoryAbility(); diff --git a/ide/test/trace/component/trace/sheet/ability/TabPaneNetworkAbility.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPaneNetworkAbility.test.ts index 6451fc52cdddb10e39f7bb0302b11c8dffbc71f9..966a2db637045cb66c0677350ef882290edc9cc2 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPaneNetworkAbility.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPaneNetworkAbility.test.ts @@ -26,6 +26,9 @@ window.ResizeObserver = const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); describe('TabPaneNetworkAbility Test', () => { let tabPaneNetworkAbility = new TabPaneNetworkAbility(); diff --git a/ide/test/trace/component/trace/sheet/ability/TabPanePurgPin.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPanePurgPin.test.ts index a8b5e4e92382a185410b421a8f2abb5eb013f294..f6314a2fb9e79a06ccb8ca01c55a587bbc6f677e 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPanePurgPin.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPanePurgPin.test.ts @@ -17,6 +17,10 @@ import { TabPanePurgPin } from '../../../../../../dist/trace/component/trace/she const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); + // @ts-ignore window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ diff --git a/ide/test/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.test.ts index 11c0d96c64774f0f146e1932c9e635c152bf8eab..57ff6e20f2a95a5cd68ddaeb9002f8bf18c2bc74 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPanePurgPinComparisonAbility.test.ts @@ -27,6 +27,9 @@ jest.mock('../../../../../../dist/base-ui/select/LitSelect.js', () => { return {}; }); jest.mock('../../../../../../dist/js-heap/model/DatabaseStruct.js', () => {}); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); // @ts-ignore window.ResizeObserver = window.ResizeObserver || diff --git a/ide/test/trace/component/trace/sheet/ability/TabPanePurgTotal.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPanePurgTotal.test.ts index d83d3607dcdf54ec429969863b24eec9b9107fa5..112a6f58d3f95ac8c1f0bb22bd6bd96f09b2465f 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPanePurgTotal.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPanePurgTotal.test.ts @@ -17,6 +17,9 @@ import { TabPanePurgTotal } from '../../../../../../dist/trace/component/trace/s const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); // @ts-ignore window.ResizeObserver = window.ResizeObserver || diff --git a/ide/test/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.test.ts b/ide/test/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.test.ts index b1460997b642e99a997d49f7c0c5f914eb3165d3..672c2ee2af2364855cc014235c441c2fa2263792 100644 --- a/ide/test/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.test.ts +++ b/ide/test/trace/component/trace/sheet/ability/TabPanePurgTotalComparisonAbility.test.ts @@ -19,6 +19,9 @@ jest.mock('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/base-ui/select/LitSelect.js', () => { return {}; }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/base-ui/table/lit-table.js', () => { return { snapshotDataSource: () => {}, diff --git a/ide/test/trace/component/trace/sheet/clock/TabPaneClockCounter.test.ts b/ide/test/trace/component/trace/sheet/clock/TabPaneClockCounter.test.ts index 505199ec840c8b8759dccab53d518334058d557e..2fefc8418a68728010a77fcb5211012a1feda11c 100644 --- a/ide/test/trace/component/trace/sheet/clock/TabPaneClockCounter.test.ts +++ b/ide/test/trace/component/trace/sheet/clock/TabPaneClockCounter.test.ts @@ -15,6 +15,9 @@ // @ts-ignore import { TabPaneClockCounter } from '../../../../../../dist/trace/component/trace/sheet/clock/TabPaneClockCounter.js'; +jest.mock('../../../../../../dist/trace/component/trace/sheet/SheetUtils.js', () => { + return {}; +}); window.ResizeObserver = window.ResizeObserver || diff --git a/ide/test/trace/component/trace/sheet/cpu/TabPaneBoxChild.test.ts b/ide/test/trace/component/trace/sheet/cpu/TabPaneBoxChild.test.ts index 1ee94f22fa8212df353a874c93db35290bfd0b99..20fbc7805e4a6034b4c17c5ef6d7accee397ad90 100644 --- a/ide/test/trace/component/trace/sheet/cpu/TabPaneBoxChild.test.ts +++ b/ide/test/trace/component/trace/sheet/cpu/TabPaneBoxChild.test.ts @@ -18,6 +18,9 @@ import { TabPaneBoxChild } from '../../../../../../dist/trace/component/trace/sheet/cpu/TabPaneBoxChild.js'; const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); window.ResizeObserver = window.ResizeObserver || diff --git a/ide/test/trace/component/trace/sheet/cpu/TabPaneCounterSample.test.ts b/ide/test/trace/component/trace/sheet/cpu/TabPaneCounterSample.test.ts index 608a9ccece91e95acf9978c3e3b4308538c8bb62..bb05253d8a46115c304972585f10ce025c1143ee 100644 --- a/ide/test/trace/component/trace/sheet/cpu/TabPaneCounterSample.test.ts +++ b/ide/test/trace/component/trace/sheet/cpu/TabPaneCounterSample.test.ts @@ -17,6 +17,9 @@ import { TabPaneCounterSample } from '../../../../../../dist/trace/component/trace/sheet/cpu/TabPaneCounterSample.js'; // @ts-ignore import { SpSystemTrace } from '../../../../../../dist/trace/component/SpSystemTrace.js'; +jest.mock('../../../../../../dist/trace/component/trace/base/TraceRow.js', () => { + return {}; +}); // @ts-ignore import { LitTable } from '../../../../../../dist/base-ui/table/lit-table.js'; diff --git a/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuByProcess.test.ts b/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuByProcess.test.ts index 1c3ee3979aa4af8e6c7491b969ef74457826e97e..f3dd1cfcf27849e47aa985e9514442ff439765be 100644 --- a/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuByProcess.test.ts +++ b/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuByProcess.test.ts @@ -30,6 +30,9 @@ window.ResizeObserver = const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); describe('TabPaneCpuByProcess Test', () => { let tabPaneCpuByProcess = new TabPaneCpuByProcess(); diff --git a/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuByThread.test.ts b/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuByThread.test.ts index 468005244029458b93d63ab94fb0eb12f22a3985..7ec2419d9341e347928fbcbd7c1d7951d16aa1c1 100644 --- a/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuByThread.test.ts +++ b/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuByThread.test.ts @@ -26,6 +26,9 @@ window.ResizeObserver = const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); describe('TabPaneCpuByThread Test', () => { let tabPaneCpuByThread = new TabPaneCpuByThread(); diff --git a/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuUsage.test.ts b/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuUsage.test.ts index fb077a148225d832aa5907c2f45b1e184e4ed7a5..0ea76fd02ee9445659f042f0b4371f4f06a6b61b 100644 --- a/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuUsage.test.ts +++ b/ide/test/trace/component/trace/sheet/cpu/TabPaneCpuUsage.test.ts @@ -17,6 +17,9 @@ import { TabPaneCpuUsage } from '../../../../../../dist/trace/component/trace/sheet/cpu/TabPaneCpuUsage.js'; const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); window.ResizeObserver = window.ResizeObserver || diff --git a/ide/test/trace/component/trace/sheet/cpu/TabPaneFrequencySample.test.ts b/ide/test/trace/component/trace/sheet/cpu/TabPaneFrequencySample.test.ts index 308d2067b7c4a115ec33838fc14324bd14817788..fbaa55ad76eae469412092783b3e8048ed72eb65 100644 --- a/ide/test/trace/component/trace/sheet/cpu/TabPaneFrequencySample.test.ts +++ b/ide/test/trace/component/trace/sheet/cpu/TabPaneFrequencySample.test.ts @@ -15,6 +15,9 @@ // @ts-ignore import { TabPaneFrequencySample } from '../../../../../../dist/trace/component/trace/sheet/cpu/TabPaneFrequencySample.js'; +jest.mock('../../../../../../dist/trace/component/trace/base/TraceRow.js', () => { + return {}; +}); // @ts-ignore import { SpSystemTrace } from '../../../../../../dist/trace/component/SpSystemTrace.js'; // @ts-ignore diff --git a/ide/test/trace/component/trace/sheet/cpu/TabPaneSPT.test.ts b/ide/test/trace/component/trace/sheet/cpu/TabPaneSPT.test.ts index 12512a33a0b1b4dade79207047ba4e52330a1e33..fac30de073b1db04c7dc3224cb27a44d528fd6c4 100644 --- a/ide/test/trace/component/trace/sheet/cpu/TabPaneSPT.test.ts +++ b/ide/test/trace/component/trace/sheet/cpu/TabPaneSPT.test.ts @@ -23,6 +23,9 @@ import { LitTable } from '../../../../../../dist/base-ui/table/lit-table.js'; jest.mock('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/js-heap/model/DatabaseStruct.js', () => {}); const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); window.ResizeObserver = window.ResizeObserver || diff --git a/ide/test/trace/component/trace/sheet/fps/TabPaneCpuFreqLimits.test.ts b/ide/test/trace/component/trace/sheet/fps/TabPaneCpuFreqLimits.test.ts index e8ece1cf8ce3d7d859bee487bc06d27eda598d6b..8e68d25fb02c5707d17cae85ed69b2e99f736a91 100644 --- a/ide/test/trace/component/trace/sheet/fps/TabPaneCpuFreqLimits.test.ts +++ b/ide/test/trace/component/trace/sheet/fps/TabPaneCpuFreqLimits.test.ts @@ -16,6 +16,9 @@ import { TabPaneCpuFreqLimits } from '../../../../../../dist/trace/component/trace/sheet/freq/TabPaneCpuFreqLimits.js'; const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); // @ts-ignore window.ResizeObserver = diff --git a/ide/test/trace/component/trace/sheet/fps/TabPaneFps.test.ts b/ide/test/trace/component/trace/sheet/fps/TabPaneFps.test.ts index 1f7ff62cb88401cb408955f5744fcf777d23e9a8..1ee1de8babcb7c31e3116c2e7c4dca260f6232eb 100644 --- a/ide/test/trace/component/trace/sheet/fps/TabPaneFps.test.ts +++ b/ide/test/trace/component/trace/sheet/fps/TabPaneFps.test.ts @@ -17,6 +17,9 @@ import { TabPaneFps } from '../../../../../../dist/trace/component/trace/sheet/f const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/component/trace/sheet/SheetUtils.js', () => { + return {}; +}); window.ResizeObserver = window.ResizeObserver || jest.fn().mockImplementation(() => ({ diff --git a/ide/test/trace/component/trace/sheet/frame/TabPaneFrameDynamic.test.ts b/ide/test/trace/component/trace/sheet/frame/TabPaneFrameDynamic.test.ts index cb0e8ff1c0a4e4daeb8bf3fb24171d34cf1ee83d..0db213d31c5b8a66a550970ce21d18eaa361204a 100644 --- a/ide/test/trace/component/trace/sheet/frame/TabPaneFrameDynamic.test.ts +++ b/ide/test/trace/component/trace/sheet/frame/TabPaneFrameDynamic.test.ts @@ -16,6 +16,10 @@ // @ts-ignore import { TabPaneFrameDynamic } from '../../../../../../dist/trace/component/trace/sheet/frame/TabPaneFrameDynamic.js'; +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); + describe('TabPaneFrameDynamic Test', () => { let frameDynamic = new TabPaneFrameDynamic(); let frameDynamicParam = { diff --git a/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuClickSelect.test.ts b/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuClickSelect.test.ts index 3252eaca91d1dc9091ce37f506105c4a75a33d5d..227db99f45a536e8eeade0c30a1b4ad1a37f5eb4 100644 --- a/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuClickSelect.test.ts +++ b/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuClickSelect.test.ts @@ -18,6 +18,9 @@ import { TabPaneGpuClickSelect } from '../../../../../../dist/trace/component/tr jest.mock('../../../../../../dist/trace/database/ui-worker/ProcedureWorker.js', () => { return {}; }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); const sqlite = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/component/trace/sheet/gpu/TabPaneGpuClickSelectComparison.js', () => { diff --git a/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuTotalBoxSelect.test.ts b/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuTotalBoxSelect.test.ts index 0d37d22fc29d3ff51049cccd3921552e83774e60..f52b48fb23ef699b779de7e06a5a57e9e4852876 100644 --- a/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuTotalBoxSelect.test.ts +++ b/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuTotalBoxSelect.test.ts @@ -18,6 +18,9 @@ import { TabPaneGpuTotalBoxSelect } from '../../../../../../dist/trace/component jest.mock('../../../../../../dist/trace/database/ui-worker/ProcedureWorker.js', () => { return {}; }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); const sqlite = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); diff --git a/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuWindowBoxSelect.test.ts b/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuWindowBoxSelect.test.ts index 77eb930f31d34920ebec05c187b999d632e9000b..3fbcd6c9252e54a195e5976ef5cdb67cc93bfccd 100644 --- a/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuWindowBoxSelect.test.ts +++ b/ide/test/trace/component/trace/sheet/gpu/TabPaneGpuWindowBoxSelect.test.ts @@ -21,6 +21,10 @@ jest.mock('../../../../../../dist/trace/database/ui-worker/ProcedureWorker.js', return {}; }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); + // @ts-ignore window.ResizeObserver = window.ResizeObserver || diff --git a/ide/test/trace/component/trace/sheet/jank/TabPaneFrames.test.ts b/ide/test/trace/component/trace/sheet/jank/TabPaneFrames.test.ts index 292f7fdf74b1c59ff7291abb77aed8a635bc1744..238624dcd8f454b729bca2ff13b927de396ab5d8 100644 --- a/ide/test/trace/component/trace/sheet/jank/TabPaneFrames.test.ts +++ b/ide/test/trace/component/trace/sheet/jank/TabPaneFrames.test.ts @@ -13,6 +13,10 @@ * limitations under the License. */ +jest.mock('../../../../../../dist/trace/component/trace/sheet/SheetUtils.js', () => { + return {}; +}); + // @ts-ignore import { TabPaneFrames } from '../../../../../../dist/trace/component/trace/sheet/jank/TabPaneFrames.js'; diff --git a/ide/test/trace/component/trace/sheet/process/TabPaneCounter.test.ts b/ide/test/trace/component/trace/sheet/process/TabPaneCounter.test.ts index 8a90fde2313e701788591b17204dc6650315626f..997dadb822cb60f5e37b177d3535eed1fb9710b3 100644 --- a/ide/test/trace/component/trace/sheet/process/TabPaneCounter.test.ts +++ b/ide/test/trace/component/trace/sheet/process/TabPaneCounter.test.ts @@ -26,6 +26,9 @@ window.ResizeObserver = const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); describe('TabPaneCounter Test', () => { let tabPaneCounter = new TabPaneCounter(); it('TabPaneCounterTest01', function () { diff --git a/ide/test/trace/component/trace/sheet/process/TabPaneSlices.test.ts b/ide/test/trace/component/trace/sheet/process/TabPaneSlices.test.ts index 00de1753d4ac63ecc773477c558afd9c29a92077..71639abe11ab0e149df35696340872a7fe6bf9fe 100644 --- a/ide/test/trace/component/trace/sheet/process/TabPaneSlices.test.ts +++ b/ide/test/trace/component/trace/sheet/process/TabPaneSlices.test.ts @@ -27,6 +27,10 @@ window.ResizeObserver = unobserve: jest.fn(), })); +jest.mock('../../../../../../dist/trace/component/trace/base/TraceRow.js', () => { + return {}; +}); + describe('TabPaneSlices Test', () => { let tabPaneSlices = new TabPaneSlices(); sqlit.getTabSlicesAsyncFunc.mockResolvedValue([]); diff --git a/ide/test/trace/component/trace/sheet/process/TabPaneStartup.test.ts b/ide/test/trace/component/trace/sheet/process/TabPaneStartup.test.ts index adedda1edff1cac9bd4dd1447dfbe51d092e1b38..8566d431d7ed1ce640457b7f39d48ce492659699 100644 --- a/ide/test/trace/component/trace/sheet/process/TabPaneStartup.test.ts +++ b/ide/test/trace/component/trace/sheet/process/TabPaneStartup.test.ts @@ -26,7 +26,9 @@ window.ResizeObserver = const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); - +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/trace/database/ui-worker/ProcedureWorkerAppStartup.js', () => { return { AppStartupStruct: { diff --git a/ide/test/trace/component/trace/sheet/process/TabPaneStaticInit.test.ts b/ide/test/trace/component/trace/sheet/process/TabPaneStaticInit.test.ts index d93db176138ff4150a9257e02f5f13f40db9e772..34b3ffb15d71f19306505ac80bc2e2e69d42ca10 100644 --- a/ide/test/trace/component/trace/sheet/process/TabPaneStaticInit.test.ts +++ b/ide/test/trace/component/trace/sheet/process/TabPaneStaticInit.test.ts @@ -26,7 +26,9 @@ window.ResizeObserver = const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); - +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/trace/database/ui-worker/ProcedureWorkerAppStartup.js', () => { return { AppStartupStruct: { diff --git a/ide/test/trace/component/trace/sheet/process/TabPaneThreadStates.test.ts b/ide/test/trace/component/trace/sheet/process/TabPaneThreadStates.test.ts index c9f2ebe86743e0020544ff2d2cf7d6f00f6924bb..0ab3214917664fb29405b6207ae4f0934c9b194d 100644 --- a/ide/test/trace/component/trace/sheet/process/TabPaneThreadStates.test.ts +++ b/ide/test/trace/component/trace/sheet/process/TabPaneThreadStates.test.ts @@ -26,6 +26,9 @@ window.ResizeObserver = const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); describe('TabPaneThreadStates Test', () => { let tabPaneThreadStates = new TabPaneThreadStates(); diff --git a/ide/test/trace/component/trace/sheet/process/TabPaneThreadUsage.test.ts b/ide/test/trace/component/trace/sheet/process/TabPaneThreadUsage.test.ts index 6045eb53e1ed4c527b2ce5a1320afcd9f6d48fa8..7892a1d89f92ca88250cd968bab1601e125cc5da 100644 --- a/ide/test/trace/component/trace/sheet/process/TabPaneThreadUsage.test.ts +++ b/ide/test/trace/component/trace/sheet/process/TabPaneThreadUsage.test.ts @@ -26,6 +26,9 @@ window.ResizeObserver = const sqlit = require('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/trace/database/SqlLite.js'); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/trace/database/ui-worker/ProcedureWorkerCPU.js', () => { return { CpuStruct: { diff --git a/ide/test/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.test.ts b/ide/test/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.test.ts index 3454e92b0b165aae3608cd25bcef22ba5c8a2ce1..997dc7a549031e4072e2e2d69afdf5e4bccf2b51 100644 --- a/ide/test/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.test.ts +++ b/ide/test/trace/component/trace/sheet/smaps/TabPaneSmapsComparison.test.ts @@ -34,7 +34,9 @@ jest.mock('../../../../../../dist/js-heap/model/DatabaseStruct.js', () => {}); jest.mock('../../../../../../dist/base-ui/select/LitSelect.js', () => { return {}; }); - +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/trace/database/ui-worker/ProcedureWorker.js', () => { return {}; }); diff --git a/ide/test/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTrackerComparison.test.ts b/ide/test/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTrackerComparison.test.ts index 8e3cff74923a8c2e7c802cf0cfeeff06136e47dc..5daaddcb61f6a2057a928ef2cffcb2139a9b4d87 100644 --- a/ide/test/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTrackerComparison.test.ts +++ b/ide/test/trace/component/trace/sheet/vmtracker/TabPaneDmaVmTrackerComparison.test.ts @@ -19,6 +19,9 @@ jest.mock('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/base-ui/select/LitSelect.js', () => { return {}; }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/base-ui/table/lit-table.js', () => { return { snapshotDataSource: () => {}, diff --git a/ide/test/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.test.ts b/ide/test/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.test.ts index fb2b473fe1669cda75ba630e8d14a209e70dcf57..56fd14343f8b15ba7b1fdbbe04f02d9498064195 100644 --- a/ide/test/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.test.ts +++ b/ide/test/trace/component/trace/sheet/vmtracker/TabPaneGpuMemoryVmTrackerComparison.test.ts @@ -18,6 +18,9 @@ jest.mock('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/base-ui/select/LitSelect.js', () => { return {}; }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/js-heap/model/DatabaseStruct.js', () => {}); jest.mock('../../../../../../dist/base-ui/table/lit-table.js', () => { return { diff --git a/ide/test/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.test.ts b/ide/test/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.test.ts index d77d7bc1a587d876495ca412136070c4c582d7e6..b5a7b45d856ed00887cb6e807e438018a77c8045 100644 --- a/ide/test/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.test.ts +++ b/ide/test/trace/component/trace/sheet/vmtracker/TabPanePurgPinComparisonVM.test.ts @@ -19,6 +19,9 @@ jest.mock('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/base-ui/select/LitSelect.js', () => { return {}; }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/js-heap/model/DatabaseStruct.js', () => {}); jest.mock('../../../../../../dist/base-ui/table/lit-table.js', () => { return { diff --git a/ide/test/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.test.ts b/ide/test/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.test.ts index 1e15d28a14881b57514c4ca3f1743898f2bfc287..16ff4b6e7cbe5ae5a5839c4dd815c23a674848c6 100644 --- a/ide/test/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.test.ts +++ b/ide/test/trace/component/trace/sheet/vmtracker/TabPanePurgTotalComparisonVM.test.ts @@ -21,6 +21,9 @@ jest.mock('../../../../../../dist/trace/database/SqlLite.js'); jest.mock('../../../../../../dist/base-ui/select/LitSelect.js', () => { return {}; }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/js-heap/model/DatabaseStruct.js', () => {}); jest.mock('../../../../../../dist/base-ui/table/lit-table.js', () => { return { diff --git a/ide/test/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.test.ts b/ide/test/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.test.ts index 477974cc2dfe3aabcac494feeddd7328ec45caeb..050c5fa38afbbd061fbe48067c76099482ae0c3a 100644 --- a/ide/test/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.test.ts +++ b/ide/test/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.test.ts @@ -30,6 +30,9 @@ jest.mock('../../../../../../dist/js-heap/model/DatabaseStruct.js', () => {}); jest.mock('../../../../../../dist/trace/component/trace/base/TraceRow.js', () => { return {}; }); +jest.mock('../../../../../../dist/trace/bean/NativeHook.js', () => { + return {}; +}); jest.mock('../../../../../../dist/trace/database/ui-worker/ProcedureWorkerCommon.js', () => { return { ns2s: () => {}, diff --git a/ide/test/trace/component/trace/timer-shaft/RangeRuler.test.ts b/ide/test/trace/component/trace/timer-shaft/RangeRuler.test.ts index db06e38e126b535346dac99a950264439477ba34..befcc68067edb7632807533b97130a1db882098b 100644 --- a/ide/test/trace/component/trace/timer-shaft/RangeRuler.test.ts +++ b/ide/test/trace/component/trace/timer-shaft/RangeRuler.test.ts @@ -17,19 +17,35 @@ import { RangeRuler } from '../../../../../dist/trace/component/trace/timer-shaft/RangeRuler.js'; // @ts-ignore import { Mark } from '../../../../../dist/trace/component/trace/timer-shaft/RangeRuler.js'; -import { TimerShaftElement } from '../../../../../src/trace/component/trace/TimerShaftElement'; +// @ts-ignore +import { TimerShaftElement } from '../../../../../dist/trace/component/trace/TimerShaftElement.js'; +// @ts-ignore +import { SpSystemTrace } from '../../../../../dist/trace/component/SpSystemTrace.js'; jest.mock('../../../../../dist/trace/database/ui-worker/ProcedureWorker.js', () => { return {}; }); +const intersectionObserverMock = () => ({ + observe: () => null, +}); +window.IntersectionObserver = jest.fn().mockImplementation(intersectionObserverMock); +window.ResizeObserver = + window.ResizeObserver || + jest.fn().mockImplementation(() => ({ + disconnect: jest.fn(), + observe: jest.fn(), + unobserve: jest.fn(), + })); + describe('RangeRuler Test', () => { const canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; const ctx = canvas.getContext('2d'); - document.body.innerHTML = ''; + document.body.innerHTML = '' + + ''; let timerShaftElement = document.querySelector('#timerShaftEL') as TimerShaftElement; @@ -228,7 +244,7 @@ describe('RangeRuler Test', () => { expect( rangeRuler.mouseMove({ key: '', - }) + }, new SpSystemTrace()) ).toBeUndefined(); }); diff --git a/ide/test/trace/component/trace/timer-shaft/TabPaneFlag.test.ts b/ide/test/trace/component/trace/timer-shaft/TabPaneFlag.test.ts index 08b34f34a5e5bdbd29a4baa65701846243fcbb5d..f6c90b963336454d8b6960b61d81b1dc12446aee 100644 --- a/ide/test/trace/component/trace/timer-shaft/TabPaneFlag.test.ts +++ b/ide/test/trace/component/trace/timer-shaft/TabPaneFlag.test.ts @@ -43,19 +43,4 @@ describe('TabPaneFlag Test', () => { it('TabPaneFlagTest02', function () { expect(tabPaneFlag.initHtml()).not.toBe(''); }); - - it('TabPaneFlagTest03', function () { - expect( - tabPaneFlag.setFlagObj({ - x: 0, - y: 0, - width: 0, - height: 0, - time: 0, - color: '', - selected: false, - text: '', - }) - ).toBeUndefined(); - }); }); diff --git a/ide/test/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.test.ts b/ide/test/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.test.ts index 85c743b3afcc2e4c1502044594700e18ae7c9dab..ae6f7b844ad1d2b8aa3c63c51a137397ba7b469a 100644 --- a/ide/test/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.test.ts +++ b/ide/test/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.test.ts @@ -326,6 +326,8 @@ describe('ProcedureLogicWorkerFileSystem Test', () => { selfDur: 1, self: 1, count: 1, + tsArray: [], + durArray: [] }; let callChain = { ip: '', diff --git a/ide/test/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.test.ts b/ide/test/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.test.ts index b7b20440f7bcdd0646af0e23948948666ebfafdc..cfdf537e8cc6bdc6f4ab5073da24088c7edbf9c9 100644 --- a/ide/test/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.test.ts +++ b/ide/test/trace/database/logic-worker/ProcedureLogicWorkerNativeNemory.test.ts @@ -156,8 +156,10 @@ describe('ProcedureLogicWorkerNativeNemory Test', () => { heapSizeStr: '', heapPercent: '56%', tsArray: [], + countArray: [] }; - expect(procedureLogicWorkerNativeMemory.traverseTree(stack, 1)).toBeUndefined(); + expect(procedureLogicWorkerNativeMemory. + traverseTree(stack, {countArray: [],startTs: 23, tsArray: [],count: 0})).toBeUndefined(); }); it('ProcedureLogicWorkerNativeNemoryTest16', function () { @@ -172,8 +174,9 @@ describe('ProcedureLogicWorkerNativeNemory Test', () => { heapSizeStr: '', heapPercent: '12%', tsArray: [], + countArray: [] }; - expect(procedureLogicWorkerNativeMemory.traverseSampleTree(stack, 1)).toBeUndefined(); + expect(procedureLogicWorkerNativeMemory.traverseSampleTree(stack, {countArray: [],startTs: 23, tsArray: [],count: 0})).toBeUndefined(); }); it('procedureLogicWorkerFileSystemTest18', function () { @@ -810,6 +813,8 @@ describe('ProcedureLogicWorkerNativeNemory Test', () => { it('procedureLogicWorkerFileSystemTest87', function () { let currentNode = { symbol: '', + countArray: [], + tsArray: [] }; expect(NativeHookCallInfo.merageCallChainSample(currentNode, [], [])); }); diff --git a/ide/test/trace/database/logic-worker/ProcedureLogicWorkerPerf.test.ts b/ide/test/trace/database/logic-worker/ProcedureLogicWorkerPerf.test.ts index 671e32844370414c2ac50bdc5989bfc719f2a9bd..13edfb9733d3bdb4b79fbbb56ab45207cc824803 100644 --- a/ide/test/trace/database/logic-worker/ProcedureLogicWorkerPerf.test.ts +++ b/ide/test/trace/database/logic-worker/ProcedureLogicWorkerPerf.test.ts @@ -417,10 +417,13 @@ describe('ProcedureLogicWorkerPerf Test', () => { let perfCallChainMerageData = new PerfCallChainMerageData(); expect(perfCallChainMerageData.constructor()).toEqual({ addr: '', + parent: undefined, canCharge: true, children: [], count: 0, - currentTreeParentNode: undefined, + countArray: [], + durArray: [], + tsArray: [], depth: 0, dur: 0, id: '', @@ -754,16 +757,18 @@ describe('ProcedureLogicWorkerPerf Test', () => { window.postMessage = jest.fn(() => true); let perfBottomUpStruct = { addChildren: jest.fn(() => true), + tsArray: [] }; - expect(procedureLogicWorkerPerf.copyParentNode(perfBottomUpStruct, { parentNode: 1 })).toBeUndefined(); + expect(procedureLogicWorkerPerf.copyParentNode(perfBottomUpStruct, { parentNode: 1 ,tsArray: []})).toBeUndefined(); }); it('ProcedureLogicWorkerPerfTest75', function () { let procedureLogicWorkerPerf = new ProcedureLogicWorkerPerf(); window.postMessage = jest.fn(() => true); let perfBottomUpStruct = { addChildren: jest.fn(() => true), + tsArray: [] }; - expect(procedureLogicWorkerPerf.copyParentNode(perfBottomUpStruct, { parentNode: 1 })).toBeUndefined(); + expect(procedureLogicWorkerPerf.copyParentNode(perfBottomUpStruct, { parentNode: 1, tsArray: []})).toBeUndefined(); }); it('PerfCallChainTest76', function () { expect(PerfCallChain.setNextNode([], [])); @@ -788,12 +793,15 @@ describe('ProcedureLogicWorkerPerf Test', () => { it('PerfCallChainTest80', function () { let currentNode = { symbolName: '', + tsArray: [] }; let callChain = { vaddrInFile: { toString: jest.fn(() => true), }, }; - expect(PerfCallChainMerageData.merageCallChainSample(currentNode, callChain, [], true)); + expect(PerfCallChainMerageData.merageCallChainSample(currentNode, callChain, { + ts: '' + }, true)); }); }); diff --git a/trace_streamer/doc/des_tables.md b/trace_streamer/doc/des_tables.md index 79d9d4f1199777ca99cc95f7028629495045c1ca..888a1f169384bf83fcdb9e208b8c2d6843777667 100755 --- a/trace_streamer/doc/des_tables.md +++ b/trace_streamer/doc/des_tables.md @@ -1512,22 +1512,22 @@ js_heap_sample:记录timeline的时间轴信息 'R', Runnable状态 "S", interruptible sleep "D", uninterruptible sleep -"D-IO", uninterruptible io -"D-NIO", uninterruptible nio -"Runing", Runing状态 -"I", interrupted -"T", Traced +"D-IO", uninterruptible io +"D-NIO", uninterruptible nio +"Runing", Runing状态 +"T", Task stoped. +"t" Traced. "X", ExitedDead "Z", Zombie -"I", CloneThread -"I", TaskKilled +"P", Parked +"I", Task_Dead "DK", "DK-IO", "DK-NIO", -"TK", TracedKill -"R", WakeKill -"P", Parked -"R+", ForeGround +"TK", TracedKill +"R+", WakeKill +"R+", TaskNew +"R-B", Task runnable binder. ``` ### clock_snapshot表 diff --git a/trace_streamer/format-code.sh b/trace_streamer/format-code.sh index 45c761f7a0e110cea88eceb8d227277b15f89d9c..82e28c637e5f48d86b661eefd4f9624961c6e66b 100755 --- a/trace_streamer/format-code.sh +++ b/trace_streamer/format-code.sh @@ -27,10 +27,19 @@ cd ${PRJ_ROOT_DIR} FORMAT_DIR_LIST=( "${PRJ_ROOT_DIR}/build" "${PRJ_ROOT_DIR}/gn" - "${PRJ_ROOT_DIR}/prebuilts" "${PRJ_ROOT_DIR}/sdk" "${PRJ_ROOT_DIR}/src" "${PRJ_ROOT_DIR}/test" + "${PRJ_ROOT_DIR}/prebuilts/fuzz" + "${PRJ_ROOT_DIR}/prebuilts/linux" + "${PRJ_ROOT_DIR}/prebuilts/macx" + "${PRJ_ROOT_DIR}/prebuilts/patch_bounds_checking_function" + "${PRJ_ROOT_DIR}/prebuilts/patch_googletest" + "${PRJ_ROOT_DIR}/prebuilts/patch_hiperf" + "${PRJ_ROOT_DIR}/prebuilts/patch_libunwind" + "${PRJ_ROOT_DIR}/prebuilts/patch_perf_event" + "${PRJ_ROOT_DIR}/prebuilts/patch_protobuf" + "${PRJ_ROOT_DIR}/prebuilts/patch_sqlite" ) echo "formatting code ..." for d in ${FORMAT_DIR_LIST[@]}; do diff --git a/trace_streamer/src/base/ts_common.h b/trace_streamer/src/base/ts_common.h index 0242bfa58be09e2daabe06255e6630497b225754..faf7abd0dfda9e04713be998e4c3945d061839ef 100644 --- a/trace_streamer/src/base/ts_common.h +++ b/trace_streamer/src/base/ts_common.h @@ -23,6 +23,7 @@ using ClockId = uint32_t; const std::string INVALID_STRING = "INVALID_STRING"; const uint64_t INVALID_ITID = std::numeric_limits::max(); +const uint64_t INVALID_IPID = std::numeric_limits::max(); const uint64_t INVALID_UINT64 = std::numeric_limits::max(); const uint64_t MAX_UINT32 = std::numeric_limits::max(); const uint64_t MAX_UINT64 = std::numeric_limits::max(); @@ -135,34 +136,41 @@ enum EndState { // (D) Indicates that the process is in deep sleep, waiting for resources, and does not respond to signals. // Typical scenario: process acquisition semaphore blocking. TASK_UNINTERRUPTIBLE = 2, + // (D-IO) TASK_UNINTERRUPTIBLE_IO = 21, + // (D-NIO) TASK_UNINTERRUPTIBLE_NIO = 22, // (Running) Indicates that the thread is running TASK_RUNNING = 3, - // (I) Thread in interrupt state - TASK_INTERRUPTED = 4, - // (T) Task being traced + // (T) Thread in interrupt state + TASK_STOPPED = 4, + // (t) Task being traced TASK_TRACED = 8, // (X) Exit status, the process is about to be destroyed. TASK_EXIT_DEAD = 16, // (Z) Zombie state TASK_ZOMBIE = 32, + // (P) TASK_PARKED = 64, - // (K) Process killed - TASK_KILLED = 128, + // (I) Process killed + TASK_DEAD = 128, // (DK) TASK_DK = 130, + // (DK-IO) TASK_DK_IO = 131, + // (DK-NIO) TASK_DK_NIO = 132, - // the process is being debug now + // (tK)the process is being debug now TASK_TRACED_KILL = 136, - // (W) The process is in a deep sleep state and will be killed directly after waking up + // (R+) The process is in a deep sleep state and will be killed directly after waking up TASK_WAKEKILL = 256, + // TASK_WAKING = 512 (R) waking dont use for Runable state + // TASK_NOLOAD = 1024 // (R+) Process groups in the foreground - TASK_FOREGROUND = 2048, + TASK_NEW = 2048, TASK_RUNNABLE_BINDER = 2049, TASK_MAX = 4096, - TASK_INVALID = 9999 + TASK_INVALID = 0x8000 }; enum TSLogLevel { TS_DEBUG = 68, // Debug diff --git a/trace_streamer/src/cfg/trace_streamer_config.cpp b/trace_streamer/src/cfg/trace_streamer_config.cpp index f4822b5d9943f4782c45fc08760dc9707427d001..316e82c9b7e7b7a831ff252e68e7dd5f40f71cdd 100644 --- a/trace_streamer/src/cfg/trace_streamer_config.cpp +++ b/trace_streamer/src/cfg/trace_streamer_config.cpp @@ -43,7 +43,7 @@ TraceStreamerConfig::TraceStreamerConfig() {MEM_VM_SWAP, MEM_INFO_SWAP_DESC}, {MEM_VM_LOCKED, MEM_INFO_VIRT_DESC}, {MEM_VM_HWM, MEM_INFO_HWM_DESC}, {MEM_OOM_SCORE_ADJ, MEM_INFO_SCORE_ADJ_DESC}, {MEM_PURG_SUM, MEM_INFO_PURG_SUM_DESC}, {MEM_PURG_PIN, MEM_INFO_PURG_PIN_DESC}, - {MEM_GL_PSS, MEM_INFO_GL_PSS_DESC}, + {MEM_GL_PSS, MEM_INFO_GL_PSS_DESC}, {MEM_GRAPH_PSS, MEM_INFO_GRAPH_PSS_DESC}, }; InitSysMemMap(); @@ -180,6 +180,7 @@ void TraceStreamerConfig::InitEventNameMap() {TRACE_DMAMEM, TRACE_ACTION_DMAMEM}, {TRACE_GPU_PROCESS_MEM, TRACE_ACTION_GPU_PROCESS_MEM}, {TRACE_GPU_WINDOW_MEM, TRACE_ACTION_GPU_WINDOW_MEM}, + {TRACE_WINDOW_MANAGER_SERVICE, TRACE_ACTION_WINDOW_MANAGER_SERVICE}, {TRACE_VSYNC, TRACE_ACTION_VSYNC}, {TRACE_ON_DO_COMPOSITION, TRACE_ACTION_ON_DO_COMPOSITION}, {TRACE_FRAMEQUEUE, TRACE_ACTION_FRAMEQUEUE}, @@ -1226,6 +1227,16 @@ void TraceStreamerConfig::InitSecurityMap() {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, }, }, + { + TRACE_WINDOW_MANAGER_SERVICE, + { + {STAT_EVENT_RECEIVED, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_DATA_LOST, STAT_SEVERITY_LEVEL_ERROR}, + {STAT_EVENT_NOTMATCH, STAT_SEVERITY_LEVEL_INFO}, + {STAT_EVENT_NOTSUPPORTED, STAT_SEVERITY_LEVEL_WARN}, + {STAT_EVENT_DATA_INVALID, STAT_SEVERITY_LEVEL_ERROR}, + }, + }, { TRACE_VSYNC, { diff --git a/trace_streamer/src/cfg/trace_streamer_config.h b/trace_streamer/src/cfg/trace_streamer_config.h index 033a85062d1a79de8ca3553bf5957a5137b7571f..7789bd8a8e9b64aea33001367114ca9995368d34 100644 --- a/trace_streamer/src/cfg/trace_streamer_config.h +++ b/trace_streamer/src/cfg/trace_streamer_config.h @@ -114,6 +114,7 @@ enum SupportedTraceEventType { TRACE_DMAMEM, TRACE_GPU_PROCESS_MEM, TRACE_GPU_WINDOW_MEM, + TRACE_WINDOW_MANAGER_SERVICE, TRACE_EVENT_OTHER, TRACE_EVENT_MAX }; @@ -130,6 +131,7 @@ enum MemInfoType { MEM_PURG_SUM, MEM_PURG_PIN, MEM_GL_PSS, + MEM_GRAPH_PSS, MEM_MAX }; enum StatType { @@ -288,6 +290,7 @@ private: const std::string TRACE_ACTION_DMAMEM = "trace_dma_mem"; const std::string TRACE_ACTION_GPU_PROCESS_MEM = "trace_gpu_process_mem"; const std::string TRACE_ACTION_GPU_WINDOW_MEM = "trace_gpu_window_mem"; + const std::string TRACE_ACTION_WINDOW_MANAGER_SERVICE = "trace_window_manager_service"; const std::string TRACE_ACTION_OTHER = "other"; const std::string MEM_INFO_VM_SIZE_DESC = "mem.vm.size"; @@ -303,6 +306,7 @@ private: const std::string MEM_INFO_PURG_SUM_DESC = "mem.purg_sum"; const std::string MEM_INFO_PURG_PIN_DESC = "mem.purg_pin"; const std::string MEM_INFO_GL_PSS_DESC = "mem.gl_pss"; + const std::string MEM_INFO_GRAPH_PSS_DESC = "mem.graph_pss"; const std::string SYS_MEMINFO_UNSPECIFIED_DESC = "sys.mem.unspecified"; const std::string SYS_MEMINFO_MEM_TOTAL_DESC = "sys.mem.total"; @@ -342,6 +346,7 @@ private: const std::string SYS_MEMINFO_ACTIVE_PURG_DESC = "sys.mem.active.purg"; const std::string SYS_MEMINFO_INACTIVE_PURG_DESC = "sys.mem.inactive.purg"; const std::string SYS_MEMINFO_PINED_PURG_DESC = "sys.mem.pined.purg"; + const std::string SYS_VMEMINFO_UNSPECIFIED_DESC = "sys.virtual.mem.unspecified"; const std::string SYS_VMEMINFO_NR_FREE_PAGES_DESC = "sys.virtual.mem.nr.free.pages"; const std::string SYS_VMEMINFO_NR_ALLOC_BATCH_DESC = "sys.virtual.mem.nr.alloc.batch"; diff --git a/trace_streamer/src/filter/animation_filter.cpp b/trace_streamer/src/filter/animation_filter.cpp index d70fd2990ca8e8d9568046cfecdfcc250cadbc4c..914d61d446b04ea330248fa262e319d336eee5b1 100644 --- a/trace_streamer/src/filter/animation_filter.cpp +++ b/trace_streamer/src/filter/animation_filter.cpp @@ -112,7 +112,8 @@ bool AnimationFilter::BeginDynamicFrameEvent(const TracePoint& point, size_t cal auto animationRow = iter->second; auto curRealFrameRate = SplitStringToVec(infos.front(), " ").back(); auto curFrameNum = "0:"; - traceDataCache_->GetAnimation()->UpdateFrameInfo(animationRow, traceDataCache_->GetDataIndex(curFrameNum + curRealFrameRate)); + traceDataCache_->GetAnimation()->UpdateFrameInfo(animationRow, + traceDataCache_->GetDataIndex(curFrameNum + curRealFrameRate)); return true; } else if (!StartWith(point.name_, frameBeginCmd_)) { return false; diff --git a/trace_streamer/src/filter/cpu_filter.cpp b/trace_streamer/src/filter/cpu_filter.cpp index 79fd98df91b56a4eeeefe74b6102ef6f127cecf6..ea5288ccf24d99a4597f0afd4c2aab8d5a9e0d2f 100644 --- a/trace_streamer/src/filter/cpu_filter.cpp +++ b/trace_streamer/src/filter/cpu_filter.cpp @@ -98,10 +98,10 @@ void CpuFilter::InsertSwitchEvent(uint64_t ts, ts, INVALID_TIME, INVALID_CPU, prevPid, prevState); btInfo.threadStateRow = threadStateRow; if (prevState == TASK_UNINTERRUPTIBLE || prevState == TASK_DK) { - if (!pidToThreadSliceRow.count(prevPid)) { - pidToThreadSliceRow.emplace(std::make_pair(prevPid, threadStateRow)); + if (!pidToThreadSliceRow_.count(prevPid)) { + pidToThreadSliceRow_.emplace(std::make_pair(prevPid, threadStateRow)); } else { - pidToThreadSliceRow.at(prevPid) = threadStateRow; + pidToThreadSliceRow_.at(prevPid) = threadStateRow; } } (void)RemberInternalTidInStateTable(prevPid, threadStateRow, prevState); @@ -110,7 +110,7 @@ void CpuFilter::InsertSwitchEvent(uint64_t ts, if (traceDataCache_->BinderRunnableTraceEnabled() && iTidToTransaction_.find(prevPid) != iTidToTransaction_.end()) { uint64_t transactionId = iTidToTransaction_.at(prevPid); auto iter = transactionIdToInfo_.find(transactionId); - if (prevState != TASK_FOREGROUND || iter == transactionIdToInfo_.end() || iter->second.iTidFrom != prevPid || + if (prevState != TASK_NEW || iter == transactionIdToInfo_.end() || iter->second.iTidFrom != prevPid || btInfo.schedSliceRow == INVALID_UINT64 || btInfo.threadStateRow == INVALID_UINT64) { TransactionClear(prevState, transactionId); return; @@ -126,7 +126,7 @@ bool CpuFilter::InsertBlockedReasonEvent(uint64_t ts, DataIndex caller, uint32_t delay) { - if (pidToThreadSliceRow.count(iTid)) { + if (pidToThreadSliceRow_.count(iTid)) { // ArgSet ArgsSet args; args.AppendArg(ioWait_, BASE_DATA_TYPE_INT, iowait); @@ -135,7 +135,7 @@ bool CpuFilter::InsertBlockedReasonEvent(uint64_t ts, args.AppendArg(delay_, BASE_DATA_TYPE_INT, delay); } auto argSetId = streamFilters_->argsFilter_->NewArgs(args); - auto row = pidToThreadSliceRow.at(iTid); + auto row = pidToThreadSliceRow_.at(iTid); traceDataCache_->GetThreadStateData()->SetArgSetId(row, argSetId); if (iowait) { auto state = traceDataCache_->GetThreadStateData()->StatesData()[row]; @@ -152,7 +152,7 @@ bool CpuFilter::InsertBlockedReasonEvent(uint64_t ts, traceDataCache_->GetThreadStateData()->UpdateState(row, TASK_DK_NIO); } } - pidToThreadSliceRow.erase(iTid); + pidToThreadSliceRow_.erase(iTid); } return true; } @@ -211,8 +211,8 @@ void CpuFilter::Finish() const auto slice = traceDataCache_->GetConstSchedSliceData(); size = slice.Size(); for (auto i = 0; i < size; i++) { - traceDataCache_->GetSchedSliceData()->ReviseInternalPid(i, - traceDataCache_->GetThreadData(slice.InternalTidsData()[i])->internalPid_); + traceDataCache_->GetSchedSliceData()->ReviseInternalPid( + i, traceDataCache_->GetThreadData(slice.InternalTidsData()[i])->internalPid_); } } void CpuFilter::Clear() @@ -241,24 +241,24 @@ uint64_t CpuFilter::RemberInternalTidInStateTable(uint32_t uid, uint64_t row, ui } uint64_t CpuFilter::RowOfInternalTidInStateTable(uint32_t uid) const { - auto row = internalTidToRowThreadState_.find(uid); - if (row != internalTidToRowThreadState_.end()) { - return (*row).second.row_; + auto itor = internalTidToRowThreadState_.find(uid); + if (itor != internalTidToRowThreadState_.end()) { + return (*itor).second.row_; } return INVALID_UINT64; } void CpuFilter::ClearInternalTidInStateTable(uint32_t uid) { - auto row = internalTidToRowThreadState_.find(uid); - if (row != internalTidToRowThreadState_.end()) { - internalTidToRowThreadState_.erase(row); + auto itor = internalTidToRowThreadState_.find(uid); + if (itor != internalTidToRowThreadState_.end()) { + internalTidToRowThreadState_.erase(itor); } } uint64_t CpuFilter::StateOfInternalTidInStateTable(uint32_t uid) const { - auto row = internalTidToRowThreadState_.find(uid); - if (row != internalTidToRowThreadState_.end()) { - return (*row).second.state_; + auto itor = internalTidToRowThreadState_.find(uid); + if (itor != internalTidToRowThreadState_.end()) { + return (*itor).second.state_; } return TASK_INVALID; } diff --git a/trace_streamer/src/filter/cpu_filter.h b/trace_streamer/src/filter/cpu_filter.h index 701bfe1b0c6f298da97f4d7219c75dfd9887df4b..a2d77fc519d49469b775d39aaa14d958d8c05f5a 100644 --- a/trace_streamer/src/filter/cpu_filter.h +++ b/trace_streamer/src/filter/cpu_filter.h @@ -76,7 +76,7 @@ private: std::map cpuToRowSched_ = {}; std::map lastWakeUpMsg_ = {}; - std::map pidToThreadSliceRow = {}; + std::map pidToThreadSliceRow_ = {}; struct TPthread { uint64_t row_; uint64_t state_; 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 df590e91109451e0d786438e2969bbea23140cd7..0d8681f3207638c576e3571688ee2ff7f9a64262 100644 --- a/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp +++ b/trace_streamer/src/parser/bytrace_parser/bytrace_event_parser.cpp @@ -121,7 +121,7 @@ BytraceEventParser::BytraceEventParser(TraceDataCache* dataCache, const TraceStr bool BytraceEventParser::SchedSwitchEvent(const ArgsMap& args, const BytraceLine& line) const { if (args.empty() || args.size() < MIN_SCHED_SWITCH_ARGS_COUNT) { - TS_LOGD("Failed to parse sched_switch event, no args or args size < 6"); + TS_LOGW("Failed to parse sched_switch event, no args or args size < 6, argsStr=%s.", line.argsStr.data()); streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_SWITCH, STAT_EVENT_DATA_INVALID); return false; } @@ -145,7 +145,7 @@ bool BytraceEventParser::SchedSwitchEvent(const ArgsMap& args, const BytraceLine auto prevStateStr = args.at("prev_state"); auto threadState = ThreadStateFlag(prevStateStr.c_str()); uint64_t prevState = threadState.State(); - if (!threadState.IsValid()) { + if (threadState.IsInvalid()) { streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_SWITCH, STAT_EVENT_DATA_INVALID); } uint32_t nextInternalTid = 0; diff --git a/trace_streamer/src/parser/ebpf_parser/ebpf_splitter.cpp b/trace_streamer/src/parser/ebpf_parser/ebpf_splitter.cpp index 55b221359678255bdfa5b255fe989aa121cde272..373a175de8783224956e8817fedf3da248147664 100644 --- a/trace_streamer/src/parser/ebpf_parser/ebpf_splitter.cpp +++ b/trace_streamer/src/parser/ebpf_parser/ebpf_splitter.cpp @@ -86,7 +86,6 @@ void EbpfSplitter::SplitEbpfBodyData() ebpfBuffer_.size() > EBPF_TITLE_SIZE) { EbpfTypeAndLength dataTitle; std::copy_n(ebpfBuffer_.begin(), EBPF_TITLE_SIZE, reinterpret_cast(&dataTitle)); - // TS_LOGE("dataTitle.length = %lu, dataTitle.type = %lu", dataTitle.length, dataTitle.type); if (dataTitle.length + EBPF_TITLE_SIZE > ebpfBuffer_.size()) { return; } 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 a954f0d379ef6e0a25117901e10e4f7d082d64e6..ae2a4e9826266c562531ef9390a3298d84dd0eef 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 @@ -404,9 +404,6 @@ bool HtraceEventParser::SchedSwitchEvent(const ProtoReader::DataArea& event) std::string prevCommStr = msg.prev_comm().ToStdString(); std::string nextCommStr = msg.next_comm().ToStdString(); auto prevState = msg.prev_state(); - if (prevState == TASK_WAKEKILL) { - prevState = TASK_RUNNABLE; - } auto nextInternalTid = streamFilters_->processFilter_->UpdateOrCreateThreadWithName(eventTimeStamp_, nextPidValue, nextCommStr); @@ -529,7 +526,7 @@ bool HtraceEventParser::SchedWakingEvent(const ProtoReader::DataArea& event) con auto instants = traceDataCache_->GetInstantsData(); auto internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(eventTimeStamp_, wakePidValue); auto wakeupFromPid = streamFilters_->processFilter_->UpdateOrCreateThread(eventTimeStamp_, eventTid_); - streamFilters_->cpuFilter_->InsertWakeupEvent(eventTimeStamp_, internalTid); + streamFilters_->cpuFilter_->InsertWakeupEvent(eventTimeStamp_, internalTid, true); instants->AppendInstantEventData(eventTimeStamp_, schedWakingName_, internalTid, wakeupFromPid); uint32_t targetCpu = msg.target_cpu(); traceDataCache_->GetRawData()->AppendRawData(0, eventTimeStamp_, RAW_SCHED_WAKING, targetCpu, wakeupFromPid); diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_js_memory_parser.cpp b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_js_memory_parser.cpp index ad0455ceaf7ea9cd2ce2d8882f04b8bf1b406eff..64187585e194e51cd326c8b33a7e67a933f929ab 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_js_memory_parser.cpp +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_js_memory_parser.cpp @@ -378,7 +378,6 @@ void HtraceJSMemoryParser::SerializeSnapshotData(ProfilerPluginData& profilerPlu profilerPluginDataResult.set_data(endString); std::string arkTsEndString = ""; profilerPluginDataResult.SerializeToString(&arkTsEndString); - dataSize_ = profilerArktsData.size() + arkTsEndString.size(); std::string bufflen(sizeof(uint32_t), '\0'); uint32_t profilerArktsDataSize = profilerArktsData.size(); memcpy_s(&bufflen[0], sizeof(uint32_t), &profilerArktsDataSize, sizeof(uint32_t)); @@ -415,7 +414,6 @@ void HtraceJSMemoryParser::SerializeTimelineData(uint64_t startTime, profilerPluginDataResult.set_data(endString); std::string timelineEndString = ""; profilerPluginDataResult.SerializeToString(&timelineEndString); - dataSize_ = timelineStartString.size() + profilerArktsData.size() + timelineEndString.size(); std::string startLen(sizeof(uint32_t), '\0'); uint32_t size = timelineStartString.size(); memcpy_s(&startLen[0], sizeof(uint32_t), &size, sizeof(uint32_t)); @@ -449,7 +447,6 @@ void HtraceJSMemoryParser::SerializeCpuProfilerData(uint64_t startTime, profilerPluginDataResult.set_tv_nsec(endTs.tv_nsec); std::string profilerArktsData = ""; profilerPluginDataResult.SerializeToString(&profilerArktsData); - dataSize_ += arkTsStartString.size() + profilerArktsData.size(); std::string startLen(sizeof(uint32_t), '\0'); uint32_t size = arkTsStartString.size(); memcpy_s(&startLen[0], sizeof(uint32_t), &size, sizeof(uint32_t)); diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_js_memory_parser.h b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_js_memory_parser.h index 8076a54569ee72181d71fa24278c4c19db2c97ac..4b6deab448a27810f676d06545e9222ece3290f0 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_js_memory_parser.h +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_js_memory_parser.h @@ -54,11 +54,10 @@ public: } auto GetArkTsSize() { - return dataSize_; + return profilerArktsData_.size(); } void ClearArkTsSplitFileData() { - dataSize_ = 0; jsMemorySplitFileData_ = ""; cpuProfilerSplitFileData_ = ""; arkTsSplitFileDataResult_ = ""; @@ -122,7 +121,6 @@ private: json updatedJson_; uint32_t nodeFileId_ = INVALID_UINT32; uint32_t nodeCount_ = 0; - uint32_t dataSize_ = 0; bool hasCpuProfiler_ = false; SnapShotData snapShotData_; bool curTypeIsCpuProfile_ = false; diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.cpp b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.cpp index fc11b4cf7a1c11e0c86533c6d3fa51e24b8d19d1..0a91b06e6094dd0ccdc614616493aab3e7ae41a2 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.cpp +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.cpp @@ -39,36 +39,37 @@ std::vector g_unknownAnonMemInfo = { "[anon:arc4random data]", }; std::map g_checkMemStart = { - {"[stack", HtraceMemParser::SMAPS_MEM_TYPE_STACK}, - {"[anon:stack_and_tls:", HtraceMemParser::SMAPS_MEM_TYPE_STACK}, - {"[anon:stack:", HtraceMemParser::SMAPS_MEM_TYPE_STACK}, - {"[anon:signal_stack:", HtraceMemParser::SMAPS_MEM_TYPE_STACK}, - {"[anon:maple_alloc_ros]", HtraceMemParser::SMAPS_MEM_TYPE_JS_HEAP}, - {"[anon:dalvik-allocspace", HtraceMemParser::SMAPS_MEM_TYPE_JS_HEAP}, - {"[anon:dalvik-main space", HtraceMemParser::SMAPS_MEM_TYPE_JS_HEAP}, - {"[anon:dalvik-large object", HtraceMemParser::SMAPS_MEM_TYPE_JS_HEAP}, - {"[anon:dalvik-free list large", HtraceMemParser::SMAPS_MEM_TYPE_JS_HEAP}, - {"[anon:dalvik-non moving", HtraceMemParser::SMAPS_MEM_TYPE_JS_HEAP}, - {"[anon:dalvik-zygote space", HtraceMemParser::SMAPS_MEM_TYPE_JS_HEAP}, - {"[anon:dalvik-", HtraceMemParser::SMAPS_MEM_TYPE_JAVA_VM}, - {"/dev/ashmem/jit-zygote-cache", HtraceMemParser::SMAPS_MEM_TYPE_JAVA_VM}, - {"/memfd:jit-cache", HtraceMemParser::SMAPS_MEM_TYPE_JAVA_VM}, - {"/memfd:jit-zygote-cache", HtraceMemParser::SMAPS_MEM_TYPE_JAVA_VM}, - {"[heap]", HtraceMemParser::SMAPS_MEM_TYPE_NATIVE_HEAP}, - {"[anon:libc_malloc", HtraceMemParser::SMAPS_MEM_TYPE_NATIVE_HEAP}, - {"[anon:scudo", HtraceMemParser::SMAPS_MEM_TYPE_NATIVE_HEAP}, - {"[anon:GWP-Asan", HtraceMemParser::SMAPS_MEM_TYPE_NATIVE_HEAP}, + {"[stack", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_STACK}, + {"[anon:stack_and_tls:", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_STACK}, + {"[anon:stack:", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_STACK}, + {"[anon:signal_stack:", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_STACK}, + {"[anon:maple_alloc_ros]", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JS_HEAP}, + {"[anon:dalvik-allocspace", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JS_HEAP}, + {"[anon:dalvik-main space", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JS_HEAP}, + {"[anon:dalvik-large object", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JS_HEAP}, + {"[anon:dalvik-free list large", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JS_HEAP}, + {"[anon:dalvik-non moving", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JS_HEAP}, + {"[anon:dalvik-zygote space", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JS_HEAP}, + {"[anon:dalvik-", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JAVA_VM}, + {"/dev/ashmem/jit-zygote-cache", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JAVA_VM}, + {"/memfd:jit-cache", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JAVA_VM}, + {"/memfd:jit-zygote-cache", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JAVA_VM}, + {"[heap]", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_NATIVE_HEAP}, + {"[anon:libc_malloc", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_NATIVE_HEAP}, + {"[anon:scudo", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_NATIVE_HEAP}, + {"[anon:GWP-Asan", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_NATIVE_HEAP}, }; std::map g_checkMemEnd = { - {".art", HtraceMemParser::SMAPS_MEM_TYPE_JS_HEAP}, - {".art]", HtraceMemParser::SMAPS_MEM_TYPE_JS_HEAP}, + {".art", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JS_HEAP}, + {".art]", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JS_HEAP}, + {".tty", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_FONT}, }; std::map g_checkMemContain = { - {"[anon:ArkJS Heap]", HtraceMemParser::SMAPS_MEM_TYPE_JS_HEAP}, - {"[anon:native_heap:jemalloc]", HtraceMemParser::SMAPS_MEM_TYPE_NATIVE_HEAP}, - {"[heap]", HtraceMemParser::SMAPS_MEM_TYPE_NATIVE_HEAP}, - {"[anon:native_heap:musl]", HtraceMemParser::SMAPS_MEM_TYPE_NATIVE_HEAP}, - {"/dev/ashmem/", HtraceMemParser::SMAPS_MEM_TYPE_ASHMEM}, + {"[anon:ArkJS Heap]", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_JS_HEAP}, + {"[anon:native_heap:jemalloc]", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_NATIVE_HEAP}, + {"[heap]", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_NATIVE_HEAP}, + {"[anon:native_heap:musl]", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_NATIVE_HEAP}, + {"/dev/ashmem/", (uint32_t)HtraceMemParser::SmapsMemType::SMAPS_MEM_TYPE_ASHMEM}, }; HtraceMemParser::HtraceMemParser(TraceDataCache* dataCache, const TraceStreamerFilters* ctx) : EventParserBase(dataCache, ctx) @@ -121,6 +122,18 @@ void HtraceMemParser::Parse(HtraceDataSegment& seg, uint64_t timeStamp, BuiltinC if (memData.has_gpudumpinfo()) { ParseGpuWindowMemInfo(&memData, newTimeStamp); } + if (memData.has_windowinfo()) { + ParseWindowManagerServiceInfo(&memData, newTimeStamp); + } + if (memData.has_cpudumpinfo()) { + ParseCpuDumpInfo(&memData, newTimeStamp); + } + if (memData.has_profilememinfo()) { + ParseProfileMemInfo(&memData, newTimeStamp); + } + if (memData.has_rsdumpinfo()) { + ParseRSImageDumpInfo(&memData, newTimeStamp); + } } void HtraceMemParser::ParseProcessInfo(const ProtoReader::MemoryData_Reader* tracePacket, uint64_t timeStamp) const { @@ -162,6 +175,10 @@ void HtraceMemParser::ParseProcessInfo(const ProtoReader::MemoryData_Reader* tra hasValue += streamFilters_->processMeasureFilter_->AppendNewMeasureData( ipid, memNameDictMap_.at(MEM_GL_PSS), timeStamp, processMemoryInfo.gl_pss_kb()); } + if (processMemoryInfo.has_graph_pss_kb()) { + hasValue += streamFilters_->processMeasureFilter_->AppendNewMeasureData( + ipid, memNameDictMap_.at(MEM_GRAPH_PSS), timeStamp, processMemoryInfo.graph_pss_kb()); + } if (hasValue) { streamFilters_->processFilter_->AddProcessMemory(ipid); } @@ -179,39 +196,39 @@ uint32_t HtraceMemParser::ParseSmapsBlockDetail(ProtoReader::SmapsInfo_Reader& s if (EndWith(path, ".so")) { if (hasX) { if (StartWith(path, "/data/app/") || hasAppNmae) { - return SMAPS_MEM_TYPE_CODE_APP; + return (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_CODE_APP; } else { - return SMAPS_MEM_TYPE_CODE_SYS; + return (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_CODE_SYS; } } else { if (StartWith(path, "[anon:.bss]/data/app/") || StartWith(path, "/data/app/") || hasAppNmae) { - return SMAPS_MEM_TYPE_DATA_APP; + return (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_DATA_APP; } else { - return SMAPS_MEM_TYPE_DATA_SYS; + return (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_DATA_SYS; } } } if ((EndWith(path, ".jar")) || (EndWith(path, ".apk")) || (EndWith(path, ".vdex")) || (EndWith(path, ".odex")) || (EndWith(path, ".oat")) || (path.find("dex") != std::string::npos)) { - return hasX ? (hasAppNmae ? SMAPS_MEM_TYPE_CODE_APP : SMAPS_MEM_TYPE_CODE_SYS) - : (hasAppNmae ? SMAPS_MEM_TYPE_DATA_APP : SMAPS_MEM_TYPE_DATA_SYS); + return hasX ? (hasAppNmae ? (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_CODE_APP : (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_CODE_SYS) + : (hasAppNmae ? (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_DATA_APP : (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_DATA_SYS); } if (hasX && path.find("/bin/") != std::string::npos) { - return SMAPS_MEM_TYPE_CODE_SYS; + return (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_CODE_SYS; } if ((!hasX) && (path.find("/bin/") != std::string::npos || path.find("[anon:.bss]") != std::string::npos)) { - return SMAPS_MEM_TYPE_DATA_SYS; + return (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_DATA_SYS; } if (path.find("[bss]") != std::string::npos) { - return hasAppNmae ? SMAPS_MEM_TYPE_DATA_APP : SMAPS_MEM_TYPE_DATA_SYS; + return hasAppNmae ? (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_DATA_APP : (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_DATA_SYS; } if ((path.find("[anon]") != std::string::npos) || (path.find("[anon:") != std::string::npos)) { if (std::find(g_unknownAnonMemInfo.begin(), g_unknownAnonMemInfo.end(), path) != g_unknownAnonMemInfo.end()) { - return SMAPS_MEM_TYPE_UNKNOWN_ANON; + return (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_UNKNOWN_ANON; } - return SMAPS_MEM_TYPE_NATIVE_HEAP; + return (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_NATIVE_HEAP; } - return SMAPS_MEM_TYPE_INVALID; + return (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_INVALID; } uint32_t HtraceMemParser::ParseSmapsBlockType(ProtoReader::SmapsInfo_Reader& smapsInfo) const @@ -239,10 +256,10 @@ uint32_t HtraceMemParser::ParseSmapsBlockType(ProtoReader::SmapsInfo_Reader& sma } bool hasAppNmae = path.find("com.huawei.wx") != std::string::npos; uint32_t detailRet = ParseSmapsBlockDetail(smapsInfo, path, hasAppNmae); - if (detailRet != SMAPS_MEM_TYPE_INVALID) { + if (detailRet != (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_INVALID) { return detailRet; } - return hasAppNmae ? SMAPS_MEM_TYPE_OTHER_APP : SMAPS_MEM_TYPE_OTHER_SYS; + return hasAppNmae ? (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_OTHER_APP : (uint32_t)SmapsMemType::SMAPS_MEM_TYPE_OTHER_SYS; } void HtraceMemParser::ParseSmapsInfoEasy(const ProtoReader::ProcessMemoryInfo_Reader* memInfo, @@ -1104,7 +1121,7 @@ void HtraceMemParser::AshMemDeduplicate() const if (pidMap.find(ipid) == pidMap.end()) { pidMap.emplace(ipid, i); } else { - ashMemData->SetFlag(i, MEM_DEDUPLICATE_FLAG_DUP_SAME_PROCESS); + ashMemData->SetFlag(i, (uint32_t)MemDeduplicateFlag::MEM_DEDUPLICATE_FLAG_DUP_SAME_PROCESS); } } @@ -1115,7 +1132,7 @@ void HtraceMemParser::AshMemDeduplicate() const continue; } for (++iter; iter != pidMap.end(); ++iter) { - ashMemData->SetFlag(iter->second, MEM_DEDUPLICATE_FLAG_DUP_DIFF_PROCESS); + ashMemData->SetFlag(iter->second, (uint32_t)MemDeduplicateFlag::MEM_DEDUPLICATE_FLAG_DUP_DIFF_PROCESS); } } } @@ -1124,11 +1141,11 @@ HtraceMemParser::MemProcessType HtraceMemParser::GetMemProcessType(uint64_t ipid { const auto& iterProcess = traceDataCache_->GetConstProcessData(ipid); if (iterProcess.cmdLine_ == "composer_host") { - return PID_TYPE_COMPOSER; + return MemProcessType::PID_TYPE_COMPOSER; } else if (iterProcess.cmdLine_ == "render_service") { - return PID_TYPE_RENDER_SERVICES; + return MemProcessType::PID_TYPE_RENDER_SERVICES; } else { - return PID_TYPE_APP; + return MemProcessType::PID_TYPE_APP; } } @@ -1185,7 +1202,7 @@ void HtraceMemParser::DmaMemDeduplicate() const auto ipid = dmaMemData->Ipids()[i]; auto& pidMap = inoMap[ino]; if (pidMap.find(ipid) != pidMap.end()) { - dmaMemData->SetFlag(i, MEM_DEDUPLICATE_FLAG_DUP_SAME_PROCESS); + dmaMemData->SetFlag(i, (uint32_t)MemDeduplicateFlag::MEM_DEDUPLICATE_FLAG_DUP_SAME_PROCESS); } else { auto processType = GetMemProcessType(ipid); pidMap.emplace(ipid, std::make_pair(i, processType)); @@ -1200,7 +1217,7 @@ void HtraceMemParser::DmaMemDeduplicate() const const auto& pidMap = item.second; for (const auto& pidItem : pidMap) { if (pidItem.second.second < maxPidType) { - dmaMemData->SetFlag(pidItem.second.first, MEM_DEDUPLICATE_FLAG_DUP_DIFF_PROCESS); + dmaMemData->SetFlag(pidItem.second.first, (uint32_t)MemDeduplicateFlag::MEM_DEDUPLICATE_FLAG_DUP_DIFF_PROCESS); } } } @@ -1267,7 +1284,56 @@ void HtraceMemParser::ParseGpuWindowMemInfo(const ProtoReader::MemoryData_Reader FillGpuWindowMemInfo(GpuDumpInfo, timeStamp); } } +void HtraceMemParser::ParseWindowManagerServiceInfo(const ProtoReader::MemoryData_Reader* tracePacket, + uint64_t timeStamp) +{ + if (tracePacket->has_windowinfo()) { + streamFilters_->statFilter_->IncreaseStat(TRACE_WINDOW_MANAGER_SERVICE, STAT_EVENT_RECEIVED); + } + for (auto i = tracePacket->windowinfo(); i; ++i) { + ProtoReader::WindowManagerServiceInfo_Reader windowInfo(i->ToBytes().data_, i->ToBytes().size_); + if (!windowInfo.has_pid() || !windowInfo.has_window_name()) { + continue; + } + auto windowNameId = traceDataCache_->GetDataIndex(windowInfo.window_name().ToStdString()); + auto ipid = + streamFilters_->processFilter_->GetOrCreateInternalPid(timeStamp, static_cast(windowInfo.pid())); + windowIdToipidMap_.insert({windowNameId, ipid}); + } +} +void HtraceMemParser::ParseCpuDumpInfo(const ProtoReader::MemoryData_Reader* tracePacket, uint64_t timeStamp) const +{ + for (auto i = tracePacket->cpudumpinfo(); i; ++i) { + ProtoReader::CpuDumpInfo_Reader cpuDumpInfo(i->ToBytes().data_, i->ToBytes().size_); + auto totalSize = cpuDumpInfo.total_cpu_memory_size(); + traceDataCache_->GetCpuDumpInfo()->AppendNewData(timeStamp, totalSize); + } +} +void HtraceMemParser::ParseProfileMemInfo(const ProtoReader::MemoryData_Reader* tracePacket, uint64_t timeStamp) const +{ + for (auto i = tracePacket->profilememinfo(); i; ++i) { + ProtoReader::ProfileMemInfo_Reader profileMemInfo(i->ToBytes().data_, i->ToBytes().size_); + auto channelIndex = traceDataCache_->GetDataIndex(profileMemInfo.channel().ToStdString()); + auto totalSize = profileMemInfo.total_memory_size(); + traceDataCache_->GetProfileMemInfo()->AppendNewData(timeStamp, channelIndex, totalSize); + } +} +void HtraceMemParser::ParseRSImageDumpInfo(const ProtoReader::MemoryData_Reader* tracePacket, uint64_t timeStamp) const +{ + for (auto i = tracePacket->rsdumpinfo(); i; ++i) { + ProtoReader::RSImageDumpInfo_Reader rsImageDumpInfo(i->ToBytes().data_, i->ToBytes().size_); + auto size = rsImageDumpInfo.size(); + auto typeIndex = traceDataCache_->GetDataIndex(rsImageDumpInfo.type().ToStdString()); + InternalPid ipid = INVALID_IPID; + if (rsImageDumpInfo.has_pid()) { + ipid = streamFilters_->processFilter_->GetOrCreateInternalPid(timeStamp, + static_cast(rsImageDumpInfo.pid())); + } + auto surfaceNameIndex = traceDataCache_->GetDataIndex(rsImageDumpInfo.surface_name().ToStdString()); + traceDataCache_->GetRSImageDumpInfo()->AppendNewData(timeStamp, size, typeIndex, ipid, surfaceNameIndex); + } +} void HtraceMemParser::ParseMemoryConfig(HtraceDataSegment& seg) { ProtoReader::MemoryConfig_Reader memConfigData(seg.protoData.data_, seg.protoData.size_); @@ -1289,6 +1355,7 @@ void HtraceMemParser::ParseMemoryConfig(HtraceDataSegment& seg) void HtraceMemParser::Finish() { + traceDataCache_->GetGpuWindowMemData()->RevicesIpid(windowIdToipidMap_); if (traceDataCache_->traceStartTime_ == INVALID_UINT64 || traceDataCache_->traceEndTime_ == 0) { traceDataCache_->MixTraceTime(GetPluginStartTime(), GetPluginEndTime()); } else { diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.h b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.h index 98061b339c1acfe4be3bf17c2c75df4260ba4fa6..473aa67a85a236b5611ea39eeafce0d1017bed58 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.h +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.h @@ -36,7 +36,7 @@ public: void Parse(HtraceDataSegment& seg, uint64_t, BuiltinClocks clock); void ParseMemoryConfig(HtraceDataSegment& seg); void Finish(); - enum SmapsMemType { + enum class SmapsMemType { SMAPS_MEM_TYPE_CODE_SYS = 0, // 系统代码段 SMAPS_MEM_TYPE_CODE_APP = 1, // 应用代码段 SMAPS_MEM_TYPE_DATA_SYS = 2, // 系统数据段 @@ -49,14 +49,15 @@ public: SMAPS_MEM_TYPE_ASHMEM = 9, // Ashmem SMAPS_MEM_TYPE_OTHER_SYS = 10, // 系统其他杂类资源 SMAPS_MEM_TYPE_OTHER_APP = 11, // 应用其他杂类资源 + SMAPS_MEM_TYPE_FONT = 12, // Font SMAPS_MEM_TYPE_INVALID = 127, }; - enum MemProcessType { + enum class MemProcessType { PID_TYPE_COMPOSER = 0, PID_TYPE_RENDER_SERVICES, PID_TYPE_APP, }; - enum MemDeduplicateFlag { + enum class MemDeduplicateFlag { MEM_DEDUPLICATE_FLAG_NOMAL = 0, MEM_DEDUPLICATE_FLAG_DUP_SAME_PROCESS, MEM_DEDUPLICATE_FLAG_DUP_DIFF_PROCESS, @@ -83,7 +84,10 @@ private: void DmaMemDeduplicate() const; MemProcessType GetMemProcessType(uint64_t ipid) const; void FillGpuWindowMemInfo(const ProtoReader::GpuDumpInfo_Reader& gpuDumpInfo, uint64_t timeStamp) const; - + void ParseWindowManagerServiceInfo(const ProtoReader::MemoryData_Reader* tracePacket, uint64_t timeStamp); + void ParseCpuDumpInfo(const ProtoReader::MemoryData_Reader* tracePacket, uint64_t timeStamp) const; + void ParseProfileMemInfo(const ProtoReader::MemoryData_Reader* tracePacket, uint64_t timeStamp) const; + void ParseRSImageDumpInfo(const ProtoReader::MemoryData_Reader* tracePacket, uint64_t timeStamp) const; std::map memNameDictMap_ = {}; std::map sysMemNameDictMap_ = {}; std::map sysVMemNameDictMap_ = {}; @@ -93,6 +97,7 @@ private: const DataIndex zramIndex_ = traceDataCache_->GetDataIndex("sys.mem.zram"); const DataIndex gpuLimitSizeIndex_ = traceDataCache_->GetDataIndex("sys.mem.gpu.limit"); const DataIndex gpuUsedSizeIndex_ = traceDataCache_->GetDataIndex("sys.mem.gpu.used"); + std::map windowIdToipidMap_ = {}; TraceStreamerConfig config_{}; }; diff --git a/trace_streamer/src/parser/rawtrace_parser/BUILD.gn b/trace_streamer/src/parser/rawtrace_parser/BUILD.gn index ee9104b98595fcdf8caa017493e543892a671286..19249079767d8cbeb77c5bc58666d0af24a80894 100755 --- a/trace_streamer/src/parser/rawtrace_parser/BUILD.gn +++ b/trace_streamer/src/parser/rawtrace_parser/BUILD.gn @@ -39,12 +39,12 @@ ohos_source_set("rawtrace_parser_src") { subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}" part_name = "${OHOS_PROFILER_PART_NAME}" sources = [ + "cpu_detail_parser.cpp", "ftrace_event_processor.cpp", "ftrace_field_processor.cpp", "ftrace_processor.cpp", "kernel_symbols_processor.cpp", "printk_formats_processor.cpp", - "rawtrace_cpu_detail_parser.cpp", "rawtrace_parser.cpp", ] diff --git a/trace_streamer/src/parser/rawtrace_parser/rawtrace_cpu_detail_parser.cpp b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp similarity index 84% rename from trace_streamer/src/parser/rawtrace_parser/rawtrace_cpu_detail_parser.cpp rename to trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp index f73cdbcebf62e07d9062b5b4eea47ea2d1bfb8cc..25bbb948e303c3565b9c2fc029a96fe555c89488 100644 --- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_cpu_detail_parser.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "rawtrace_cpu_detail_parser.h" +#include "cpu_detail_parser.h" #include #include #include "app_start_filter.h" @@ -31,7 +31,7 @@ #include "string_to_numerical.h" namespace { -constexpr uint64_t FILTER_MAX_SIZE = 2000000; +constexpr uint64_t FILTER_MAX_SIZE = 3000000; } namespace SysTuning { namespace TraceStreamer { @@ -72,7 +72,9 @@ CpuDetailParser::CpuDetailParser(TraceDataCache* dataCache, const TraceStreamerF {config_.eventNameMap_.at(TRACE_EVENT_TASK_NEWTASK), std::bind(&CpuDetailParser::TaskNewtaskEvent, this, std::placeholders::_1)}, {config_.eventNameMap_.at(TRACE_EVENT_PRINT), - std::bind(&CpuDetailParser::ParsePrintEvent, this, std::placeholders::_1)}, + std::bind(&CpuDetailParser::ParseTracingMarkWriteOrPrintEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_TRACING_MARK_WRITE), + std::bind(&CpuDetailParser::ParseTracingMarkWriteOrPrintEvent, this, std::placeholders::_1)}, {config_.eventNameMap_.at(TRACE_EVENT_CPU_IDLE), std::bind(&CpuDetailParser::CpuIdleEvent, this, std::placeholders::_1)}, {config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY), @@ -99,6 +101,20 @@ CpuDetailParser::CpuDetailParser(TraceDataCache* dataCache, const TraceStreamerF std::bind(&CpuDetailParser::SoftIrqRaiseEvent, this, std::placeholders::_1)}, {config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_EXIT), std::bind(&CpuDetailParser::SoftIrqExitEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_SET_RATE), + std::bind(&CpuDetailParser::SetRateEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_ENABLE), + std::bind(&CpuDetailParser::ClockEnableEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_DISABLE), + std::bind(&CpuDetailParser::ClockDisableEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE), + std::bind(&CpuDetailParser::RegulatorSetVoltageEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE), + std::bind(&CpuDetailParser::RegulatorSetVoltageCompleteEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE), + std::bind(&CpuDetailParser::RegulatorDisableEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE), + std::bind(&CpuDetailParser::RegulatorDisableCompleteEvent, this, std::placeholders::_1)}, }; } void CpuDetailParser::EventAppend(std::unique_ptr event) @@ -128,6 +144,9 @@ bool CpuDetailParser::FilterAllEvents(FtraceCpuDetailMsg& cpuDetail, bool isFini #else std::stable_sort(rawTraceEventList_.begin(), rawTraceEventList_.end(), cmp); #endif + if (rawTraceEventList_.empty()) { + return false; + } traceDataCache_->UpdateTraceTime(rawTraceEventList_.front()->msgPtr->timestamp()); traceDataCache_->UpdateTraceTime(rawTraceEventList_.back()->msgPtr->timestamp()); for (size_t i = 0; i < rawTraceEventList_.size(); i++) { @@ -137,6 +156,7 @@ bool CpuDetailParser::FilterAllEvents(FtraceCpuDetailMsg& cpuDetail, bool isFini } DealEvent(*rawTraceEventList_[i].get()); } + TS_LOGI("event_size=%d, rawTraceEventList_.size=%zu", cpuDetail.event().size(), rawTraceEventList_.size()); rawTraceEventList_.clear(); cpuDetail.Clear(); TS_CHECK_TRUE_RET(isFinished, true); @@ -179,14 +199,12 @@ bool CpuDetailParser::SchedSwitchEvent(const RawTraceEventInfo& event) auto schedSwitchMsg = event.msgPtr->sched_switch_format(); streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_SWITCH, STAT_EVENT_RECEIVED); + auto schedSwitchPrevState = schedSwitchMsg.prev_state(); auto nextInternalTid = streamFilters_->processFilter_->UpdateOrCreateThreadWithName( event.msgPtr->timestamp(), schedSwitchMsg.next_pid(), schedSwitchMsg.next_comm()); auto uprevtid = streamFilters_->processFilter_->UpdateOrCreateThreadWithName( event.msgPtr->timestamp(), schedSwitchMsg.prev_pid(), schedSwitchMsg.prev_comm()); - auto schedSwitchPrevState = schedSwitchMsg.prev_state(); - if (schedSwitchPrevState == TASK_WAKEKILL) { - schedSwitchPrevState = TASK_RUNNABLE; - } + streamFilters_->cpuFilter_->InsertSwitchEvent( event.msgPtr->timestamp(), event.cpuId, uprevtid, static_cast(schedSwitchMsg.prev_prio()), schedSwitchPrevState, nextInternalTid, static_cast(schedSwitchMsg.next_prio()), INVALID_DATAINDEX); @@ -230,7 +248,7 @@ bool CpuDetailParser::SchedWakingEvent(const RawTraceEventInfo& event) const auto internalTid = streamFilters_->processFilter_->UpdateOrCreateThread(event.msgPtr->timestamp(), wakeingMsg.pid()); auto wakeupFromPid = streamFilters_->processFilter_->UpdateOrCreateThread(event.msgPtr->timestamp(), eventTid_); - streamFilters_->cpuFilter_->InsertWakeupEvent(event.msgPtr->timestamp(), internalTid); + streamFilters_->cpuFilter_->InsertWakeupEvent(event.msgPtr->timestamp(), internalTid, true); instants->AppendInstantEventData(event.msgPtr->timestamp(), schedWakingIndex_, internalTid, wakeupFromPid); traceDataCache_->GetRawData()->AppendRawData(0, event.msgPtr->timestamp(), RAW_SCHED_WAKING, wakeingMsg.target_cpu(), wakeupFromPid); @@ -350,10 +368,9 @@ bool CpuDetailParser::TaskNewtaskEvent(const RawTraceEventInfo& event) const streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_TASK_NEWTASK, STAT_EVENT_NOTSUPPORTED); return true; } -bool CpuDetailParser::ParsePrintEvent(const RawTraceEventInfo& event) +bool CpuDetailParser::ParseTracingMarkWriteOrPrintEvent(const RawTraceEventInfo& event) { auto printMsg = event.msgPtr->print_format(); - streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_PRINT, STAT_EVENT_RECEIVED); BytraceLine line; line.tgid = eventPid_; line.pid = eventTid_; @@ -448,17 +465,18 @@ bool CpuDetailParser::WorkqueueExecuteStartEvent(const RawTraceEventInfo& event) traceDataCache_->GetInternalSlicesData()->AppendDistributeInfo(); if (result == INVALID_UINT32) { - streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_TRACING_MARK_WRITE, STAT_EVENT_DATA_LOST); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_WORKQUEUE_EXECUTE_START, STAT_EVENT_DATA_LOST); } return true; } bool CpuDetailParser::WorkqueueExecuteEndEvent(const RawTraceEventInfo& event) const { auto executeEndMsg = event.msgPtr->workqueue_execute_end_format(); - streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_WORKQUEUE_EXECUTE_END, STAT_EVENT_RECEIVED); - if (streamFilters_->sliceFilter_->EndSlice(event.msgPtr->timestamp(), eventPid_, eventPid_, workQueueIndex_)) { + if (!streamFilters_->sliceFilter_->EndSlice(event.msgPtr->timestamp(), eventPid_, eventPid_, workQueueIndex_)) { streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_WORKQUEUE_EXECUTE_END, STAT_EVENT_NOTMATCH); + return false; } + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_WORKQUEUE_EXECUTE_END, STAT_EVENT_RECEIVED); return true; } bool CpuDetailParser::IrqHandlerEntryEvent(const RawTraceEventInfo& event) const @@ -514,5 +532,61 @@ bool CpuDetailParser::SoftIrqExitEvent(const RawTraceEventInfo& event) const static_cast(softIrqExitMsg.vec())); return true; } +bool CpuDetailParser::SetRateEvent(const RawTraceEventInfo& event) const +{ + auto clockSetRateMsg = event.msgPtr->clock_set_rate_format(); + DataIndex nameIndex = traceDataCache_->GetDataIndex(clockSetRateMsg.name()); + streamFilters_->clockRateFilter_->AppendNewMeasureData(clockSetRateMsg.cpu_id(), nameIndex, + event.msgPtr->timestamp(), clockSetRateMsg.state()); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_SET_RATE, STAT_EVENT_RECEIVED); + return true; +} +bool CpuDetailParser::ClockEnableEvent(const RawTraceEventInfo& event) const +{ + auto clockEnableMsg = event.msgPtr->clock_enable_format(); + DataIndex nameIndex = traceDataCache_->GetDataIndex(clockEnableMsg.name()); + streamFilters_->clockEnableFilter_->AppendNewMeasureData(clockEnableMsg.cpu_id(), nameIndex, + event.msgPtr->timestamp(), clockEnableMsg.state()); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_ENABLE, STAT_EVENT_RECEIVED); + return true; +} +bool CpuDetailParser::ClockDisableEvent(const RawTraceEventInfo& event) const +{ + auto clockDisableMsg = event.msgPtr->clock_disable_format(); + DataIndex nameIndex = traceDataCache_->GetDataIndex(clockDisableMsg.name()); + streamFilters_->clockDisableFilter_->AppendNewMeasureData(clockDisableMsg.cpu_id(), nameIndex, + event.msgPtr->timestamp(), clockDisableMsg.state()); + streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_CLOCK_DISABLE, STAT_EVENT_RECEIVED); + return true; +} +bool CpuDetailParser::RegulatorSetVoltageEvent(const RawTraceEventInfo& event) const +{ + UNUSED(event); + traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_SET_VOLTAGE, STAT_EVENT_NOTSUPPORTED); + traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_SET_VOLTAGE, STAT_EVENT_RECEIVED); + return true; +} +bool CpuDetailParser::RegulatorSetVoltageCompleteEvent(const RawTraceEventInfo& event) const +{ + UNUSED(event); + traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE, + STAT_EVENT_NOTSUPPORTED); + traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE, STAT_EVENT_RECEIVED); + return true; +} +bool CpuDetailParser::RegulatorDisableEvent(const RawTraceEventInfo& event) const +{ + UNUSED(event); + traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_DISABLE, STAT_EVENT_NOTSUPPORTED); + traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_DISABLE, STAT_EVENT_RECEIVED); + return true; +} +bool CpuDetailParser::RegulatorDisableCompleteEvent(const RawTraceEventInfo& event) const +{ + UNUSED(event); + traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE, STAT_EVENT_NOTSUPPORTED); + traceDataCache_->GetStatAndInfo()->IncreaseStat(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE, STAT_EVENT_RECEIVED); + return true; +} } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/parser/rawtrace_parser/rawtrace_cpu_detail_parser.h b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.h similarity index 86% rename from trace_streamer/src/parser/rawtrace_parser/rawtrace_cpu_detail_parser.h rename to trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.h index 6e741a46c576a051c13690d5c2cb68e75de2c0ee..d2203164753bd75298ecb295b4544e91afbd8b2f 100644 --- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_cpu_detail_parser.h +++ b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.h @@ -12,8 +12,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef RAW_TRACE_CPU_DETAIL_PARSER_H -#define RAW_TRACE_CPU_DETAIL_PARSER_H +#ifndef CPU_DETAIL_PARSER_H +#define CPU_DETAIL_PARSER_H #include "print_event_parser.h" #include "trace_data_cache.h" #include "trace_plugin_result.pb.h" @@ -24,7 +24,7 @@ namespace TraceStreamer { struct RawTraceEventInfo { uint8_t cpuId = INVALID_UINT8; uint32_t eventId = INVALID_UINT32; - FtraceEvent* msgPtr = nullptr; + std::unique_ptr msgPtr; }; class CpuDetailParser { public: @@ -51,7 +51,7 @@ private: bool BinderTractionUnLockEvent(const RawTraceEventInfo& event) const; bool TaskRenameEvent(const RawTraceEventInfo& event) const; bool TaskNewtaskEvent(const RawTraceEventInfo& event) const; - bool ParsePrintEvent(const RawTraceEventInfo& event); + bool ParseTracingMarkWriteOrPrintEvent(const RawTraceEventInfo& event); bool CpuIdleEvent(const RawTraceEventInfo& event) const; bool CpuFrequencyEvent(const RawTraceEventInfo& event) const; bool CpuFrequencyLimitsEvent(const RawTraceEventInfo& event) const; @@ -65,6 +65,13 @@ private: bool SoftIrqEntryEvent(const RawTraceEventInfo& event) const; bool SoftIrqRaiseEvent(const RawTraceEventInfo& event) const; bool SoftIrqExitEvent(const RawTraceEventInfo& event) const; + bool SetRateEvent(const RawTraceEventInfo& event) const; + bool ClockEnableEvent(const RawTraceEventInfo& event) const; + bool ClockDisableEvent(const RawTraceEventInfo& event) const; + bool RegulatorSetVoltageEvent(const RawTraceEventInfo& event) const; + bool RegulatorSetVoltageCompleteEvent(const RawTraceEventInfo& event) const; + bool RegulatorDisableEvent(const RawTraceEventInfo& event) const; + bool RegulatorDisableCompleteEvent(const RawTraceEventInfo& event) const; private: using FuncCall = std::function; @@ -90,4 +97,4 @@ private: } // namespace TraceStreamer } // namespace SysTuning -#endif // RAW_TRACE_CPU_DETAIL_PARSER_H_ +#endif // CPU_DETAIL_PARSER_H_ diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp index c0641860f8ceaa84e3613f0f6d9b536b81d02ad2..6de9f33029616209910465fa4fdad097deaba94e 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp @@ -154,7 +154,7 @@ void TaskNewtask(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const Ev newTaskMsg->set_oom_score_adj(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); } -void PrintFormat(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format) +void TracingMarkWriteOrPrintFormat(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format) { uint8_t index = 0; auto printMsg = ftraceEvent.mutable_print_format(); @@ -253,6 +253,57 @@ void SoftirqExit(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const Ev auto softirqExitMsg = ftraceEvent.mutable_softirq_exit_format(); softirqExitMsg->set_vec(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); } +void ClockSetRate(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format) +{ + uint8_t index = 0; + auto clockSetRateMsg = ftraceEvent.mutable_clock_set_rate_format(); + clockSetRateMsg->set_name(FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size)); + clockSetRateMsg->set_state(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); + clockSetRateMsg->set_cpu_id(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); +} +void ClockEnable(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format) +{ + uint8_t index = 0; + auto clockEnable = ftraceEvent.mutable_clock_enable_format(); + clockEnable->set_name(FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size)); + clockEnable->set_state(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); + clockEnable->set_cpu_id(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); +} +void ClockDisable(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format) +{ + uint8_t index = 0; + auto clockDisable = ftraceEvent.mutable_clock_disable_format(); + clockDisable->set_name(FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size)); + clockDisable->set_state(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); + clockDisable->set_cpu_id(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); +} +void RegulatorSetVoltage(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format) +{ + uint8_t index = 0; + auto regulatorSetVoltage = ftraceEvent.mutable_regulator_set_voltage_format(); + regulatorSetVoltage->set_name(FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size)); + regulatorSetVoltage->set_min(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); + regulatorSetVoltage->set_max(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); +} +void RegulatorSetVoltageComplete(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format) +{ + uint8_t index = 0; + auto regulatorSetVoltage = ftraceEvent.mutable_regulator_set_voltage_complete_format(); + regulatorSetVoltage->set_name(FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size)); + regulatorSetVoltage->set_val(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); +} +void RegulatorDisable(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format) +{ + uint8_t index = 0; + auto regulatorDisable = ftraceEvent.mutable_regulator_disable_format(); + regulatorDisable->set_name(FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size)); +} +void RegulatorDisableComplete(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format) +{ + uint8_t index = 0; + auto regulatorDisableComplete = ftraceEvent.mutable_regulator_disable_complete_format(); + regulatorDisableComplete->set_name(FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size)); +} FtraceEventProcessor& FtraceEventProcessor::GetInstance() { @@ -276,7 +327,8 @@ FtraceEventProcessor::FtraceEventProcessor() {config_.eventNameMap_.at(TRACE_EVENT_CPU_IDLE), CpuIdle}, {config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY), CpuFrequency}, {config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY_LIMITS), CpuFrequencyLimits}, - {config_.eventNameMap_.at(TRACE_EVENT_PRINT), PrintFormat}, + {config_.eventNameMap_.at(TRACE_EVENT_PRINT), TracingMarkWriteOrPrintFormat}, + {config_.eventNameMap_.at(TRACE_EVENT_TRACING_MARK_WRITE), TracingMarkWriteOrPrintFormat}, {config_.eventNameMap_.at(TRACE_EVENT_TASK_RENAME), TaskRename}, {config_.eventNameMap_.at(TRACE_EVENT_TASK_NEWTASK), TaskNewtask}, {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION), BinderTransaction}, @@ -292,6 +344,13 @@ FtraceEventProcessor::FtraceEventProcessor() {config_.eventNameMap_.at(TRACE_EVENT_SCHED_WAKEUP_NEW), SchedWakeupNew}, {config_.eventNameMap_.at(TRACE_EVENT_PROCESS_EXIT), SchedProcessExit}, {config_.eventNameMap_.at(TRACE_EVENT_PROCESS_FREE), SchedProcessFree}, + {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_SET_RATE), ClockSetRate}, + {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_ENABLE), ClockEnable}, + {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_DISABLE), ClockDisable}, + {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE), RegulatorSetVoltage}, + {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE), RegulatorSetVoltageComplete}, + {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE), RegulatorDisable}, + {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE), RegulatorDisableComplete}, }; } diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_field_processor.h b/trace_streamer/src/parser/rawtrace_parser/ftrace_field_processor.h index 7a04bc070c4fa74d936a4122e281cc525ed9f958..94741a69f51ffb302bbcdbdc5f748a69c8cbdb43 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_field_processor.h +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_field_processor.h @@ -14,9 +14,9 @@ */ #ifndef FTRACE_FIELD_PROCESSOR_H #define FTRACE_FIELD_PROCESSOR_H -#include "ftrace_common_type.h" #include #include +#include "ftrace_common_type.h" #include "log.h" namespace SysTuning { diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp index 02ff2001c556db85ce1bedc302972ccfe1f5069f..288515b9dc91bfd3d18be003872930e5ae3c1193 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.cpp @@ -75,7 +75,7 @@ FtraceProcessor::~FtraceProcessor() bool FtraceProcessor::SetupEvent(const std::string& desc) { EventFormat format; - TS_CHECK_TRUE_RET(HandleEventFormat(desc.data(), format), false); + TS_CHECK_TRUE(HandleEventFormat(desc.data(), format), false, "HandleEventFormat failed!"); TS_CHECK_TRUE(FtraceEventProcessor::GetInstance().SetupEvent(format), false, "setup %s failed!", format.eventName.c_str()); eventFormatDict_[format.eventId] = format; @@ -138,7 +138,8 @@ bool FtraceProcessor::HandleEventFormat(const std::string& formatInfo, EventForm format.eventId = static_cast(atoi(idStr.c_str())); } else if (StartWith(curLine, nameLinePrefix_)) { format.eventName = curLine.substr(nameLinePrefix_.size() + 1); - TS_CHECK_TRUE_RET(FtraceEventProcessor::GetInstance().IsSupported(format.eventName), false); + TS_CHECK_TRUE(FtraceEventProcessor::GetInstance().IsSupported(format.eventName), false, + "Isn't Supported %s event!", format.eventName.data()); } } @@ -211,7 +212,7 @@ static std::string GetNameFromTypeName(const std::string& typeName) curName = rightPart; } else { auto posT1 = rightPart.rfind('['); - TS_CHECK_TRUE_RET(posT1 == std::string::npos, ""); + TS_CHECK_TRUE(posT1 != std::string::npos, "", "GetNameFromTypeName Failed!"); curName = rightPart.substr(0, posT1); } return curName; @@ -370,7 +371,6 @@ bool FtraceProcessor::HandleFieldType(const std::string& type, FieldFormat& fiel } // for flex array with __data_loc mark, likes: __data_loc char[] name; - // __data_loc __u8[] buf; if (std::regex_match(curTypeName, flexDataLocArrayRegex_)) { if (field.size != sizeof(uint32_t)) { TS_LOGW("__data_loc: %s, size: %hu", curTypeName.c_str(), field.size); @@ -533,7 +533,7 @@ bool FtraceProcessor::HandleTimeStamp(const FtraceEventHeader& eventHeader) // refers kernel function rb_update_write_stamp in ring_buffer.c curTimestamp_ = eventHeader.timeDelta + TimestampIncrements(deltaExt); - TS_LOGI("update ts with %u to %" PRIu64, deltaExt, curTimestamp_); + TS_LOGD("update ts with %u to %" PRIu64, deltaExt, curTimestamp_); return true; } @@ -569,14 +569,14 @@ bool FtraceProcessor::HandleDataRecord(const FtraceEventHeader& eventHeader, TS_LOGD("HandleDataRecord: eventId = %u, name = %s", eventId, format.eventName.c_str()); if (FtraceEventProcessor::GetInstance().IsSupported(format.eventId)) { - auto ftraceEvent = cpuMsg.add_event(); + std::unique_ptr ftraceEvent = std::make_unique(); ftraceEvent->set_timestamp(curTimestamp_); + HandleFtraceEvent(*ftraceEvent, eventStart, eventSize, format); std::unique_ptr event = std::make_unique(); event->cpuId = cpuMsg.cpu(); event->eventId = eventId; - event->msgPtr = ftraceEvent; + event->msgPtr = std::move(ftraceEvent); cpuDetailParser.EventAppend(std::move(event)); - HandleFtraceEvent(*ftraceEvent, eventStart, eventSize, format); } else { TS_LOGD("event %u %s not supported!", format.eventId, format.eventName.c_str()); } @@ -680,8 +680,7 @@ bool FtraceProcessor::HandleFtraceEvent(FtraceEvent& ftraceEvent, } else { TS_LOGD("pid = %d, taskName can't find.taskName = %s", pid, std::to_string(pid).data()); } - TS_LOGD("pid = %5d, tgid = %5d, taskName = %16s, event = %s", pid, ftraceEvent.tgid(), - ftraceEvent.taskName().c_str(), format.eventName.c_str()); + TS_LOGD("pid = %5d, tgid = %5d, event = %s", pid, ftraceEvent.tgid(), format.eventName.c_str()); } FtraceEventProcessor::GetInstance().HandleEvent(ftraceEvent, data, dataSize, format); 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 abf9e3b29b938d3659a2d22c57dc951770d0bc63..671972ea0f85287eae2c629bead93b9d95ed7a7d 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_processor.h @@ -18,17 +18,15 @@ #include #include #include +#include "cpu_detail_parser.h" #include "ftrace_common_type.h" #include "ftrace_field_processor.h" #include "printk_formats_processor.h" -#include "rawtrace_cpu_detail_parser.h" #include "ftrace_event_processor.h" namespace SysTuning { namespace TraceStreamer { -#ifndef PAGE_SIZE -constexpr uint32_t PAGE_SIZE = 4096; -#endif +constexpr uint32_t FTRACE_PAGE_SIZE = 4096; class FtraceProcessor { public: FtraceProcessor(); @@ -39,7 +37,7 @@ public: bool HandlePage(FtraceCpuDetailMsg& cpuDetailMsg, CpuDetailParser& cpuDetailParser, uint8_t page[], - size_t size = PAGE_SIZE); + size_t size = FTRACE_PAGE_SIZE); bool HandleTgids(const std::string& tgids); bool HandleCmdlines(const std::string& cmdlines); diff --git a/trace_streamer/src/parser/rawtrace_parser/kernel_symbols_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/kernel_symbols_processor.cpp index 9653fb81429ce349072ccbcd9e3a81d1ae7498b3..809bff8fab17b569de518994ed9f320e167a5bc8 100644 --- a/trace_streamer/src/parser/rawtrace_parser/kernel_symbols_processor.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/kernel_symbols_processor.cpp @@ -14,9 +14,6 @@ */ #include "kernel_symbols_processor.h" -#include -#include - #include "log.h" #include "symbols_filter.h" #include "string_help.h" diff --git a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp index 07cbfaa9bf1ac875fdc19fe11dc37406f02a98b3..e7ce3c53317b7f5066889f438d6ae09ad80e288e 100644 --- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.cpp @@ -33,11 +33,11 @@ RawTraceParser::RawTraceParser(TraceDataCache* dataCache, const TraceStreamerFil RawTraceParser::~RawTraceParser() {} bool RawTraceParser::ParseCpuRawData(uint32_t cpuId, const std::string& buffer) { - TS_CHECK_TRUE_RET(buffer.size() > 0, false); + TS_CHECK_TRUE(buffer.size() > 0, false, "buffer.size() is zero!"); auto startPtr = reinterpret_cast(buffer.c_str()); auto endPtr = startPtr + buffer.size(); cpuDetail_->set_cpu(cpuId); - for (uint8_t* page = const_cast(startPtr); page < endPtr; page += PAGE_SIZE) { + 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!"); } @@ -49,7 +49,7 @@ void RawTraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr, packagesBuffer_.insert(packagesBuffer_.end(), &bufferStr[0], &bufferStr[size]); auto packagesCurIter = packagesBuffer_.begin(); if (ParseDataRecursively(packagesCurIter)) { - packagesBuffer_.erase(packagesBuffer_.begin(), packagesCurIter); + packagesCurIter = packagesBuffer_.erase(packagesBuffer_.begin(), packagesCurIter); } return; } @@ -66,7 +66,7 @@ bool RawTraceParser::InitRawTraceFileHeader(std::deque::iterator& packa TS_LOGI("magicNumber=%d, isArch32=%u, cpuNum=%u", header.magicNumber, isArch32, cpuNum); packagesCurIter += sizeof(RawTraceFileHeader); - packagesBuffer_.erase(packagesBuffer_.begin(), packagesCurIter); + packagesCurIter = packagesBuffer_.erase(packagesBuffer_.begin(), packagesCurIter); hasGotHeader_ = true; return true; } @@ -91,40 +91,45 @@ void RawTraceParser::WaitForParserEnd() } bool RawTraceParser::ParseDataRecursively(std::deque::iterator& packagesCurIter) { + uint32_t type = INVALID_UINT8; + uint32_t len = INVALID_UINT32; if (!hasGotHeader_) { TS_CHECK_TRUE(InitRawTraceFileHeader(packagesCurIter), false, "get rawtrace file header failed"); } while (true) { - uint32_t type = INVALID_UINT8; - uint32_t len = INVALID_UINT32; - auto ret = memcpy_s(&type, sizeof(uint32_t), &(*packagesCurIter), sizeof(uint32_t)); + auto ret = memcpy_s(&type, sizeof(type), &(*packagesCurIter), sizeof(type)); TS_CHECK_TRUE(ret == EOK, false, "Memcpy FAILED!Error code is %d, data size is %zu.", ret, packagesBuffer_.size()); - packagesCurIter += sizeof(uint32_t); - ret = memcpy_s(&len, sizeof(uint32_t), &(*packagesCurIter), sizeof(uint32_t)); + packagesCurIter += sizeof(type); + ret = memcpy_s(&len, sizeof(len), &(*packagesCurIter), sizeof(len)); TS_CHECK_TRUE(ret == EOK, false, "Memcpy FAILED!Error code is %d, data size is %zu.", ret, packagesBuffer_.size()); - packagesCurIter += sizeof(uint32_t); - TS_CHECK_TRUE_RET(len < packagesBuffer_.end() - packagesCurIter, false); + packagesCurIter += sizeof(len); + uint32_t restDataLen = std::distance(packagesCurIter, packagesBuffer_.end()); + TS_CHECK_TRUE_RET(len <= restDataLen && packagesBuffer_.size() > 0, false); std::string bufferLine(packagesCurIter, packagesCurIter + len); packagesCurIter += len; - packagesBuffer_.erase(packagesBuffer_.begin(), packagesCurIter); - if (type >= CONTENT_TYPE_CPU_RAW && type <= cpuRawMax_) { - auto cpuId = type - CONTENT_TYPE_CPU_RAW; + packagesCurIter = packagesBuffer_.erase(packagesBuffer_.begin(), packagesCurIter); + uint8_t curType = static_cast(type); + if (curType >= CONTENT_TYPE_CPU_RAW && curType <= cpuRawMax_) { + auto cpuId = curType - CONTENT_TYPE_CPU_RAW; TS_CHECK_TRUE(ParseCpuRawData(cpuId, bufferLine), false, "cpu raw parse failed"); - } else if (type == CONTENT_TYPE_CMDLINES) { + } else if (curType == CONTENT_TYPE_CMDLINES) { TS_CHECK_TRUE(ftraceProcessor_->HandleCmdlines(bufferLine), false, "parse cmdlines failed"); - } else if (type == CONTENT_TYPE_TGIDS) { + } else if (curType == CONTENT_TYPE_TGIDS) { TS_CHECK_TRUE(ftraceProcessor_->HandleTgids(bufferLine), false, "parse tgid failed"); - } else if (type == CONTENT_TYPE_EVENTS_FORMAT) { + } else if (curType == CONTENT_TYPE_EVENTS_FORMAT) { TS_CHECK_TRUE(InitEventFormats(bufferLine), false, "init event format failed"); - } else if (type == CONTENT_TYPE_HEADER_PAGE) { + } else if (curType == CONTENT_TYPE_HEADER_PAGE) { TS_CHECK_TRUE(ftraceProcessor_->HandleHeaderPageFormat(bufferLine), false, "init header page failed"); - } else if (type == CONTENT_TYPE_PRINTK_FORMATS) { + } else if (curType == CONTENT_TYPE_PRINTK_FORMATS) { TS_CHECK_TRUE(PrintkFormatsProcessor::GetInstance().HandlePrintkSyms(bufferLine), false, "init printk_formats failed"); - } else if (type == CONTENT_TYPE_KALLSYMS) { + } else if (curType == CONTENT_TYPE_KALLSYMS) { TS_CHECK_TRUE(ksymsProcessor_->HandleKallSyms(bufferLine), false, "init printk_formats failed"); + } else { + TS_LOGW("Raw Trace Type(%d) Unknown.", 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 6a44a087abc4f46d164d8bf95773aa8d74b9aef0..b9fd4daf53cd30cb85b689527a9ffda25fd2ab40 100644 --- a/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.h +++ b/trace_streamer/src/parser/rawtrace_parser/rawtrace_parser.h @@ -16,10 +16,10 @@ #ifndef RAWTRACE_PARSER_H #define RAWTRACE_PARSER_H #include "common_types.h" +#include "cpu_detail_parser.h" #include "parser_base.h" #include "ftrace_processor.h" #include "kernel_symbols_processor.h" -#include "rawtrace_cpu_detail_parser.h" #include "trace_data_cache.h" namespace SysTuning { diff --git a/trace_streamer/src/parser/thread_state_flag.cpp b/trace_streamer/src/parser/thread_state_flag.cpp index 59a5c0e536a505deb6df8fdd81cecec8432172ee..59e2ad0ad864c21d70e3cc17bc11d68aad938221 100644 --- a/trace_streamer/src/parser/thread_state_flag.cpp +++ b/trace_streamer/src/parser/thread_state_flag.cpp @@ -37,23 +37,17 @@ void ThreadStateFlag::ProcessSate(const std::string& stateStr) { for (size_t i = 0; i < stateStr.size(); i++) { if (stateStr[i] == '+') { - invalid_ = true; SetStat(TASKNEW); continue; } Direction ret = SetStatByChar(stateStr[i]); if (ret == NEED_CONTINUE) { - invalid_ = true; continue; } else if (ret == NEED_BREAK) { break; } } - - if (state_ == WAKEKILL) { - state_ = RUNNABLE; - } } ThreadStateFlag::ThreadStateFlag(const std::string& stateStr) diff --git a/trace_streamer/src/parser/thread_state_flag.h b/trace_streamer/src/parser/thread_state_flag.h index b31a58b85e761238c29a3c0f0a16d1f074b553ef..269763ea4f9c461a755976663cca46e058e52763 100644 --- a/trace_streamer/src/parser/thread_state_flag.h +++ b/trace_streamer/src/parser/thread_state_flag.h @@ -30,10 +30,10 @@ enum Stat : uint32_t { TRACED = 8, // the process is being debug EXITDEAD = 16, EXITZOMBIE = 32, - TASKDEAD = 64, - WAKEKILL = 128, - WAKING = 256, - PARKED = 512, + PARKED = 64, + TASKDEAD = 128, + WAKEKILL = 256, + WAKING = 512, NOLOAD = 1024, TASKNEW = 2048, VALID = 0X8000, @@ -47,7 +47,7 @@ public: { return state_ & ~VALID; } - bool IsValid() const + bool IsInvalid() const { return invalid_; } @@ -71,11 +71,8 @@ private: {'t', TRACED}, {'X', EXITDEAD}, {'Z', EXITZOMBIE}, - {'x', TASKDEAD}, - {'I', TASKDEAD}, - {'K', WAKEKILL}, {'P', PARKED}, - {'N', NOLOAD}, + {'I', TASKDEAD}, {'|', VALID}, }; bool invalid_ = false; diff --git a/trace_streamer/src/protos/types/plugins/memory_data/memory_plugin_result.proto b/trace_streamer/src/protos/types/plugins/memory_data/memory_plugin_result.proto index 2ae6fa6a4770e380359679d0ffbb20bd61d65b85..71fbf3ae322c76301e9b534b290df3df8df7bf73 100755 --- a/trace_streamer/src/protos/types/plugins/memory_data/memory_plugin_result.proto +++ b/trace_streamer/src/protos/types/plugins/memory_data/memory_plugin_result.proto @@ -35,18 +35,18 @@ message SmapsInfo { string end_addr = 2; string permission = 3; string path = 4; - uint64 size = 5; - uint64 rss = 6; - uint64 pss = 7; + uint64 size = 5; // kb + uint64 rss = 6; // kb + uint64 pss = 7; // kb double reside = 8; - uint64 dirty = 9; - uint64 swapper = 10; - uint64 private_clean = 11; - uint64 private_dirty = 12; - uint64 shared_clean = 13; - uint64 shared_dirty = 14; - uint64 swap = 15; - uint64 swap_pss = 16; + uint64 dirty = 9; // kb + uint64 swapper = 10; // kb + uint64 private_clean = 11; // kb + uint64 private_dirty = 12; // kb + uint64 shared_clean = 13; // kb + uint64 shared_dirty = 14; // kb + uint64 swap = 15; // kb + uint64 swap_pss = 16; // kb string category = 17; }; @@ -80,6 +80,7 @@ message ProcessMemoryInfo { uint64 purg_pin_kb = 15; // data from hidumper uint64 gl_pss_kb = 16; + uint64 graph_pss_kb = 17; } message AshmemInfo { @@ -108,7 +109,6 @@ message DmaInfo { string buf_name = 8; string exp_name = 9; } - message GpuProcessInfo { string addr = 1; int32 pid = 2; @@ -139,6 +139,31 @@ message GpuDumpInfo { uint64 gpu_purgeable_size = 4; // bytes } +message RSImageDumpInfo { + // data from hidumper + uint64 size = 1; // bytes + string type = 2; + int32 pid = 3; + string surface_name = 4; +} + +message CpuDumpInfo { + // data from hidumper + uint64 total_cpu_memory_size = 1; // bytes +} + +message WindowManagerServiceInfo { + // data from hidumper + string window_name = 1; + int32 pid = 2; +} + +message ProfileMemInfo { + // /sys/kernel/debug/mali0/ctx/$(pidof xxx)_0/mem_profile + string channel = 1; + uint64 total_memory_size = 2; // bytes +} + message MemoryData { repeated ProcessMemoryInfo processesinfo = 1; repeated SysMeminfo meminfo = 2; @@ -150,4 +175,8 @@ message MemoryData { repeated GpuDumpInfo gpudumpinfo = 8; uint64 gpu_limit_size = 9; // bytes uint64 gpu_used_size = 10; // bytes + repeated RSImageDumpInfo rsdumpinfo = 11; + repeated CpuDumpInfo cpudumpinfo = 12; + repeated WindowManagerServiceInfo windowinfo = 13; + repeated ProfileMemInfo profilememinfo = 14; } diff --git a/trace_streamer/src/rpc/rpc_server.cpp b/trace_streamer/src/rpc/rpc_server.cpp index 2f36de87b7c9ba32d75881a8ec91665621b9d19c..f4139845fb5005c206ecdc22379b8b7067fe2873 100644 --- a/trace_streamer/src/rpc/rpc_server.cpp +++ b/trace_streamer/src/rpc/rpc_server.cpp @@ -170,6 +170,7 @@ bool RpcServer::ParseSplitFileData(const uint8_t* data, if (isSplitFile && isFinish && ts_->GetFileType() == TRACE_FILETYPE_H_TRACE) { uint64_t dataSize = 0; std::string result = VALUE; + ts_->GetHtraceData()->ClearNativehookData(); for (const auto& itemHtrace : ts_->GetHtraceData()->GetTraceDataHtrace()) { dataSize += itemHtrace.second; result += OFFSET + std::to_string(itemHtrace.first); @@ -218,7 +219,6 @@ bool RpcServer::ParseSplitFileData(const uint8_t* data, } void RpcServer::ProcHookCommSplitResult(SplitFileCallBack splitFileCallBack) { - ts_->GetHtraceData()->ClearNativehookData(); std::string lenBuffer(sizeof(uint32_t), 0); for (auto& commProto : ts_->GetTraceDataCache()->HookCommProtos()) { uint32_t len = commProto->size(); diff --git a/trace_streamer/src/table/monitor/BUILD.gn b/trace_streamer/src/table/monitor/BUILD.gn index de0738d47dbddbfde6ff25c32f669237cb98d509..554a5f5076072f2fadbad54638c26658a769ba14 100644 --- a/trace_streamer/src/table/monitor/BUILD.gn +++ b/trace_streamer/src/table/monitor/BUILD.gn @@ -24,8 +24,11 @@ ohos_source_set("monitor_tables") { "live_process_table.cpp", "log_table.cpp", "memory_ashmem_table.cpp", + "memory_cpu_table.cpp", "memory_dma_table.cpp", "memory_process_gpu_table.cpp", + "memory_profile_table.cpp", + "memory_rs_image_table.cpp", "memory_window_gpu_table.cpp", "network_table.cpp", "paged_memory_sample_table.cpp", diff --git a/trace_streamer/src/table/monitor/memory_cpu_table.cpp b/trace_streamer/src/table/monitor/memory_cpu_table.cpp new file mode 100644 index 0000000000000000000000000000000000000000..98c4441b7b889edc7a8d41e181d0041257d61d99 --- /dev/null +++ b/trace_streamer/src/table/monitor/memory_cpu_table.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "memory_cpu_table.h" + +namespace SysTuning { +namespace TraceStreamer { +enum class Index : int32_t { ID = 0, TS, TOTAL_SIZE }; +MemoryCpuTable::MemoryCpuTable(const TraceDataCache* dataCache) : TableBase(dataCache) +{ + tableColumn_.push_back(TableBase::ColumnInfo("id", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("ts", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("total_size", "INTEGER")); + tablePriKey_.push_back("id"); +} + +MemoryCpuTable::~MemoryCpuTable() {} + +std::unique_ptr MemoryCpuTable::CreateCursor() +{ + return std::make_unique(dataCache_, this); +} + +MemoryCpuTable::Cursor::Cursor(const TraceDataCache* dataCache, TableBase* table) + : TableBase::Cursor(dataCache, table, static_cast(dataCache->GetConstCpuDumpInfo().Size())), + cpuDumpInfoObj_(dataCache->GetConstCpuDumpInfo()) +{ +} + +MemoryCpuTable::Cursor::~Cursor() {} + +int32_t MemoryCpuTable::Cursor::Column(int32_t column) const +{ + switch (static_cast(column)) { + case Index::ID: + sqlite3_result_int64(context_, cpuDumpInfoObj_.IdsData()[CurrentRow()]); + break; + case Index::TS: + sqlite3_result_int64(context_, cpuDumpInfoObj_.TimeStampData()[CurrentRow()]); + break; + case Index::TOTAL_SIZE: + sqlite3_result_int64(context_, cpuDumpInfoObj_.TotalSizes()[CurrentRow()]); + break; + default: + TS_LOGF("Unregistered column : %d", column); + break; + } + return SQLITE_OK; +} +} // namespace TraceStreamer +} // namespace SysTuning diff --git a/trace_streamer/src/table/monitor/memory_cpu_table.h b/trace_streamer/src/table/monitor/memory_cpu_table.h new file mode 100644 index 0000000000000000000000000000000000000000..24ad10339088ed90ab237da3a72bd523e1558224 --- /dev/null +++ b/trace_streamer/src/table/monitor/memory_cpu_table.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef MEMORY_CPU_TABLE_H +#define MEMORY_CPU_TABLE_H + +#include "table_base.h" +#include "trace_data_cache.h" + +namespace SysTuning { +namespace TraceStreamer { +class MemoryCpuTable : public TableBase { +public: + explicit MemoryCpuTable(const TraceDataCache* dataCache); + ~MemoryCpuTable() override; + std::unique_ptr CreateCursor() override; + +private: + class Cursor : public TableBase::Cursor { + public: + explicit Cursor(const TraceDataCache* dataCache, TableBase* table); + ~Cursor() override; + int32_t Column(int32_t column) const override; + + private: + const CpuDumpInfo& cpuDumpInfoObj_; + }; +}; +} // namespace TraceStreamer +} // namespace SysTuning +#endif // MEMORY_CPU_TABLE_H diff --git a/trace_streamer/src/table/monitor/memory_profile_table.cpp b/trace_streamer/src/table/monitor/memory_profile_table.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e60ac9f770995226b0f897798416287f4fb5696c --- /dev/null +++ b/trace_streamer/src/table/monitor/memory_profile_table.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "memory_profile_table.h" + +namespace SysTuning { +namespace TraceStreamer { +enum class Index : int32_t { ID = 0, TS, CHANNEL_INDEX, TOTAL_SIZE }; +MemoryProfileTable::MemoryProfileTable(const TraceDataCache* dataCache) : TableBase(dataCache) +{ + tableColumn_.push_back(TableBase::ColumnInfo("id", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("ts", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("channel_id", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("total_size", "INTEGER")); + tablePriKey_.push_back("id"); +} + +MemoryProfileTable::~MemoryProfileTable() {} + +std::unique_ptr MemoryProfileTable::CreateCursor() +{ + return std::make_unique(dataCache_, this); +} + +MemoryProfileTable::Cursor::Cursor(const TraceDataCache* dataCache, TableBase* table) + : TableBase::Cursor(dataCache, table, static_cast(dataCache->GetConstProfileMemInfo().Size())), + profileMemoryInfoObj_(dataCache->GetConstProfileMemInfo()) +{ +} + +MemoryProfileTable::Cursor::~Cursor() {} + +int32_t MemoryProfileTable::Cursor::Column(int32_t column) const +{ + switch (static_cast(column)) { + case Index::ID: + sqlite3_result_int64(context_, profileMemoryInfoObj_.IdsData()[CurrentRow()]); + break; + case Index::TS: + sqlite3_result_int64(context_, profileMemoryInfoObj_.TimeStampData()[CurrentRow()]); + break; + case Index::CHANNEL_INDEX: + sqlite3_result_int64(context_, profileMemoryInfoObj_.ChannelIndexs()[CurrentRow()]); + break; + case Index::TOTAL_SIZE: + sqlite3_result_int64(context_, profileMemoryInfoObj_.TotalSizes()[CurrentRow()]); + break; + default: + TS_LOGF("Unregistered column : %d", column); + break; + } + return SQLITE_OK; +} +} // namespace TraceStreamer +} // namespace SysTuning diff --git a/trace_streamer/src/table/monitor/memory_profile_table.h b/trace_streamer/src/table/monitor/memory_profile_table.h new file mode 100644 index 0000000000000000000000000000000000000000..c37e507bc9111b059d2f62db6ac6253fcc84907f --- /dev/null +++ b/trace_streamer/src/table/monitor/memory_profile_table.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef MEMORY_PROFILER_TABLE_H +#define MEMORY_PROFILER_TABLE_H + +#include "table_base.h" +#include "trace_data_cache.h" + +namespace SysTuning { +namespace TraceStreamer { +class MemoryProfileTable : public TableBase { +public: + explicit MemoryProfileTable(const TraceDataCache* dataCache); + ~MemoryProfileTable() override; + std::unique_ptr CreateCursor() override; + +private: + class Cursor : public TableBase::Cursor { + public: + explicit Cursor(const TraceDataCache* dataCache, TableBase* table); + ~Cursor() override; + int32_t Column(int32_t column) const override; + + private: + const ProfileMemInfo& profileMemoryInfoObj_; + }; +}; +} // namespace TraceStreamer +} // namespace SysTuning +#endif // MEMORY_PROFILER_TABLE_H diff --git a/trace_streamer/src/table/monitor/memory_rs_image_table.cpp b/trace_streamer/src/table/monitor/memory_rs_image_table.cpp new file mode 100644 index 0000000000000000000000000000000000000000..45c09cadae5d651590bae9adbf62b31d9414acf5 --- /dev/null +++ b/trace_streamer/src/table/monitor/memory_rs_image_table.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "memory_rs_image_table.h" + +namespace SysTuning { +namespace TraceStreamer { +enum class Index : int32_t { + ID = 0, + IPID, + TS, + MEM_SIZE, + TYPE_INDEX, + SURFACE_NAME_INDEX, +}; +MemoryRSImageTable::MemoryRSImageTable(const TraceDataCache* dataCache) : TableBase(dataCache) +{ + tableColumn_.push_back(TableBase::ColumnInfo("id", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("ipid", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("ts", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("mem_size", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("type_id", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("surface_name_id", "INTEGER")); + tablePriKey_.push_back("id"); +} + +MemoryRSImageTable::~MemoryRSImageTable() {} + +std::unique_ptr MemoryRSImageTable::CreateCursor() +{ + return std::make_unique(dataCache_, this); +} + +MemoryRSImageTable::Cursor::Cursor(const TraceDataCache* dataCache, TableBase* table) + : TableBase::Cursor(dataCache, table, static_cast(dataCache->GetConstRSImageDumpInfo().Size())), + rsImageDumpInfoObj_(dataCache->GetConstRSImageDumpInfo()) +{ +} + +MemoryRSImageTable::Cursor::~Cursor() {} + +int32_t MemoryRSImageTable::Cursor::Column(int32_t column) const +{ + switch (static_cast(column)) { + case Index::ID: + sqlite3_result_int64(context_, rsImageDumpInfoObj_.IdsData()[CurrentRow()]); + break; + case Index::IPID: + if (rsImageDumpInfoObj_.Ipids()[CurrentRow()] != INVALID_IPID) { + sqlite3_result_int64(context_, rsImageDumpInfoObj_.Ipids()[CurrentRow()]); + } + break; + case Index::TS: + sqlite3_result_int64(context_, rsImageDumpInfoObj_.TimeStampData()[CurrentRow()]); + break; + case Index::MEM_SIZE: + sqlite3_result_int64(context_, rsImageDumpInfoObj_.MemSizes()[CurrentRow()]); + break; + case Index::TYPE_INDEX: + sqlite3_result_int64(context_, rsImageDumpInfoObj_.TypeIndexs()[CurrentRow()]); + break; + case Index::SURFACE_NAME_INDEX: + sqlite3_result_int64(context_, rsImageDumpInfoObj_.SurfaceNameIndexs()[CurrentRow()]); + break; + default: + TS_LOGF("Unregistered column : %d", column); + break; + } + return SQLITE_OK; +} +} // namespace TraceStreamer +} // namespace SysTuning diff --git a/trace_streamer/src/table/monitor/memory_rs_image_table.h b/trace_streamer/src/table/monitor/memory_rs_image_table.h new file mode 100644 index 0000000000000000000000000000000000000000..54878ea83f11ba8fb480bc0326c2f59a52976ded --- /dev/null +++ b/trace_streamer/src/table/monitor/memory_rs_image_table.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 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. + */ + +#ifndef MEMORY_RS_IMAGE_TABLE_H +#define MEMORY_RS_IMAGE_TABLE_H + +#include "table_base.h" +#include "trace_data_cache.h" + +namespace SysTuning { +namespace TraceStreamer { +class MemoryRSImageTable : public TableBase { +public: + explicit MemoryRSImageTable(const TraceDataCache* dataCache); + ~MemoryRSImageTable() override; + std::unique_ptr CreateCursor() override; + +private: + class Cursor : public TableBase::Cursor { + public: + explicit Cursor(const TraceDataCache* dataCache, TableBase* table); + ~Cursor() override; + int32_t Column(int32_t column) const override; + + private: + const RSImageDumpInfo& rsImageDumpInfoObj_; + }; +}; +} // namespace TraceStreamer +} // namespace SysTuning +#endif // MEMORY_RS_IMAGE_TABLE_H diff --git a/trace_streamer/src/table/monitor/memory_window_gpu_table.cpp b/trace_streamer/src/table/monitor/memory_window_gpu_table.cpp index 1c7c51b043243c87834835599e8e71cc8a400871..80edb60c26fa7714a6eb135a357b206bd6e9d64a 100644 --- a/trace_streamer/src/table/monitor/memory_window_gpu_table.cpp +++ b/trace_streamer/src/table/monitor/memory_window_gpu_table.cpp @@ -26,7 +26,8 @@ enum class Index : int32_t { CATEGORY_NAME_ID, SIZE, COUNT, - PURGEABLE_SIZE + PURGEABLE_SIZE, + IPID }; MemoryWindowGpuTable::MemoryWindowGpuTable(const TraceDataCache* dataCache) : TableBase(dataCache) { @@ -39,6 +40,7 @@ MemoryWindowGpuTable::MemoryWindowGpuTable(const TraceDataCache* dataCache) : Ta tableColumn_.push_back(TableBase::ColumnInfo("size", "INTEGER")); tableColumn_.push_back(TableBase::ColumnInfo("count", "INTEGER")); tableColumn_.push_back(TableBase::ColumnInfo("purgeable_size", "INTEGER")); + tableColumn_.push_back(TableBase::ColumnInfo("ipid", "INTEGER")); tablePriKey_.push_back("id"); } @@ -87,6 +89,11 @@ int32_t MemoryWindowGpuTable::Cursor::Column(int32_t column) const case Index::PURGEABLE_SIZE: sqlite3_result_int64(context_, GpuWindowMemDataObj_.PurgeableSizes()[CurrentRow()]); break; + case Index::IPID: + if (GpuWindowMemDataObj_.Ipids()[CurrentRow()] != INVALID_IPID) { + sqlite3_result_int64(context_, GpuWindowMemDataObj_.Ipids()[CurrentRow()]); + } + break; default: TS_LOGF("Unregistered column : %d", column); break; diff --git a/trace_streamer/src/trace_data/trace_data_cache.cpp b/trace_streamer/src/trace_data/trace_data_cache.cpp index bd081923822089d72f8769fe426f1289e1788f63..9cce40839285704b4a11e919ce6460163e0c4bb4 100644 --- a/trace_streamer/src/trace_data/trace_data_cache.cpp +++ b/trace_streamer/src/trace_data/trace_data_cache.cpp @@ -62,6 +62,13 @@ #include "log_table.h" #include "measure_filter_table.h" #include "measure_table.h" +#include "memory_ashmem_table.h" +#include "memory_dma_table.h" +#include "memory_process_gpu_table.h" +#include "memory_window_gpu_table.h" +#include "memory_cpu_table.h" +#include "memory_profile_table.h" +#include "memory_rs_image_table.h" #include "meta_table.h" #include "native_hook_frame_table.h" #include "native_hook_statistic_table.h" @@ -95,10 +102,6 @@ #include "thread_state_table.h" #include "thread_table.h" #include "trace_config_table.h" -#include "memory_ashmem_table.h" -#include "memory_dma_table.h" -#include "memory_process_gpu_table.h" -#include "memory_window_gpu_table.h" namespace SysTuning { namespace TraceStreamer { @@ -199,6 +202,9 @@ void TraceDataCache::InitDB() TableBase::TableDeclare(*db_, this, "memory_dma"); TableBase::TableDeclare(*db_, this, "memory_process_gpu"); TableBase::TableDeclare(*db_, this, "memory_window_gpu"); + TableBase::TableDeclare(*db_, this, "memory_cpu"); + TableBase::TableDeclare(*db_, this, "memory_profile"); + TableBase::TableDeclare(*db_, this, "memory_rs_image"); TableBase::TableDeclare(*db_, this, "perf_report"); TableBase::TableDeclare(*db_, this, "perf_sample"); @@ -280,6 +286,9 @@ void TraceDataCache::InitDB() TableBase::TableDeclare(*db_, this, "_memory_dma"); TableBase::TableDeclare(*db_, this, "_memory_process_gpu"); TableBase::TableDeclare(*db_, this, "_memory_window_gpu"); + TableBase::TableDeclare(*db_, this, "_memory_cpu"); + TableBase::TableDeclare(*db_, this, "_memory_profile"); + TableBase::TableDeclare(*db_, this, "_memory_rs_image"); #if WITH_EBPF_HELP TableBase::TableDeclare(*db_, this, "_ebpf_process_maps"); TableBase::TableDeclare(*db_, this, "_ebpf_elf"); diff --git a/trace_streamer/src/trace_data/trace_data_cache_base.h b/trace_streamer/src/trace_data/trace_data_cache_base.h index 19820e5530251c06200e7a91d2d6cd089750e1c9..590154f6e2dad287b308833fd81ba32a17158589 100644 --- a/trace_streamer/src/trace_data/trace_data_cache_base.h +++ b/trace_streamer/src/trace_data/trace_data_cache_base.h @@ -69,18 +69,18 @@ public: {TASK_UNINTERRUPTIBLE_IO, "D-IO"}, {TASK_UNINTERRUPTIBLE_NIO, "D-NIO"}, {TASK_RUNNING, "Running"}, - {TASK_INTERRUPTED, "T"}, + {TASK_STOPPED, "T"}, {TASK_TRACED, "t"}, {TASK_EXIT_DEAD, "X"}, {TASK_ZOMBIE, "Z"}, {TASK_PARKED, "P"}, - {TASK_KILLED, "K"}, + {TASK_DEAD, "I"}, {TASK_DK, "DK"}, {TASK_DK_IO, "DK-IO"}, {TASK_DK_NIO, "DK-NIO"}, {TASK_TRACED_KILL, "TK"}, - {TASK_WAKEKILL, "W"}, - {TASK_FOREGROUND, "R+"}, + {TASK_WAKEKILL, "R+"}, + {TASK_NEW, "R+"}, {TASK_RUNNABLE_BINDER, "R-B"}, {TASK_MAX, "S"}, {TASK_INVALID, "U"}}; @@ -177,6 +177,9 @@ public: DmaMemData dmaMemData_; GpuProcessMemData gpuProcessMemData_; GpuWindowMemData gpuWindowMemData_; + CpuDumpInfo cpuDumpInfo_; + ProfileMemInfo profileMemInfo_; + RSImageDumpInfo rsImageDumpInfo_; }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/trace_data/trace_data_cache_reader.cpp b/trace_streamer/src/trace_data/trace_data_cache_reader.cpp index a1795eb4a71ca8ecc899d88451c7dab401f065af..ae3f0eb38a051809621be2de04f06517ccb07073 100644 --- a/trace_streamer/src/trace_data/trace_data_cache_reader.cpp +++ b/trace_streamer/src/trace_data/trace_data_cache_reader.cpp @@ -379,5 +379,17 @@ const GpuWindowMemData& TraceDataCacheReader::GetConstGpuWindowMemData() const { return gpuWindowMemData_; } +const CpuDumpInfo& TraceDataCacheReader::GetConstCpuDumpInfo() const +{ + return cpuDumpInfo_; +} +const ProfileMemInfo& TraceDataCacheReader::GetConstProfileMemInfo() const +{ + return profileMemInfo_; +} +const RSImageDumpInfo& TraceDataCacheReader::GetConstRSImageDumpInfo() const +{ + return rsImageDumpInfo_; +} } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/trace_data/trace_data_cache_reader.h b/trace_streamer/src/trace_data/trace_data_cache_reader.h index bfe2c349a51e4930a775033ca2c8456603ce28c2..98232b4ab8745919fa9b559fd6d0963e20464326 100644 --- a/trace_streamer/src/trace_data/trace_data_cache_reader.h +++ b/trace_streamer/src/trace_data/trace_data_cache_reader.h @@ -118,6 +118,9 @@ public: const DmaMemData& GetConstDmaMemData() const; const GpuProcessMemData& GetConstGpuProcessMemData() const; const GpuWindowMemData& GetConstGpuWindowMemData() const; + const CpuDumpInfo& GetConstCpuDumpInfo() const; + const ProfileMemInfo& GetConstProfileMemInfo() const; + const RSImageDumpInfo& GetConstRSImageDumpInfo() const; }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/trace_data/trace_data_cache_writer.cpp b/trace_streamer/src/trace_data/trace_data_cache_writer.cpp index 9f6d791738e53d395b5ff43cdaebaa6286a9c60c..7998b262096018eaa43d60cb887f4a432ec70045 100644 --- a/trace_streamer/src/trace_data/trace_data_cache_writer.cpp +++ b/trace_streamer/src/trace_data/trace_data_cache_writer.cpp @@ -70,6 +70,7 @@ void TraceDataCacheWriter::MixTraceTime(uint64_t timestampMin, uint64_t timestam } if (timestampMin == timestampMax) { ++timestampMax; + --timestampMin; } if (timestampMin == std::numeric_limits::max() || timestampMax == 0) { return; @@ -423,7 +424,18 @@ GpuWindowMemData* TraceDataCacheWriter::GetGpuWindowMemData() { return &gpuWindowMemData_; } - +CpuDumpInfo* TraceDataCacheWriter::GetCpuDumpInfo() +{ + return &cpuDumpInfo_; +} +ProfileMemInfo* TraceDataCacheWriter::GetProfileMemInfo() +{ + return &profileMemInfo_; +} +RSImageDumpInfo* TraceDataCacheWriter::GetRSImageDumpInfo() +{ + return &rsImageDumpInfo_; +} void TraceDataCacheWriter::Clear() { rawData_.Clear(); diff --git a/trace_streamer/src/trace_data/trace_data_cache_writer.h b/trace_streamer/src/trace_data/trace_data_cache_writer.h index e37bede4b5a802b54419b27dcfe5efdc89e4230a..0d9c1614920fe08fad136c08a99e1598675d2dc5 100644 --- a/trace_streamer/src/trace_data/trace_data_cache_writer.h +++ b/trace_streamer/src/trace_data/trace_data_cache_writer.h @@ -117,6 +117,9 @@ public: DmaMemData* GetDmaMemData(); GpuProcessMemData* GetGpuProcessMemData(); GpuWindowMemData* GetGpuWindowMemData(); + CpuDumpInfo* GetCpuDumpInfo(); + ProfileMemInfo* GetProfileMemInfo(); + RSImageDumpInfo* GetRSImageDumpInfo(); }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/trace_data/trace_stdtype.cpp b/trace_streamer/src/trace_data/trace_stdtype.cpp index a49d12fc65ab81772753ee5de192b5c632bc19ff..f9c0a92bc339bf069a91c3a5a300b69b0b5ec1d5 100644 --- a/trace_streamer/src/trace_data/trace_stdtype.cpp +++ b/trace_streamer/src/trace_data/trace_stdtype.cpp @@ -3502,6 +3502,7 @@ void GpuWindowMemData::AppendNewData(uint64_t ts, sizes_.emplace_back(size); counts_.emplace_back(count); purgeableSizes_.emplace_back(purgeableSize); + ipids_.emplace_back(INVALID_IPID); ids_.push_back(rowCount_); rowCount_++; } @@ -3533,6 +3534,73 @@ const std::deque& GpuWindowMemData::PurgeableSizes() const { return purgeableSizes_; } +const std::deque& GpuWindowMemData::Ipids() const +{ + return ipids_; +} +void GpuWindowMemData::RevicesIpid(const std::map& windowIdToIpidMap) +{ + for (auto i = 0; i < Size(); i++) { + if (windowIdToIpidMap.count(windowNameIds_[i])) { + ipids_[i] = windowIdToIpidMap.at(windowNameIds_[i]); + } + } +} + +void CpuDumpInfo::AppendNewData(uint64_t timestamp, uint64_t size) +{ + timeStamps_.emplace_back(timestamp); + totalSizes_.emplace_back(size); + ids_.emplace_back(Size()); +} +const std::deque& CpuDumpInfo::TotalSizes() const +{ + return totalSizes_; +} +void ProfileMemInfo::AppendNewData(uint64_t timestamp, DataIndex channelIndex, uint64_t size) +{ + timeStamps_.emplace_back(timestamp); + totalSizes_.emplace_back(size); + channelIndexs_.emplace_back(channelIndex); + ids_.emplace_back(Size()); +} +const std::deque& ProfileMemInfo::ChannelIndexs() const +{ + return channelIndexs_; +} +const std::deque& ProfileMemInfo::TotalSizes() const +{ + return totalSizes_; +} +void RSImageDumpInfo::AppendNewData(uint64_t timestamp, + uint64_t memSize, + DataIndex typeIndex, + InternalPid ipid, + DataIndex name) +{ + timeStamps_.emplace_back(timestamp); + memSizes_.emplace_back(memSize); + typeIndexs_.emplace_back(typeIndex); + ipids_.emplace_back(ipid); + surfaceNameIndexs_.emplace_back(name); + ids_.emplace_back(Size()); +} +const std::deque& RSImageDumpInfo::MemSizes() const +{ + return memSizes_; +} +const std::deque& RSImageDumpInfo::TypeIndexs() const +{ + return typeIndexs_; +} +const std::deque& RSImageDumpInfo::Ipids() const +{ + return ipids_; +} +const std::deque& RSImageDumpInfo::SurfaceNameIndexs() const +{ + return surfaceNameIndexs_; +} } // namespace TraceStdtype } // namespace SysTuning diff --git a/trace_streamer/src/trace_data/trace_stdtype.h b/trace_streamer/src/trace_data/trace_stdtype.h index 85d9b1bf43c79cb570c2b06a50145d83804671bd..69b645f73c87a4eedc2f42d1eeaecfab7485bebb 100644 --- a/trace_streamer/src/trace_data/trace_stdtype.h +++ b/trace_streamer/src/trace_data/trace_stdtype.h @@ -2734,6 +2734,7 @@ public: uint64_t size, uint32_t count, uint64_t purgeableSize); + void RevicesIpid(const std::map& windowIdToIpidMap); const std::deque& WindowNameIds() const; const std::deque& WindowIds() const; const std::deque& ModuleNameIds() const; @@ -2741,6 +2742,7 @@ public: const std::deque& Sizes() const; const std::deque& Counts() const; const std::deque& PurgeableSizes() const; + const std::deque& Ipids() const; void Clear() override { CacheBase::Clear(); @@ -2751,6 +2753,7 @@ public: sizes_.clear(); counts_.clear(); purgeableSizes_.clear(); + ipids_.clear(); } private: @@ -2761,9 +2764,60 @@ private: std::deque sizes_ = {}; std::deque counts_ = {}; std::deque purgeableSizes_ = {}; + std::deque ipids_ = {}; uint32_t rowCount_ = 0; }; +class CpuDumpInfo : public CacheBase { +public: + void AppendNewData(uint64_t timestamp, uint64_t size); + const std::deque& TotalSizes() const; + void Clear() override + { + CacheBase::Clear(); + totalSizes_.clear(); + } + +private: + std::deque totalSizes_ = {}; +}; +class ProfileMemInfo : public CacheBase { +public: + void AppendNewData(uint64_t timestamp, DataIndex channelIndex, uint64_t size); + const std::deque& ChannelIndexs() const; + const std::deque& TotalSizes() const; + void Clear() override + { + CacheBase::Clear(); + channelIndexs_.clear(); + totalSizes_.clear(); + } + +private: + std::deque channelIndexs_ = {}; + std::deque totalSizes_ = {}; +}; +class RSImageDumpInfo : public CacheBase { +public: + void AppendNewData(uint64_t timestamp, uint64_t memSize, DataIndex typeIndex, InternalPid ipid, DataIndex name); + const std::deque& MemSizes() const; + const std::deque& TypeIndexs() const; + const std::deque& Ipids() const; + const std::deque& SurfaceNameIndexs() const; + void Clear() override + { + CacheBase::Clear(); + memSizes_.clear(); + typeIndexs_.clear(); + ipids_.clear(); + surfaceNameIndexs_.clear(); + } +private: + std::deque memSizes_ = {}; + std::deque typeIndexs_ = {}; + std::deque ipids_ = {}; + std::deque surfaceNameIndexs_ = {}; +}; } // namespace TraceStdtype } // namespace SysTuning diff --git a/trace_streamer/test/unittest/animation_filter_test.cpp b/trace_streamer/test/unittest/animation_filter_test.cpp index d231647f4884381d1e241f28f24cc5aefefef9f8..9f9b24033ecab30d54289ccca78f8f39bebce4cd 100644 --- a/trace_streamer/test/unittest/animation_filter_test.cpp +++ b/trace_streamer/test/unittest/animation_filter_test.cpp @@ -267,7 +267,9 @@ HWTEST_F(AnimationFilterTest, AnimationStartAndEnd, TestSize.Level1) auto callStackRow = callStackSlice->AppendInternalSlice(line.ts, dur, INVALID_UINT32, INVALID_UINT64, INVALID_UINT16, callStackName, depth, parentId); - stream_.streamFilters_->animationFilter_->StartAnimationEvent(line, callStackRow); + TracePoint point; + point.name_ = "1693876195576., 1693876195586."; + stream_.streamFilters_->animationFilter_->StartAnimationEvent(line, point, callStackRow); EXPECT_TRUE(!stream_.streamFilters_->animationFilter_->animationCallIds_.empty()); stream_.streamFilters_->animationFilter_->FinishAnimationEvent(line, callStackRow); EXPECT_TRUE(stream_.streamFilters_->animationFilter_->animationCallIds_.empty()); diff --git a/trace_streamer/test/unittest/hilog_parser_test.cpp b/trace_streamer/test/unittest/hilog_parser_test.cpp index f1d51a73317e6f238b7fc992e9c62e108c4c12e1..191b39725dbe63c6102b4a4a515605918c0b589d 100644 --- a/trace_streamer/test/unittest/hilog_parser_test.cpp +++ b/trace_streamer/test/unittest/hilog_parser_test.cpp @@ -56,7 +56,8 @@ HWTEST_F(HilogParserTest, ParseHilogInfoWithoutHilogLine, TestSize.Level1) std::string hilogData = ""; hilogInfo->SerializeToString(&hilogData); ProtoReader::BytesView hilogInfoData(reinterpret_cast(hilogData.data()), hilogData.size()); - htraceHiLogParser.Parse(hilogInfoData); + bool issplit = false; + htraceHiLogParser.Parse(hilogInfoData, issplit); auto size = stream_.traceDataCache_->GetConstHilogData().Size(); EXPECT_FALSE(size); } @@ -96,7 +97,8 @@ HWTEST_F(HilogParserTest, ParseHilogInfoWithOneHilogLine, TestSize.Level1) std::string hilogData = ""; hilogInfo->SerializeToString(&hilogData); ProtoReader::BytesView hilogInfoData(reinterpret_cast(hilogData.data()), hilogData.size()); - htraceHiLogParser.Parse(hilogInfoData); + bool issplit = false; + htraceHiLogParser.Parse(hilogInfoData, issplit); auto seq = stream_.traceDataCache_->GetConstHilogData().HilogLineSeqs()[0]; EXPECT_EQ(seq, LOG_ID); @@ -187,7 +189,8 @@ HWTEST_F(HilogParserTest, ParseHilogInfoWithMultipleHilogLine, TestSize.Level1) std::string hilogData = ""; hilogInfo->SerializeToString(&hilogData); ProtoReader::BytesView hilogInfoData(reinterpret_cast(hilogData.data()), hilogData.size()); - htraceHiLogParser.Parse(hilogInfoData); + bool issplit = false; + htraceHiLogParser.Parse(hilogInfoData, issplit); auto seqFirst = stream_.traceDataCache_->GetConstHilogData().HilogLineSeqs()[0]; auto seqSecond = stream_.traceDataCache_->GetConstHilogData().HilogLineSeqs()[1]; @@ -278,7 +281,8 @@ HWTEST_F(HilogParserTest, ParseHilogInfoWithErrLevelHilogLine, TestSize.Level1) std::string hilogData = ""; hilogInfo->SerializeToString(&hilogData); ProtoReader::BytesView hilogInfoData(reinterpret_cast(hilogData.data()), hilogData.size()); - htraceHiLogParser.Parse(hilogInfoData); + bool issplit = false; + htraceHiLogParser.Parse(hilogInfoData, issplit); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_HILOG, STAT_EVENT_RECEIVED); EXPECT_TRUE(1 == eventCount); @@ -321,7 +325,8 @@ HWTEST_F(HilogParserTest, ParseHilogInfoLostHilogLine, TestSize.Level1) std::string hilogData = ""; hilogInfo->SerializeToString(&hilogData); ProtoReader::BytesView hilogInfoData(reinterpret_cast(hilogData.data()), hilogData.size()); - htraceHiLogParser.Parse(hilogInfoData); + bool issplit = false; + htraceHiLogParser.Parse(hilogInfoData, issplit); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_HILOG, STAT_EVENT_RECEIVED); EXPECT_TRUE(1 == eventCount); @@ -368,7 +373,8 @@ HWTEST_F(HilogParserTest, ParseHilogInfoHasDuplicateHilogLine, TestSize.Level1) std::string hilogData = ""; hilogInfo->SerializeToString(&hilogData); ProtoReader::BytesView hilogInfoData(reinterpret_cast(hilogData.data()), hilogData.size()); - htraceHiLogParser.Parse(hilogInfoData); + bool issplit = false; + htraceHiLogParser.Parse(hilogInfoData, issplit); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_HILOG, STAT_EVENT_RECEIVED); EXPECT_TRUE(2 == eventCount); @@ -395,7 +401,7 @@ HWTEST_F(HilogParserTest, ParseTxtHilogInfo, TestSize.Level1) std::unique_ptr buf = std::make_unique(readSize); memcpy_s(buf.get(), readSize, data, sizeof(data)); - EXPECT_TRUE(ta->ParseTraceDataSegment(std::move(buf), sizeof(data))); + EXPECT_TRUE(ta->ParseTraceDataSegment(std::move(buf), sizeof(data), 0, 1)); ta->WaitForParserEnd(); EXPECT_TRUE(ta->traceDataCache_->GetConstHilogData().HilogLineSeqs().size() == 1); @@ -427,7 +433,7 @@ HWTEST_F(HilogParserTest, ParseTxtHilogInfoWithTimeFormat, TestSize.Level1) std::unique_ptr buf = std::make_unique(readSize); memcpy_s(buf.get(), readSize, data, sizeof(data)); - EXPECT_TRUE(ta->ParseTraceDataSegment(std::move(buf), sizeof(data))); + EXPECT_TRUE(ta->ParseTraceDataSegment(std::move(buf), sizeof(data), 0, 1)); ta->WaitForParserEnd(); EXPECT_TRUE(ta->traceDataCache_->GetConstHilogData().HilogLineSeqs().size() == 5); diff --git a/trace_streamer/test/unittest/htrace_binder_event_test.cpp b/trace_streamer/test/unittest/htrace_binder_event_test.cpp index a64183d7bfdde0ed1bf82742a54257478a992bf3..e2bd001de9389e8b097c8597afdc966983357f8e 100644 --- a/trace_streamer/test/unittest/htrace_binder_event_test.cpp +++ b/trace_streamer/test/unittest/htrace_binder_event_test.cpp @@ -89,7 +89,8 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderfilterNeedReply, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool haveSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, haveSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 1); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().ArgSetIdsData()[0] == 0); @@ -144,7 +145,8 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderfilterNeedReplyAndReceive, TestSize. dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool haveSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, haveSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 1); EXPECT_TRUE(stream_.traceDataCache_->GetConstArgSetData().Size() == 7); @@ -171,7 +173,7 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderfilterNeedReplyAndReceive, TestSize. ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, haveSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 2); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().ArgSetIdsData()[0] == 0); @@ -227,7 +229,8 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderfilterNeedReplyAndReceiveWithAlloc, dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool haveSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, haveSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 1); EXPECT_TRUE(stream_.traceDataCache_->GetConstArgSetData().Size() == 7); @@ -257,7 +260,7 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderfilterNeedReplyAndReceiveWithAlloc, ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, haveSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstArgSetData().Size() == 9); @@ -283,7 +286,7 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderfilterNeedReplyAndReceiveWithAlloc, ProtoReader::BytesView cpuDetailBytesView3(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg3.protoData = cpuDetailBytesView3; - eventParser.ParseDataItem(dataSeg3, dataSeg3.clockId); + eventParser.ParseDataItem(dataSeg3, dataSeg3.clockId, haveSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 2); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().ArgSetIdsData()[0] == 0); @@ -338,8 +341,8 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderfilterNeedReplyAndReceiveNotmatch, T ProtoReader::BytesView cpuDetailBytesView(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg.protoData = cpuDetailBytesView; - - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool isSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, isSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 1); @@ -366,7 +369,7 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderfilterNeedReplyAndReceiveNotmatch, T ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, isSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 1); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().ArgSetIdsData()[0] == 0); @@ -420,7 +423,8 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderfilterNoNeedReply, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool isSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, isSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 1); } @@ -473,7 +477,8 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderNoneedReplyAndReceivefilter, TestSiz dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool isSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, isSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 1); @@ -499,7 +504,7 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderNoneedReplyAndReceivefilter, TestSiz ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, isSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 2); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().ArgSetIdsData()[0] == 0); @@ -554,7 +559,8 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderNoneedReplyAndReceivefilterNotmatch, dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool isSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, isSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 1); @@ -581,7 +587,7 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderNoneedReplyAndReceivefilterNotmatch, ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, isSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 1); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().ArgSetIdsData()[0] == 0); @@ -635,7 +641,8 @@ HWTEST_F(HtraceBinderEventTest, BinderSenderfilterWrongReply, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool isSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, isSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstInternalSlicesData().Size() == 0); EXPECT_TRUE(stream_.traceDataCache_->GetConstArgSetData().Size() == 0); diff --git a/trace_streamer/test/unittest/htrace_cpu_detail_parser_test.cpp b/trace_streamer/test/unittest/htrace_cpu_detail_parser_test.cpp index 524657b497b4479391492af6720298def2f9c09a..0899a04e04f1c1586bc138d631ecb3f2a00a70ca 100644 --- a/trace_streamer/test/unittest/htrace_cpu_detail_parser_test.cpp +++ b/trace_streamer/test/unittest/htrace_cpu_detail_parser_test.cpp @@ -63,7 +63,8 @@ HWTEST_F(HtraceCpuDetailParserTest, ParseCpudetaulNoEvents, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceCpuDetailParser htraceCpuDetailParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - htraceCpuDetailParser.Parse(dataSeg, dataSeg.clockId); + bool haveSplit = false; + htraceCpuDetailParser.Parse(dataSeg, dataSeg.clockId, haveSplit); htraceCpuDetailParser.FilterAllEvents(); auto size = tracePacket.ftrace_cpu_detail_size(); auto eventSize = cpuDetail->event_size(); @@ -91,7 +92,8 @@ HWTEST_F(HtraceCpuDetailParserTest, ParseHtraceWithoutCpuDetailData, TestSize.Le cpuDetailStrMsg.size()); dataSeg.protoData = cpuDetailBytesView; HtraceCpuDetailParser htraceCpuDetailParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - htraceCpuDetailParser.Parse(dataSeg, dataSeg.clockId); + bool haveSplit = false; + htraceCpuDetailParser.Parse(dataSeg, dataSeg.clockId, haveSplit); htraceCpuDetailParser.FilterAllEvents(); auto size = tracePacket.ftrace_cpu_detail_size(); auto eventSize = cpuDetail->event_size(); @@ -127,7 +129,8 @@ HWTEST_F(HtraceCpuDetailParserTest, ParseHtraceCpuDetailData, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceCpuDetailParser htraceCpuDetailParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - htraceCpuDetailParser.Parse(dataSeg, dataSeg.clockId); + bool haveSplit = false; + htraceCpuDetailParser.Parse(dataSeg, dataSeg.clockId, haveSplit); htraceCpuDetailParser.FilterAllEvents(); auto size = tracePacket.ftrace_cpu_detail_size(); auto eventSize = cpuDetail->event_size(); @@ -175,7 +178,8 @@ HWTEST_F(HtraceCpuDetailParserTest, ParseMultipleCpuDetailData, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceCpuDetailParser htraceCpuDetailParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - htraceCpuDetailParser.Parse(dataSeg, dataSeg.clockId); + bool haveSplit = false; + htraceCpuDetailParser.Parse(dataSeg, dataSeg.clockId, haveSplit); htraceCpuDetailParser.FilterAllEvents(); auto size = tracePacket.ftrace_cpu_detail_size(); auto eventSize = cpuDetail->event_size(); diff --git a/trace_streamer/test/unittest/htrace_event_parser_test.cpp b/trace_streamer/test/unittest/htrace_event_parser_test.cpp index 18b334a006f58595e852826a28ba4d980756beb8..467eb875a605237ee2a7f8bc09ebd388b4e31448 100644 --- a/trace_streamer/test/unittest/htrace_event_parser_test.cpp +++ b/trace_streamer/test/unittest/htrace_event_parser_test.cpp @@ -89,7 +89,8 @@ HWTEST_F(HtraceEventParserTest, ParseSchedSwitchEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool haveSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, haveSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(1); auto realTimeStamp = stream_.traceDataCache_->GetConstSchedSliceData().TimeStampData()[0]; @@ -121,7 +122,8 @@ HWTEST_F(HtraceEventParserTest, ParseFtraceCpuDetailMsgHasNoEvent, TestSize.Leve dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_OTHER, STAT_EVENT_DATA_LOST); @@ -166,7 +168,8 @@ HWTEST_F(HtraceEventParserTest, ParseFtraceCpuDetailMsgOverwriteTrue, TestSize.L dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_OTHER, STAT_EVENT_DATA_LOST); EXPECT_TRUE(1 == eventCount); @@ -207,7 +210,8 @@ HWTEST_F(HtraceEventParserTest, ParseTaskRenameEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_TASK_RENAME, STAT_EVENT_RECEIVED); @@ -249,7 +253,8 @@ HWTEST_F(HtraceEventParserTest, ParseTaskNewtaskEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_TASK_NEWTASK, STAT_EVENT_RECEIVED); @@ -291,7 +296,8 @@ HWTEST_F(HtraceEventParserTest, ParseSchedWakeupEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_SCHED_WAKEUP, STAT_EVENT_RECEIVED); @@ -333,7 +339,8 @@ HWTEST_F(HtraceEventParserTest, ParseSchedWakingEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_SCHED_WAKING, STAT_EVENT_RECEIVED); @@ -373,7 +380,8 @@ HWTEST_F(HtraceEventParserTest, ParseCpuIdleEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_CPU_IDLE, STAT_EVENT_RECEIVED); @@ -413,7 +421,8 @@ HWTEST_F(HtraceEventParserTest, ParseCpuFrequencyEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_CPU_FREQUENCY, STAT_EVENT_RECEIVED); @@ -455,7 +464,8 @@ HWTEST_F(HtraceEventParserTest, ParseWorkqueueExecuteStartEvent, TestSize.Level1 dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_WORKQUEUE_EXECUTE_START, STAT_EVENT_RECEIVED); @@ -494,7 +504,8 @@ HWTEST_F(HtraceEventParserTest, ParseWorkqueueExecuteEndEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_WORKQUEUE_EXECUTE_END, STAT_EVENT_RECEIVED); @@ -535,7 +546,8 @@ HWTEST_F(HtraceEventParserTest, ParseClockDisableEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_CLOCK_DISABLE, STAT_EVENT_RECEIVED); @@ -576,7 +588,8 @@ HWTEST_F(HtraceEventParserTest, ParseClockEnableEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_CLOCK_ENABLE, STAT_EVENT_RECEIVED); @@ -617,7 +630,8 @@ HWTEST_F(HtraceEventParserTest, ParseClockSetRateEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_CLOCK_SET_RATE, STAT_EVENT_RECEIVED); @@ -656,7 +670,8 @@ HWTEST_F(HtraceEventParserTest, ParseClkDisableEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_CLK_DISABLE, STAT_EVENT_RECEIVED); @@ -695,7 +710,8 @@ HWTEST_F(HtraceEventParserTest, ParseClkEnableEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_CLK_ENABLE, STAT_EVENT_RECEIVED); @@ -735,7 +751,8 @@ HWTEST_F(HtraceEventParserTest, ParseClkSetRateEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_CLK_SET_RATE, STAT_EVENT_RECEIVED); @@ -774,7 +791,8 @@ HWTEST_F(HtraceEventParserTest, ParseSysEnterEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_SYS_ENTRY, STAT_EVENT_RECEIVED); @@ -813,7 +831,8 @@ HWTEST_F(HtraceEventParserTest, ParseSystemExitEvent, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); auto eventCount = stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_SYS_EXIT, STAT_EVENT_RECEIVED); diff --git a/trace_streamer/test/unittest/htrace_irq_event_test.cpp b/trace_streamer/test/unittest/htrace_irq_event_test.cpp index 2a3b1f1e77936db9e6b23002f0aae2439c800eb5..7f3deaf1d71a160447efd3c750d61f709b4e8317 100644 --- a/trace_streamer/test/unittest/htrace_irq_event_test.cpp +++ b/trace_streamer/test/unittest/htrace_irq_event_test.cpp @@ -79,7 +79,8 @@ HWTEST_F(HtraceIrqEventTest, IrqHandlerEntryTest, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); eventParser.Clear(); @@ -122,7 +123,8 @@ HWTEST_F(HtraceIrqEventTest, IrqHandlerEntryTestNotMatch, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); ts1 = 110; @@ -146,7 +148,7 @@ HWTEST_F(HtraceIrqEventTest, IrqHandlerEntryTestNotMatch, TestSize.Level1) ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 2); @@ -195,7 +197,8 @@ HWTEST_F(HtraceIrqEventTest, IrqHandlerExitTestEmpty, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 0); auto eventCount = @@ -241,7 +244,8 @@ HWTEST_F(HtraceIrqEventTest, IrqHandlerEnterAndExitTest, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); uint32_t ret = 1; // 1 for handled, else for unhandled @@ -267,7 +271,7 @@ HWTEST_F(HtraceIrqEventTest, IrqHandlerEnterAndExitTest, TestSize.Level1) ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); @@ -312,7 +316,8 @@ HWTEST_F(HtraceIrqEventTest, IrqHandlerEnterAndExitTestTwice, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); uint32_t ret = 1; // 1 for handled, else for unhandled @@ -340,7 +345,7 @@ HWTEST_F(HtraceIrqEventTest, IrqHandlerEnterAndExitTestTwice, TestSize.Level1) ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); EXPECT_TRUE(stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_EVENT_IRQ_HANDLER_EXIT, @@ -369,7 +374,7 @@ HWTEST_F(HtraceIrqEventTest, IrqHandlerEnterAndExitTestTwice, TestSize.Level1) ProtoReader::BytesView cpuDetailBytesView3(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg3.protoData = cpuDetailBytesView3; - eventParser.ParseDataItem(dataSeg3, dataSeg3.clockId); + eventParser.ParseDataItem(dataSeg3, dataSeg3.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().ArgSetIdsData()[0] == 0); @@ -412,7 +417,8 @@ HWTEST_F(HtraceIrqEventTest, SoftIrqEntryTest, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); eventParser.Clear(); @@ -454,7 +460,8 @@ HWTEST_F(HtraceIrqEventTest, SoftIrqEntryNotMatch, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); ts1 = 150; @@ -478,7 +485,7 @@ HWTEST_F(HtraceIrqEventTest, SoftIrqEntryNotMatch, TestSize.Level1) ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 2); EXPECT_TRUE( @@ -522,7 +529,8 @@ HWTEST_F(HtraceIrqEventTest, SoftIrqExitEmptyTest, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 0); EXPECT_TRUE( @@ -566,7 +574,8 @@ HWTEST_F(HtraceIrqEventTest, SoftIrqTest, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); @@ -591,7 +600,7 @@ HWTEST_F(HtraceIrqEventTest, SoftIrqTest, TestSize.Level1) ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); eventParser.Clear(); @@ -633,7 +642,8 @@ HWTEST_F(HtraceIrqEventTest, SoftIrqTestNotMatch, TestSize.Level1) dataSeg.protoData = cpuDetailBytesView; HtraceEventParser eventParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); - eventParser.ParseDataItem(dataSeg, dataSeg.clockId); + bool hasSplit = false; + eventParser.ParseDataItem(dataSeg, dataSeg.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); eventParser.Clear(); @@ -659,7 +669,7 @@ HWTEST_F(HtraceIrqEventTest, SoftIrqTestNotMatch, TestSize.Level1) ProtoReader::BytesView cpuDetailBytesView2(reinterpret_cast(cpuDetailStrMsg.data()), cpuDetailStrMsg.size()); dataSeg2.protoData = cpuDetailBytesView2; - eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId); + eventParser.ParseDataItem(dataSeg2, dataSeg2.clockId, hasSplit); eventParser.FilterAllEvents(); EXPECT_TRUE(stream_.traceDataCache_->GetConstIrqData().Size() == 1); EXPECT_TRUE( diff --git a/trace_streamer/test/unittest/js_cpu_profiler_test.cpp b/trace_streamer/test/unittest/js_cpu_profiler_test.cpp index c4c48ec56bbe283d2e17e7c73ee1fc2f24c17204..e490a2cd37f4bd593d3fa8a08c6cd35f5b48cef8 100644 --- a/trace_streamer/test/unittest/js_cpu_profiler_test.cpp +++ b/trace_streamer/test/unittest/js_cpu_profiler_test.cpp @@ -87,14 +87,15 @@ HWTEST_F(JsCpuProfilerTest, cpuProfilerParserNodesbyArkTs, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto size = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().Size(); @@ -164,14 +165,15 @@ HWTEST_F(JsCpuProfilerTest, cpuProfilerParserSamplesbyArkTs, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto sampleFunctionId1 = stream_.traceDataCache_->GetConstJsCpuProfilerSampleData().FunctionIds()[0]; @@ -248,14 +250,15 @@ HWTEST_F(JsCpuProfilerTest, cpuProfilerParserNoProfilebyArkTs, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto size = stream_.traceDataCache_->GetConstJsCpuProfilerNodeData().Size(); diff --git a/trace_streamer/test/unittest/js_memory_test.cpp b/trace_streamer/test/unittest/js_memory_test.cpp index a6e97a468b08b7bf733583b8840f4b12af602fcc..013b412586b666976835692015aed4a0fdcfe678 100644 --- a/trace_streamer/test/unittest/js_memory_test.cpp +++ b/trace_streamer/test/unittest/js_memory_test.cpp @@ -93,28 +93,29 @@ HWTEST_F(JsMemoryTest, snapshotParserNodesByJsmemory, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket2(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket2, 11000); + htraceJSMemoryParser.Parse(tracePacket2, 11000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult3; jsHeapResult3.set_result(result3); std::string strResult3 = ""; jsHeapResult3.SerializeToString(&strResult3); ProtoReader::BytesView tracePacket3(reinterpret_cast(strResult3.data()), strResult3.size()); - htraceJSMemoryParser.Parse(tracePacket3, 12000); + htraceJSMemoryParser.Parse(tracePacket3, 12000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult4; jsHeapResult4.set_result(result4); std::string strResult4 = ""; jsHeapResult4.SerializeToString(&strResult4); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult4.data()), strResult4.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto size = stream_.traceDataCache_->GetConstJsHeapFilesData().Size(); @@ -184,28 +185,29 @@ HWTEST_F(JsMemoryTest, snapshotParserEdgesByJsmemory, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket2(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket2, 11000); + htraceJSMemoryParser.Parse(tracePacket2, 11000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult3; jsHeapResult3.set_result(result3); std::string strResult3 = ""; jsHeapResult3.SerializeToString(&strResult3); ProtoReader::BytesView tracePacket3(reinterpret_cast(strResult3.data()), strResult3.size()); - htraceJSMemoryParser.Parse(tracePacket3, 12000); + htraceJSMemoryParser.Parse(tracePacket3, 12000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult4; jsHeapResult4.set_result(result4); std::string strResult4 = ""; jsHeapResult4.SerializeToString(&strResult4); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult4.data()), strResult4.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto edgeType = stream_.traceDataCache_->GetConstJsHeapEdgesData().Types()[0]; @@ -267,28 +269,29 @@ HWTEST_F(JsMemoryTest, timelineParserNodesByJsmemory, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket2(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket2, 11000); + htraceJSMemoryParser.Parse(tracePacket2, 11000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult3; jsHeapResult3.set_result(result3); std::string strResult3 = ""; jsHeapResult3.SerializeToString(&strResult3); ProtoReader::BytesView tracePacket3(reinterpret_cast(strResult3.data()), strResult3.size()); - htraceJSMemoryParser.Parse(tracePacket3, 12000); + htraceJSMemoryParser.Parse(tracePacket3, 12000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult4; jsHeapResult4.set_result(result4); std::string strResult4 = ""; jsHeapResult4.SerializeToString(&strResult4); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult4.data()), strResult4.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto size = stream_.traceDataCache_->GetConstJsHeapFilesData().Size(); @@ -357,28 +360,29 @@ HWTEST_F(JsMemoryTest, timelineParserEdgesByJsmemory, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket2(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket2, 11000); + htraceJSMemoryParser.Parse(tracePacket2, 11000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult3; jsHeapResult3.set_result(result3); std::string strResult3 = ""; jsHeapResult3.SerializeToString(&strResult3); ProtoReader::BytesView tracePacket3(reinterpret_cast(strResult3.data()), strResult3.size()); - htraceJSMemoryParser.Parse(tracePacket3, 12000); + htraceJSMemoryParser.Parse(tracePacket3, 12000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult4; jsHeapResult4.set_result(result4); std::string strResult4 = ""; jsHeapResult4.SerializeToString(&strResult4); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult4.data()), strResult4.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto edgeType = stream_.traceDataCache_->GetConstJsHeapEdgesData().Types()[0]; @@ -443,28 +447,29 @@ HWTEST_F(JsMemoryTest, timelineParserSamplesByJsmemory, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket2(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket2, 11000); + htraceJSMemoryParser.Parse(tracePacket2, 11000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult3; jsHeapResult3.set_result(result3); std::string strResult3 = ""; jsHeapResult3.SerializeToString(&strResult3); ProtoReader::BytesView tracePacket3(reinterpret_cast(strResult3.data()), strResult3.size()); - htraceJSMemoryParser.Parse(tracePacket3, 12000); + htraceJSMemoryParser.Parse(tracePacket3, 12000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult4; jsHeapResult4.set_result(result4); std::string strResult4 = ""; jsHeapResult4.SerializeToString(&strResult4); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult4.data()), strResult4.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto timeStampUs = stream_.traceDataCache_->GetConstJsHeapSampleData().TimeStampUs()[0]; @@ -530,28 +535,29 @@ HWTEST_F(JsMemoryTest, timelineParserStringsByJsmemory, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket2(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket2, 11000); + htraceJSMemoryParser.Parse(tracePacket2, 11000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult3; jsHeapResult3.set_result(result3); std::string strResult3 = ""; jsHeapResult3.SerializeToString(&strResult3); ProtoReader::BytesView tracePacket3(reinterpret_cast(strResult3.data()), strResult3.size()); - htraceJSMemoryParser.Parse(tracePacket3, 12000); + htraceJSMemoryParser.Parse(tracePacket3, 12000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult4; jsHeapResult4.set_result(result4); std::string strResult4 = ""; jsHeapResult4.SerializeToString(&strResult4); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult4.data()), strResult4.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto string = stream_.traceDataCache_->GetConstJsHeapStringData().Strings()[0]; @@ -610,28 +616,29 @@ HWTEST_F(JsMemoryTest, timelineParserTraceFuncInfoByJsmemory, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket2(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket2, 11000); + htraceJSMemoryParser.Parse(tracePacket2, 11000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult3; jsHeapResult3.set_result(result3); std::string strResult3 = ""; jsHeapResult3.SerializeToString(&strResult3); ProtoReader::BytesView tracePacket3(reinterpret_cast(strResult3.data()), strResult3.size()); - htraceJSMemoryParser.Parse(tracePacket3, 12000); + htraceJSMemoryParser.Parse(tracePacket3, 12000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult4; jsHeapResult4.set_result(result4); std::string strResult4 = ""; jsHeapResult4.SerializeToString(&strResult4); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult4.data()), strResult4.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto functionId = stream_.traceDataCache_->GetConstJsHeapTraceFuncInfoData().FunctionIds()[0]; @@ -695,28 +702,29 @@ HWTEST_F(JsMemoryTest, timelineParserTraceTreeByJsmemory, TestSize.Level1) std::string strResult1 = ""; jsHeapResult1.SerializeToString(&strResult1); ProtoReader::BytesView tracePacket1(reinterpret_cast(strResult1.data()), strResult1.size()); - htraceJSMemoryParser.Parse(tracePacket1, 10000); + ProfilerPluginDataHeader profilerPluginData; + htraceJSMemoryParser.Parse(tracePacket1, 10000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult2; jsHeapResult2.set_result(result2); std::string strResult2 = ""; jsHeapResult2.SerializeToString(&strResult2); ProtoReader::BytesView tracePacket2(reinterpret_cast(strResult2.data()), strResult2.size()); - htraceJSMemoryParser.Parse(tracePacket2, 11000); + htraceJSMemoryParser.Parse(tracePacket2, 11000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult3; jsHeapResult3.set_result(result3); std::string strResult3 = ""; jsHeapResult3.SerializeToString(&strResult3); ProtoReader::BytesView tracePacket3(reinterpret_cast(strResult3.data()), strResult3.size()); - htraceJSMemoryParser.Parse(tracePacket3, 12000); + htraceJSMemoryParser.Parse(tracePacket3, 12000, 0, 0, profilerPluginData); ArkTSResult jsHeapResult4; jsHeapResult4.set_result(result4); std::string strResult4 = ""; jsHeapResult4.SerializeToString(&strResult4); ProtoReader::BytesView tracePacket4(reinterpret_cast(strResult4.data()), strResult4.size()); - htraceJSMemoryParser.Parse(tracePacket4, 13000); + htraceJSMemoryParser.Parse(tracePacket4, 13000, 0, 0, profilerPluginData); htraceJSMemoryParser.Finish(); auto functionInfoIndex = stream_.traceDataCache_->GetConstJsHeapTraceNodeData().FunctionInfoIndexs()[0]; diff --git a/trace_streamer/test/unittest/native_hook_parser_test.cpp b/trace_streamer/test/unittest/native_hook_parser_test.cpp index 4138ca6f54982c5d8bc210efee387cfbefc5812e..ed38ad0109eedd69a2967d767f11762677d32206 100644 --- a/trace_streamer/test/unittest/native_hook_parser_test.cpp +++ b/trace_streamer/test/unittest/native_hook_parser_test.cpp @@ -391,7 +391,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOutNativeHookData, TestSi dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); auto size = stream_.traceDataCache_->GetConstHilogData().Size(); EXPECT_FALSE(size); } @@ -437,8 +438,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOneMalloc, TestSize.Level dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse NativeHook results @@ -547,8 +548,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleMalloc, TestSize. dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse NativeHook results @@ -652,8 +653,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOneFree, TestSize.Level1) dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); auto size = stream_.traceDataCache_->GetConstNativeHookData().Size(); @@ -740,8 +741,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleFree, TestSize.Le dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse NativeHook results @@ -815,8 +816,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOnePairsMallocAndFree, Te dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse Malloc event results @@ -922,8 +923,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithNotMatchMallocAndFree, Te dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse Malloc event results @@ -1018,8 +1019,8 @@ HWTEST_F(NativeHookParserTest, ParseTwoMallocAndFreeEventMatched, TestSize.Level dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse first Malloc event results @@ -1122,7 +1123,8 @@ HWTEST_F(NativeHookParserTest, ParseTwoMallocAndFreeEventPartialMatched, TestSiz dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse first Malloc event results @@ -1197,7 +1199,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOneMmap, TestSize.Level1) dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse NativeHook results @@ -1270,7 +1273,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOneMunmap, TestSize.Level dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); auto size = stream_.traceDataCache_->GetConstNativeHookData().Size(); @@ -1348,7 +1352,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleMmap, TestSize.Le dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse NativeHook results @@ -1456,7 +1461,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleMunmap, TestSize. dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); auto size = stream_.traceDataCache_->GetConstNativeHookData().Size(); @@ -1532,7 +1538,8 @@ HWTEST_F(NativeHookParserTest, ParseOnePairsMmapAndMunmapEvent, TestSize.Level1) dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse NativeHook results @@ -1639,7 +1646,8 @@ HWTEST_F(NativeHookParserTest, ParseNotMatchMmapAndMunmapEvent, TestSize.Level1) dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse NativeHook results @@ -1746,7 +1754,8 @@ HWTEST_F(NativeHookParserTest, ParseTwoPairsMatchedMmapAndMunmapEvent, TestSize. dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse NativeHook results @@ -1852,7 +1861,8 @@ HWTEST_F(NativeHookParserTest, ParsePartialMatchedMmapAndMunmapEvent, TestSize.L dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse NativeHook results @@ -1992,7 +2002,8 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithAllTypesEvents, TestSize. dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - htraceNativeHookParser.Parse(dataSeg); + bool hasSplit = false; + htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); // Verification parse NativeHook results diff --git a/trace_streamer/test/unittest/parser_pbreader_test.cpp b/trace_streamer/test/unittest/parser_pbreader_test.cpp index c8938f09b95bb36a174227fac8943c05a0404bf0..8855cb77ffbeded2f047dfccb8eb410be3c67a86 100644 --- a/trace_streamer/test/unittest/parser_pbreader_test.cpp +++ b/trace_streamer/test/unittest/parser_pbreader_test.cpp @@ -63,7 +63,7 @@ HWTEST_F(ParserPbreaderTest, HtracePbreaderParserTest, TestSize.Level1) TS_LOGD("Reading trace file over (errno: %d, %s)", errno, strerror(errno)); break; } - if (!ta->ParseTraceDataSegment(std::move(buf), rsize)) { + if (!ta->ParseTraceDataSegment(std::move(buf), rsize, 0, 1)) { break; }; } @@ -105,7 +105,7 @@ HWTEST_F(ParserPbreaderTest, BytraceParserTest, TestSize.Level1) TS_LOGD("Reading trace file failed (errno: %d, %s)", errno, strerror(errno)); break; } - if (!ta->ParseTraceDataSegment(std::move(buf), rsize)) { + if (!ta->ParseTraceDataSegment(std::move(buf), rsize, 0, 1)) { break; }; } @@ -148,7 +148,7 @@ HWTEST_F(ParserPbreaderTest, HtraceAndPerfParserTest, TestSize.Level1) TS_LOGD("Reading trace file over (errno: %d, %s)", errno, strerror(errno)); break; } - if (!ta->ParseTraceDataSegment(std::move(buf), rsize)) { + if (!ta->ParseTraceDataSegment(std::move(buf), rsize, 0, 1)) { break; }; } @@ -191,7 +191,7 @@ HWTEST_F(ParserPbreaderTest, HtraceAndEbpfParserTest, TestSize.Level1) TS_LOGD("Reading trace file over (errno: %d, %s)", errno, strerror(errno)); break; } - if (!ta->ParseTraceDataSegment(std::move(buf), rsize)) { + if (!ta->ParseTraceDataSegment(std::move(buf), rsize, 0, 1)) { break; }; } diff --git a/trace_streamer/test/unittest/query_metrics_test.cpp b/trace_streamer/test/unittest/query_metrics_test.cpp index 29b7f1dac9f9d05415b33d6ce0e3396b829dd0bc..943e56331c69f316e3de4a1396c4286eb330d15f 100644 --- a/trace_streamer/test/unittest/query_metrics_test.cpp +++ b/trace_streamer/test/unittest/query_metrics_test.cpp @@ -56,7 +56,7 @@ void ParseTraceFile(TraceStreamerSelector& ts) break; } - if (!ts.ParseTraceDataSegment(std::move(buf), rsize)) { + if (!ts.ParseTraceDataSegment(std::move(buf), rsize, 0, 1)) { break; } }