snapshot-checker 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -2
- package/dist/commands/context_demo.d.ts +1 -1
- package/dist/commands/context_demo.d.ts.map +1 -1
- package/dist/commands/context_demo.js +10 -11
- package/dist/commands/context_demo.js.map +1 -1
- package/dist/commands/forkall.d.ts +3 -1
- package/dist/commands/forkall.d.ts.map +1 -1
- package/dist/commands/forkall.js +112 -53
- package/dist/commands/forkall.js.map +1 -1
- package/dist/commands/report.d.ts +32 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +207 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/src/cli.js +0 -0
- package/dist/src/lib/foo.d.ts +3 -0
- package/dist/src/lib/foo.d.ts.map +1 -0
- package/dist/src/lib/foo.js +7 -0
- package/dist/src/lib/foo.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -88,6 +88,26 @@ export const defaultGroupOrder: string[] = ['env', 'list'];
|
|
|
88
88
|
|
|
89
89
|
仓库内完整示例见 `commands/timeout_demo.ts`(`npm run dev -- timeout_demo` 或 `node dist/cli.js timeout_demo`)。
|
|
90
90
|
|
|
91
|
+
### 通用 lib 工具函数
|
|
92
|
+
|
|
93
|
+
推荐将通用逻辑放在 `src/lib/` 下(例如 `src/lib/foo.ts`),在场景文件中直接调用这些函数:
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { buildTag, buildUserGreeting } from '../src/lib/foo.js';
|
|
97
|
+
|
|
98
|
+
{
|
|
99
|
+
kind: CommandKind.BuiltinFunction,
|
|
100
|
+
description: '调用 lib/foo 的工具函数写入变量',
|
|
101
|
+
func: (ctx) => {
|
|
102
|
+
const user = ctx.user ?? 'unknown';
|
|
103
|
+
ctx.builtinTag = buildTag('context_demo');
|
|
104
|
+
ctx.fromFoo = buildUserGreeting(user);
|
|
105
|
+
},
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
仓库内完整示例见 `commands/context_demo.ts`。
|
|
110
|
+
|
|
91
111
|
### 命令之间传递变量(上下文)
|
|
92
112
|
|
|
93
113
|
命令执行器内置了一个**简单的上下文对象**,允许前一条命令将自己的输出写入变量,后续命令通过模板占位符引用这些变量。通过 CLI 跑场景时,该上下文在**整个场景执行期间**(含不同 `group`、不同块之间)**同一份共享**,因此可以把变量从 `getUser` 组传到 `greet` 组。仓库内示例见 `commands/context_demo.ts`。
|
|
@@ -262,8 +282,8 @@ npm install snapshot-checker
|
|
|
262
282
|
|
|
263
283
|
```ts
|
|
264
284
|
import { resolveScenario, runScenarioGroups } from 'snapshot-checker';
|
|
265
|
-
import * as contextDemo from 'snapshot-checker/commands/context_demo
|
|
266
|
-
import * as forkall from 'snapshot-checker/commands/forkall
|
|
285
|
+
import * as contextDemo from 'snapshot-checker/commands/context_demo';
|
|
286
|
+
import * as forkall from 'snapshot-checker/commands/forkall';
|
|
267
287
|
|
|
268
288
|
const { groups, defaultGroupOrder } = resolveScenario(forkall, {
|
|
269
289
|
app: 'com.example.app',
|
|
@@ -278,6 +298,15 @@ await runScenarioGroups({ groups, defaultGroupOrder, stopOnError: true });
|
|
|
278
298
|
|
|
279
299
|
独立 Node 示例工程(依赖 registry 上的本包):见 `demos/consumer-app/README.md`。
|
|
280
300
|
|
|
301
|
+
在该示例目录中可直接运行:
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
cd demos/consumer-app
|
|
305
|
+
npm install
|
|
306
|
+
npm run context
|
|
307
|
+
npm run forkall
|
|
308
|
+
```
|
|
309
|
+
|
|
281
310
|
## License
|
|
282
311
|
|
|
283
312
|
MIT
|
|
@@ -10,7 +10,7 @@ import { type Groups } from '../src/types.js';
|
|
|
10
10
|
*
|
|
11
11
|
* 作为 npm 包被外部项目引用时:
|
|
12
12
|
* import { resolveScenario, runScenarioGroups } from 'snapshot-checker';
|
|
13
|
-
* import * as contextDemo from 'snapshot-checker/commands/context_demo
|
|
13
|
+
* import * as contextDemo from 'snapshot-checker/commands/context_demo';
|
|
14
14
|
* 完整示例见 demos/consumer-app(需先发布包并 npm install snapshot-checker)。
|
|
15
15
|
*/
|
|
16
16
|
export declare const groups: Groups;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context_demo.d.ts","sourceRoot":"","sources":["../../commands/context_demo.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"context_demo.d.ts","sourceRoot":"","sources":["../../commands/context_demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAMnF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM,EAAE,MA8CpB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAAqD,CAAC"}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { CommandKind, getCurrentPlatformKind } from '../src/types.js';
|
|
2
|
+
import { buildTag, buildUserGreeting } from '../src/lib/foo.js';
|
|
2
3
|
/** 与当前 OS 一致,避免示例在非 macOS 上被整组跳过 */
|
|
3
4
|
const kind = getCurrentPlatformKind();
|
|
4
|
-
async function foo(ctx) {
|
|
5
|
-
const user = ctx.user ?? 'unknown';
|
|
6
|
-
const message = `foo says hi to ${user}`;
|
|
7
|
-
ctx.fromFoo = message;
|
|
8
|
-
console.log(message);
|
|
9
|
-
}
|
|
10
5
|
/**
|
|
11
6
|
* 示例场景:演示如何在命令之间传递变量(含跨不同 group)。
|
|
12
7
|
*
|
|
@@ -18,7 +13,7 @@ async function foo(ctx) {
|
|
|
18
13
|
*
|
|
19
14
|
* 作为 npm 包被外部项目引用时:
|
|
20
15
|
* import { resolveScenario, runScenarioGroups } from 'snapshot-checker';
|
|
21
|
-
* import * as contextDemo from 'snapshot-checker/commands/context_demo
|
|
16
|
+
* import * as contextDemo from 'snapshot-checker/commands/context_demo';
|
|
22
17
|
* 完整示例见 demos/consumer-app(需先发布包并 npm install snapshot-checker)。
|
|
23
18
|
*/
|
|
24
19
|
export const groups = {
|
|
@@ -42,13 +37,17 @@ export const groups = {
|
|
|
42
37
|
builtinFn: [
|
|
43
38
|
{
|
|
44
39
|
kind: CommandKind.BuiltinFunction,
|
|
45
|
-
description: '
|
|
46
|
-
func:
|
|
40
|
+
description: '调用 lib/foo 的工具函数写入变量',
|
|
41
|
+
func: (ctx) => {
|
|
42
|
+
const user = ctx.user ?? 'unknown';
|
|
43
|
+
ctx.builtinTag = buildTag('context_demo');
|
|
44
|
+
ctx.fromFoo = buildUserGreeting(user);
|
|
45
|
+
},
|
|
47
46
|
},
|
|
48
47
|
{
|
|
49
48
|
kind,
|
|
50
|
-
description: '
|
|
51
|
-
run: 'echo "{{fromFoo}}"',
|
|
49
|
+
description: '读取内置函数写入的变量',
|
|
50
|
+
run: 'echo "{{builtinTag}} | {{fromFoo}}"',
|
|
52
51
|
},
|
|
53
52
|
],
|
|
54
53
|
builtinFail: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context_demo.js","sourceRoot":"","sources":["../../commands/context_demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"context_demo.js","sourceRoot":"","sources":["../../commands/context_demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAe,MAAM,iBAAiB,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEhE,oCAAoC;AACpC,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;AAEtC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,OAAO,EAAE;QACP;YACE,IAAI;YACJ,WAAW,EAAE,oBAAoB;YACjC,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE;gBACZ,IAAI,EAAE,MAAM;aACb;SACF;KACF;IACD,KAAK,EAAE;QACL;YACE,IAAI;YACJ,WAAW,EAAE,eAAe;YAC5B,GAAG,EAAE,wBAAwB;SAC9B;KACF;IACD,SAAS,EAAE;QACT;YACE,IAAI,EAAE,WAAW,CAAC,eAAe;YACjC,WAAW,EAAE,sBAAsB;YACnC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;gBACZ,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC;gBACnC,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;gBAC1C,GAAG,CAAC,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;SACF;QACD;YACE,IAAI;YACJ,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,qCAAqC;SAC3C;KACF;IACD,WAAW,EAAE;QACX;YACE,IAAI,EAAE,WAAW,CAAC,eAAe;YACjC,WAAW,EAAE,uCAAuC;YACpD,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK;SAClB;QACD;YACE,IAAI;YACJ,WAAW,EAAE,6BAA6B;YAC1C,GAAG,EAAE,qDAAqD;SAC3D;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAa,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC"}
|
|
@@ -4,7 +4,7 @@ import type { Groups } from '../src/types.js';
|
|
|
4
4
|
* 实际要执行的命令会在 applyOptions 中,根据 CLI 传入的参数(eventPath/app 等)动态生成。
|
|
5
5
|
*
|
|
6
6
|
* 作为 npm 包被外部项目引用时:
|
|
7
|
-
* import * as forkall from 'snapshot-checker/commands/forkall
|
|
7
|
+
* import * as forkall from 'snapshot-checker/commands/forkall';
|
|
8
8
|
* resolveScenario(forkall, { app, eventPath, ... })
|
|
9
9
|
* 完整示例见 demos/consumer-app。
|
|
10
10
|
*/
|
|
@@ -28,6 +28,7 @@ interface ForkallOptions {
|
|
|
28
28
|
defaultTimeout?: string;
|
|
29
29
|
bufferSize?: string;
|
|
30
30
|
mode?: string;
|
|
31
|
+
outputDir?: string;
|
|
31
32
|
}
|
|
32
33
|
/**
|
|
33
34
|
* 将 CLI 解析出来的参数应用到 forkall 场景,动态生成各阶段命令。
|
|
@@ -41,6 +42,7 @@ interface ForkallOptions {
|
|
|
41
42
|
* - defaultTimeout -> dump_stack.bat 中的 default_timeout(默认 90)
|
|
42
43
|
* - bufferSize -> dump_stack.bat 中的 buffer_size(默认 512000)
|
|
43
44
|
* - mode -> dump_stack.bat 中根据参数跳转到 REBOOT 或 MONITOR 的条件分支
|
|
45
|
+
* - outputDir -> 本地输出目录(默认 .\output)
|
|
44
46
|
*/
|
|
45
47
|
export declare function applyOptions(ctx: {
|
|
46
48
|
groups: Groups;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forkall.d.ts","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"forkall.d.ts","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAI9C;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,EAAE,MAAW,CAAC;AAEjC,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAAiD,CAAC;AAExF,eAAO,MAAM,OAAO;;;;;;;;IA0BnB,CAAC;AAEF,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CA8NlD"}
|
package/dist/commands/forkall.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { CommandKind } from '../src/types.js';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
4
|
/**
|
|
3
5
|
* forkall 场景的基础占位配置。
|
|
4
6
|
* 实际要执行的命令会在 applyOptions 中,根据 CLI 传入的参数(eventPath/app 等)动态生成。
|
|
5
7
|
*
|
|
6
8
|
* 作为 npm 包被外部项目引用时:
|
|
7
|
-
* import * as forkall from 'snapshot-checker/commands/forkall
|
|
9
|
+
* import * as forkall from 'snapshot-checker/commands/forkall';
|
|
8
10
|
* resolveScenario(forkall, { app, eventPath, ... })
|
|
9
11
|
* 完整示例见 demos/consumer-app。
|
|
10
12
|
*/
|
|
@@ -31,6 +33,11 @@ export const options = [
|
|
|
31
33
|
description: '执行模式:monitor 或 reboot-monitor',
|
|
32
34
|
defaultValue: 'monitor',
|
|
33
35
|
},
|
|
36
|
+
{
|
|
37
|
+
flags: '--output-dir <path>',
|
|
38
|
+
description: '本地输出目录(默认 .\\output)',
|
|
39
|
+
defaultValue: String.raw `.\output`,
|
|
40
|
+
},
|
|
34
41
|
];
|
|
35
42
|
/**
|
|
36
43
|
* 将 CLI 解析出来的参数应用到 forkall 场景,动态生成各阶段命令。
|
|
@@ -44,30 +51,55 @@ export const options = [
|
|
|
44
51
|
* - defaultTimeout -> dump_stack.bat 中的 default_timeout(默认 90)
|
|
45
52
|
* - bufferSize -> dump_stack.bat 中的 buffer_size(默认 512000)
|
|
46
53
|
* - mode -> dump_stack.bat 中根据参数跳转到 REBOOT 或 MONITOR 的条件分支
|
|
54
|
+
* - outputDir -> 本地输出目录(默认 .\output)
|
|
47
55
|
*/
|
|
48
56
|
export function applyOptions(ctx) {
|
|
49
|
-
const { eventPath = '', app = '', systemSymbolFilePath = '', logKey = 'pid', duration = '70', defaultTimeout = '90', bufferSize = '512000', mode = 'monitor', } = ctx.options ?? {};
|
|
57
|
+
const { eventPath = '', app = '', systemSymbolFilePath = '', logKey = 'pid', duration = '70', defaultTimeout = '90', bufferSize = '512000', mode = 'monitor', outputDir = String.raw `.\output`, } = ctx.options ?? {};
|
|
50
58
|
const eventName = eventPath ? eventPath.replace(/\//g, ':') : '';
|
|
51
|
-
const checkStateCommand = "
|
|
59
|
+
const checkStateCommand = "hidumper -s 1901 -a '-p libforkall_plugin.z.so --list'";
|
|
60
|
+
const outputDirNormalized = path.normalize(outputDir);
|
|
61
|
+
const outputDirWithSep = outputDirNormalized.endsWith(path.sep)
|
|
62
|
+
? outputDirNormalized
|
|
63
|
+
: `${outputDirNormalized}${path.sep}`;
|
|
64
|
+
const snapshotLogFile = path.join(outputDirNormalized, 'snapshot_log.txt');
|
|
65
|
+
const snapshotPerfFile = path.join(outputDirNormalized, 'snapshot_perf.data.txt');
|
|
66
|
+
const dumpStackTxt = path.join(outputDirNormalized, 'dump_stack.txt');
|
|
67
|
+
const dumpStackXlsx = path.join(outputDirNormalized, 'dump_stack.xlsx');
|
|
68
|
+
const dumpStackJson = path.join(outputDirNormalized, 'dump_stack.json');
|
|
69
|
+
const hiperfTxtFilterScript = path.normalize(path.join('.', 'tools', 'host', 'checker', 'hiperf_txt_filter.py'));
|
|
70
|
+
const parserSystemStackScript = path.normalize(path.join('.', 'tools', 'host', 'checker', 'parse_system_stack.py'));
|
|
71
|
+
const start_app_command = `hidumper -s 1901 -a '-p libforkall_plugin.z.so --create 100 ${app}'`;
|
|
72
|
+
if (!existsSync(outputDirNormalized)) {
|
|
73
|
+
mkdirSync(outputDirNormalized, { recursive: true });
|
|
74
|
+
}
|
|
52
75
|
const rebootGroup = mode === 'reboot-monitor'
|
|
53
76
|
? [
|
|
77
|
+
{
|
|
78
|
+
kind: CommandKind.Windows,
|
|
79
|
+
run: 'hdc shell remount',
|
|
80
|
+
},
|
|
54
81
|
{
|
|
55
82
|
kind: CommandKind.Windows,
|
|
56
83
|
run: 'hdc shell "test ! -f /system/etc/hiview/hitrace_utils.json.bk && mv /system/etc/hiview/hitrace_utils.json /system/etc/hiview/hitrace_utils.json.bk"',
|
|
57
84
|
},
|
|
58
85
|
{
|
|
59
86
|
kind: CommandKind.Windows,
|
|
60
|
-
run: 'hdc shell "test ! -f /bin/hiperf && mv /bin/hiperf /bin/hiperf.bk"',
|
|
87
|
+
run: 'hdc shell "test ! -f /bin/hiperf.bk && mv /bin/hiperf /bin/hiperf.bk"',
|
|
61
88
|
},
|
|
62
89
|
{
|
|
63
90
|
kind: CommandKind.Windows,
|
|
64
91
|
description: '上传hitrace配置文件',
|
|
65
|
-
run:
|
|
92
|
+
run: String.raw `hdc file send .\config\hitrace\hitrace_utils_snapshot.json /system/etc/hiview/hitrace_utils.json`,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
kind: CommandKind.Windows,
|
|
96
|
+
description: '上传hiperf',
|
|
97
|
+
run: String.raw `hdc file send .\tools\host\hiperf\hiperf /bin/hiperf`,
|
|
66
98
|
},
|
|
67
99
|
{
|
|
68
100
|
kind: CommandKind.Windows,
|
|
69
101
|
description: '配置自定义trace事件',
|
|
70
|
-
run: String.raw `hdc shell "sed -i 's|<TARGET_EVENT>|${eventPath}
|
|
102
|
+
run: String.raw `hdc shell "sed -i 's|<TARGET_EVENT>|${eventPath}|g' /system/etc/hiview/hitrace_utils.json"`,
|
|
71
103
|
},
|
|
72
104
|
{
|
|
73
105
|
kind: CommandKind.Windows,
|
|
@@ -81,38 +113,75 @@ export function applyOptions(ctx) {
|
|
|
81
113
|
},
|
|
82
114
|
{
|
|
83
115
|
kind: CommandKind.Embed,
|
|
84
|
-
description: '
|
|
85
|
-
run: `
|
|
116
|
+
description: '等待设备重启中,按任意键可跳过',
|
|
117
|
+
run: `timeout ${defaultTimeout}`,
|
|
86
118
|
},
|
|
87
119
|
]
|
|
88
120
|
: [];
|
|
89
|
-
const
|
|
121
|
+
const initEnvGroup = [
|
|
122
|
+
{
|
|
123
|
+
kind: CommandKind.Windows,
|
|
124
|
+
run: 'hdc shell remount',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
kind: CommandKind.Windows,
|
|
128
|
+
description: '清理设备采集残留',
|
|
129
|
+
run: 'hdc shell "rm -rf /data/local/tmp/snapshot_hitrace.txt /data/local/tmp/perf.data /data/local/tmp/snapshot_perf.data.txt"',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
kind: CommandKind.Windows,
|
|
133
|
+
description: '清理日志',
|
|
134
|
+
run: `del /q "${snapshotLogFile}" 2>nul || exit /b 0`,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
kind: CommandKind.Windows,
|
|
138
|
+
description: '关闭应用',
|
|
139
|
+
run: `hdc shell "aa force-stop ${app}"`,
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
kind: CommandKind.Windows,
|
|
143
|
+
description: '删除应用镜像',
|
|
144
|
+
run: `hdc shell hidumper -s 1901 -a '-p libforkall_plugin.z.so --delete ${app}'`,
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
kind: CommandKind.Windows,
|
|
148
|
+
description: '检查当前可用事件列表',
|
|
149
|
+
run: `hdc shell "${checkStateCommand}"`,
|
|
150
|
+
},
|
|
90
151
|
{
|
|
91
152
|
kind: CommandKind.Windows,
|
|
92
|
-
description: '
|
|
93
|
-
run:
|
|
153
|
+
description: '配置模式开关',
|
|
154
|
+
run: `hdc shell "echo 000 > /proc/checkpoint/revoke_switch && echo checkout_witch "`,
|
|
94
155
|
},
|
|
95
156
|
{
|
|
96
157
|
kind: CommandKind.Windows,
|
|
97
|
-
description: '
|
|
98
|
-
run:
|
|
158
|
+
description: '配置事件权限',
|
|
159
|
+
run: `hdc shell "chmod 755 /sys/kernel/tracing/events/${eventPath} && chmod 666 /sys/kernel/tracing/events/${eventPath}/enable"`,
|
|
160
|
+
}
|
|
161
|
+
];
|
|
162
|
+
const monitorGroup = [
|
|
163
|
+
{
|
|
164
|
+
kind: CommandKind.Windows,
|
|
165
|
+
description: '收集日志到本地',
|
|
166
|
+
background: true,
|
|
167
|
+
run: `hdc shell "hilog -t kmsg | grep ${logKey}" >> ${snapshotLogFile}`,
|
|
99
168
|
},
|
|
100
169
|
{
|
|
101
170
|
kind: CommandKind.Windows,
|
|
102
|
-
description: '
|
|
171
|
+
description: '收集风险事件数据',
|
|
103
172
|
run: [
|
|
104
173
|
'hdc shell "',
|
|
105
174
|
`echo [SnapshotChecker]: Setting Target && `,
|
|
106
|
-
`hitrace custom_event --overwrite -b ${bufferSize} -t ${duration} -o /data/local/tmp/snapshot_hitrace.txt
|
|
175
|
+
`hitrace custom_event --overwrite -b ${bufferSize} -t ${duration} -o /data/local/tmp/snapshot_hitrace.txt & `,
|
|
107
176
|
eventName
|
|
108
|
-
? `hiperf record -e ${eventName} --period 1 -s fp --clockid
|
|
177
|
+
? `hiperf record -e ${eventName} --period 1 -s fp --clockid boottime --cpu-limit 100 -o /data/local/tmp/perf.data -a --exclude-hiperf -d ${duration} & `
|
|
109
178
|
: '',
|
|
110
|
-
`echo [SnapshotChecker]: Monitor start, Target:
|
|
179
|
+
`echo [SnapshotChecker]: Monitor start, Target: app=${app} && `,
|
|
111
180
|
`sleep 5 && `,
|
|
112
181
|
app
|
|
113
|
-
?
|
|
182
|
+
? `${start_app_command} && `
|
|
114
183
|
: '',
|
|
115
|
-
`${checkStateCommand}
|
|
184
|
+
`${checkStateCommand} & `,
|
|
116
185
|
`wait && `,
|
|
117
186
|
`echo [SnapshotChecker]: Monitor end, App Pid is: \`pidof ${app}\`, Please Check... && `,
|
|
118
187
|
`hiperf dump -i /data/local/tmp/perf.data -o /data/local/tmp/snapshot_perf.data.txt"`,
|
|
@@ -124,66 +193,56 @@ export function applyOptions(ctx) {
|
|
|
124
193
|
const collectGroup = [
|
|
125
194
|
{
|
|
126
195
|
kind: CommandKind.Windows,
|
|
127
|
-
description: '
|
|
128
|
-
run:
|
|
196
|
+
description: '检查状态',
|
|
197
|
+
run: `hdc shell "${checkStateCommand}"`,
|
|
129
198
|
},
|
|
130
199
|
{
|
|
131
200
|
kind: CommandKind.Windows,
|
|
132
|
-
description: '
|
|
201
|
+
description: '收集采集结果',
|
|
133
202
|
run: [
|
|
134
|
-
|
|
135
|
-
`
|
|
203
|
+
`hdc file recv /data/local/tmp/snapshot_perf.data.txt "${outputDirWithSep}" && `,
|
|
204
|
+
`hdc file recv /data/local/tmp/snapshot_hitrace.txt "${outputDirWithSep}" && `,
|
|
205
|
+
`hdc file recv /data/local/tmp/perf.data "${outputDirWithSep}"`,
|
|
136
206
|
].join(''),
|
|
137
207
|
},
|
|
208
|
+
];
|
|
209
|
+
const analysisGroup = [
|
|
138
210
|
{
|
|
139
211
|
kind: CommandKind.Windows,
|
|
140
|
-
description: '
|
|
141
|
-
run:
|
|
212
|
+
description: '获取目标tgid',
|
|
213
|
+
run: `hdc shell pgrep -f -o ${app}`,
|
|
214
|
+
captureToVar: {
|
|
215
|
+
name: 'target_tgid',
|
|
216
|
+
},
|
|
142
217
|
},
|
|
143
218
|
{
|
|
144
219
|
kind: CommandKind.Windows,
|
|
145
|
-
description: '
|
|
146
|
-
run:
|
|
147
|
-
'hdc file recv /data/local/tmp/snapshot_perf.data.txt ./output/ && ',
|
|
148
|
-
'hdc file recv /data/local/tmp/snapshot_hitrace.txt ./output/ && ',
|
|
149
|
-
'hdc file recv /data/local/tmp/snapshot_log.txt ./output/',
|
|
150
|
-
].join(''),
|
|
220
|
+
description: '过滤目标数据',
|
|
221
|
+
run: `python ${hiperfTxtFilterScript} --keep_raw_data --keep_duplicate_stacks --input_file ${snapshotPerfFile} --output_file ${snapshotPerfFile} --filter_by_tgid {{target_tgid}}`,
|
|
151
222
|
},
|
|
152
223
|
{
|
|
153
224
|
kind: CommandKind.Windows,
|
|
154
|
-
description: '
|
|
155
|
-
run:
|
|
225
|
+
description: '系统栈解栈',
|
|
226
|
+
run: systemSymbolFilePath
|
|
227
|
+
? `python ${parserSystemStackScript} ${snapshotPerfFile} ${snapshotPerfFile} -S ${systemSymbolFilePath}`
|
|
228
|
+
: '',
|
|
156
229
|
},
|
|
157
|
-
];
|
|
158
|
-
const analysisGroup = [
|
|
159
230
|
{
|
|
160
231
|
kind: CommandKind.Windows,
|
|
161
|
-
description: '
|
|
162
|
-
run:
|
|
163
|
-
'cd ./output && ',
|
|
164
|
-
(systemSymbolFilePath
|
|
165
|
-
? `python ../tools/host/checker/parser_system_stack.py snapshot_perf.data.txt snapshot_perf_data_parsed.data.txt -S "${systemSymbolFilePath}" && `
|
|
166
|
-
: ''),
|
|
167
|
-
'python ../tools/host/checker/hiperf_txt_filter.py -to_backtrace_stack ',
|
|
168
|
-
'--input_file ',
|
|
169
|
-
systemSymbolFilePath
|
|
170
|
-
? 'snapshot_perf_data_parsed.data.txt '
|
|
171
|
-
: 'snapshot_perf.data.txt ',
|
|
172
|
-
'--output_file dump_stack.txt ',
|
|
173
|
-
'--output_csv dump_stack.xlsx ',
|
|
174
|
-
'--output_json dump_stack.json',
|
|
175
|
-
].join(''),
|
|
232
|
+
description: '风险调用栈数据分析',
|
|
233
|
+
run: `python ${hiperfTxtFilterScript} --to_backtrace_stack --input_file ${snapshotPerfFile} --output_file ${dumpStackTxt} --output_csv ${dumpStackXlsx} --output_json ${dumpStackJson}`,
|
|
176
234
|
},
|
|
177
235
|
];
|
|
178
236
|
const resultGroups = {
|
|
179
237
|
reboot: rebootGroup,
|
|
238
|
+
init: initEnvGroup,
|
|
180
239
|
monitor: monitorGroup,
|
|
181
240
|
collect: collectGroup,
|
|
182
241
|
analysis: analysisGroup,
|
|
183
242
|
};
|
|
184
243
|
const order = mode === 'reboot-monitor'
|
|
185
|
-
? ['reboot', 'monitor', 'collect', 'analysis']
|
|
186
|
-
: ['monitor', 'collect', 'analysis'];
|
|
244
|
+
? ['reboot', 'init', 'monitor', 'collect', 'analysis']
|
|
245
|
+
: ['init', 'monitor', 'collect', 'analysis'];
|
|
187
246
|
return {
|
|
188
247
|
groups: resultGroups,
|
|
189
248
|
defaultGroupOrder: order,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forkall.js","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"forkall.js","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Groups } from '../src/types.js';
|
|
2
|
+
export declare const groups: Groups;
|
|
3
|
+
export declare const defaultGroupOrder: string[];
|
|
4
|
+
export declare const options: ({
|
|
5
|
+
flags: string;
|
|
6
|
+
description: string;
|
|
7
|
+
defaultValue?: undefined;
|
|
8
|
+
} | {
|
|
9
|
+
flags: string;
|
|
10
|
+
description: string;
|
|
11
|
+
defaultValue: string;
|
|
12
|
+
})[];
|
|
13
|
+
interface ForkallOptions {
|
|
14
|
+
eventPath?: string;
|
|
15
|
+
app?: string;
|
|
16
|
+
hstackToolPath?: string;
|
|
17
|
+
sourcemapDir?: string;
|
|
18
|
+
logKey?: string;
|
|
19
|
+
duration?: string;
|
|
20
|
+
bufferSize?: string;
|
|
21
|
+
outputDir?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function applyOptions(ctx: {
|
|
24
|
+
groups: Groups;
|
|
25
|
+
defaultGroupOrder: string[];
|
|
26
|
+
options: ForkallOptions;
|
|
27
|
+
}): {
|
|
28
|
+
groups: Groups;
|
|
29
|
+
defaultGroupOrder: string[];
|
|
30
|
+
};
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAK9D,eAAO,MAAM,MAAM,EAAE,MAAW,CAAC;AAEjC,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAAiD,CAAC;AAExF,eAAO,MAAM,OAAO;;;;;;;;IAgBnB,CAAC;AAEF,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CA0MlD"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { CommandKind } from '../src/types.js';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { filterByTgid, formatPerfDataToJson, formatPerfDataToText, parsePerfData, toBackTraceStacks } from 'hiperf_txt_parser';
|
|
5
|
+
export const groups = {};
|
|
6
|
+
export const defaultGroupOrder = ['reboot', 'monitor', 'collect', 'analysis'];
|
|
7
|
+
export const options = [
|
|
8
|
+
{ flags: '--app <app>', description: '应用名' },
|
|
9
|
+
{ flags: '--hstack-tool-path <path>', description: 'hstack 工具地址' },
|
|
10
|
+
{ flags: '--sourcemap-dir <path>', description: 'sourcemap 目录地址' },
|
|
11
|
+
{ flags: '--log-key <key>', description: '日志过滤关键字(默认 pid)', defaultValue: 'pid' },
|
|
12
|
+
{ flags: '--duration <seconds>', description: '采样持续时间(秒,默认 70)', defaultValue: '70' },
|
|
13
|
+
{
|
|
14
|
+
flags: '--buffer-size <bytes>',
|
|
15
|
+
description: '缓冲区大小(字节,默认 512000)',
|
|
16
|
+
defaultValue: '512000',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
flags: '--output-dir <path>',
|
|
20
|
+
description: '本地输出目录(默认 .\\output)',
|
|
21
|
+
defaultValue: String.raw `.\output`,
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
export function applyOptions(ctx) {
|
|
25
|
+
const { eventPath = '', app = '', hstackToolPath = '', sourcemapDir = '', logKey = 'pid', duration = '70', bufferSize = '512000', outputDir = String.raw `.\output`, } = ctx.options ?? {};
|
|
26
|
+
const eventName = eventPath ? eventPath.replace(/\//g, ':') : '';
|
|
27
|
+
const checkStateCommand = "hidumper -s 1901 -a '-p libforkall_plugin.z.so --list'";
|
|
28
|
+
const hstackToolPathNormalized = hstackToolPath ? path.normalize(hstackToolPath) : '';
|
|
29
|
+
const sourcemapDirNormalized = sourcemapDir ? path.normalize(sourcemapDir) : '';
|
|
30
|
+
const outputDirNormalized = path.normalize(outputDir);
|
|
31
|
+
const outputDirWithSep = outputDirNormalized.endsWith(path.sep)
|
|
32
|
+
? outputDirNormalized
|
|
33
|
+
: `${outputDirNormalized}${path.sep}`;
|
|
34
|
+
const snapshotLogFile = path.join(outputDirNormalized, 'snapshot_log.txt');
|
|
35
|
+
const perfTextDir = path.join(outputDirNormalized, 'perf_txt');
|
|
36
|
+
const snapshotPerfFile = path.join(perfTextDir, 'snapshot_perf.data.txt');
|
|
37
|
+
const parsedSnapshotPerfFile = path.join(outputDirNormalized, '_snapshot_perf.data.txt');
|
|
38
|
+
const dumpStackTxt = path.join(outputDirNormalized, 'dump_stack.txt');
|
|
39
|
+
const dumpStackJson = path.join(outputDirNormalized, 'dump_stack.json');
|
|
40
|
+
const start_app_command = `hidumper -s 1901 -a '-p libforkall_plugin.z.so --create 100 ${app}'`;
|
|
41
|
+
if (!existsSync(outputDirNormalized)) {
|
|
42
|
+
mkdirSync(outputDirNormalized, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
if (!existsSync(perfTextDir)) {
|
|
45
|
+
mkdirSync(perfTextDir, { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
const initEnvGroup = [
|
|
48
|
+
{
|
|
49
|
+
kind: CommandKind.Windows,
|
|
50
|
+
run: 'hdc shell remount',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
kind: CommandKind.Windows,
|
|
54
|
+
description: '清理设备采集残留',
|
|
55
|
+
run: 'hdc shell "rm -rf /data/local/tmp/snapshot_hitrace.txt /data/local/tmp/perf.data /data/local/tmp/snapshot_perf.data.txt"',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
kind: CommandKind.Windows,
|
|
59
|
+
description: '清理日志',
|
|
60
|
+
run: `del /q "${snapshotLogFile}" 2>nul || exit /b 0`,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
kind: CommandKind.Windows,
|
|
64
|
+
description: '关闭应用',
|
|
65
|
+
run: `hdc shell "aa force-stop ${app}"`,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
kind: CommandKind.Windows,
|
|
69
|
+
description: '删除应用镜像',
|
|
70
|
+
run: `hdc shell hidumper -s 1901 -a '-p libforkall_plugin.z.so --delete ${app}'`,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
kind: CommandKind.Windows,
|
|
74
|
+
description: '检查当前可用事件列表',
|
|
75
|
+
run: `hdc shell "${checkStateCommand}"`,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
kind: CommandKind.Windows,
|
|
79
|
+
description: '配置模式开关',
|
|
80
|
+
run: `hdc shell "echo 000 > /proc/checkpoint/revoke_switch && echo checkout_witch "`,
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
kind: CommandKind.Windows,
|
|
84
|
+
description: '配置事件权限',
|
|
85
|
+
run: `hdc shell "chmod 755 /sys/kernel/tracing/events/snapshot/vfs_snapshot_dump_monitor && chmod 666 /sys/kernel/tracing/events/snapshot/vfs_snapshot_dump_monitor/enable"`,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
kind: CommandKind.Windows,
|
|
89
|
+
description: '配置事件权限',
|
|
90
|
+
run: `hdc shell "chmod 755 /sys/kernel/tracing/events/snapshot/hmb_forkall_report_image_failure && chmod 666 /sys/kernel/tracing/events/snapshot/hmb_forkall_report_image_failure/enable"`,
|
|
91
|
+
}
|
|
92
|
+
];
|
|
93
|
+
const monitorGroup = [
|
|
94
|
+
{
|
|
95
|
+
kind: CommandKind.Windows,
|
|
96
|
+
description: '收集日志到本地',
|
|
97
|
+
background: true,
|
|
98
|
+
run: `hdc shell "hilog -t kmsg | grep ${logKey}" >> ${snapshotLogFile}`,
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
kind: CommandKind.Windows,
|
|
102
|
+
run: `hdc shell pidof apppool`,
|
|
103
|
+
captureToVar: {
|
|
104
|
+
name: 'apppool_pids',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
kind: CommandKind.BuiltinFunction,
|
|
109
|
+
description: '提取检测目标信息',
|
|
110
|
+
func: (ctx) => {
|
|
111
|
+
if (!ctx.apppool_pids) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
ctx.monitor_target = ctx.apppool_pids.split(/\s+/).join(',');
|
|
115
|
+
console.info("提取检测目标: ", ctx.monitor_target);
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
kind: CommandKind.Windows,
|
|
120
|
+
description: '收集风险事件数据',
|
|
121
|
+
run: [
|
|
122
|
+
'hdc shell "',
|
|
123
|
+
`hitrace snapshot_binder --overwrite -b ${bufferSize} -t ${duration} -o /data/local/tmp/snapshot_hitrace.txt & `,
|
|
124
|
+
`hiperf record -e snapshot:hmb_forkall_report_image_failure --period 1 -s fp --clockid boottime --callchain-useronly --cpu-limit 100 -o /data/local/tmp/perf.data -p {{monitor_target}} -d ${duration} & `,
|
|
125
|
+
`sleep 1 && `,
|
|
126
|
+
app
|
|
127
|
+
? `${start_app_command} && `
|
|
128
|
+
: '',
|
|
129
|
+
`${checkStateCommand} & `,
|
|
130
|
+
`wait && `,
|
|
131
|
+
`hiperf dump -i /data/local/tmp/perf.data -o /data/local/tmp/snapshot_perf.data.txt"`,
|
|
132
|
+
]
|
|
133
|
+
.filter(Boolean)
|
|
134
|
+
.join(''),
|
|
135
|
+
},
|
|
136
|
+
];
|
|
137
|
+
const collectGroup = [
|
|
138
|
+
{
|
|
139
|
+
kind: CommandKind.Windows,
|
|
140
|
+
description: '检查状态',
|
|
141
|
+
run: `hdc shell "${checkStateCommand}"`,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
kind: CommandKind.Windows,
|
|
145
|
+
description: '收集采集结果',
|
|
146
|
+
run: [
|
|
147
|
+
`hdc file recv /data/local/tmp/snapshot_perf.data.txt "${perfTextDir}" && `,
|
|
148
|
+
`hdc file recv /data/local/tmp/snapshot_hitrace.txt "${outputDirWithSep}" && `,
|
|
149
|
+
`hdc file recv /data/local/tmp/perf.data "${outputDirWithSep}"`,
|
|
150
|
+
].join(''),
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
const analysisGroup = [
|
|
154
|
+
{
|
|
155
|
+
kind: CommandKind.Windows,
|
|
156
|
+
description: '获取目标tgid',
|
|
157
|
+
run: `hdc shell pgrep -f -o ${app}`,
|
|
158
|
+
captureToVar: {
|
|
159
|
+
name: 'target_tgid',
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
kind: CommandKind.BuiltinFunction,
|
|
164
|
+
description: '过滤目标数据',
|
|
165
|
+
func: (ctx) => {
|
|
166
|
+
if (!ctx.target_tgid) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
const input = readFileSync(snapshotPerfFile, "utf-8");
|
|
170
|
+
const recordSamples = parsePerfData(input);
|
|
171
|
+
const filteredRecordSamples = filterByTgid(recordSamples, parseInt(ctx.target_tgid, 10));
|
|
172
|
+
const backtraceRecordSamples = toBackTraceStacks(filteredRecordSamples);
|
|
173
|
+
const filteredRecordSamplesTxt = formatPerfDataToText(backtraceRecordSamples);
|
|
174
|
+
writeFileSync(snapshotPerfFile, filteredRecordSamplesTxt, "utf-8");
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
kind: CommandKind.Windows,
|
|
179
|
+
description: '解析采集结果',
|
|
180
|
+
run: `${hstackToolPathNormalized} -i ${perfTextDir} -o ${outputDirNormalized} -s ${sourcemapDirNormalized}`,
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
kind: CommandKind.BuiltinFunction,
|
|
184
|
+
description: '镜像失效风险栈分析',
|
|
185
|
+
func: (ctx) => {
|
|
186
|
+
const input = readFileSync(parsedSnapshotPerfFile, "utf-8");
|
|
187
|
+
const recordSamples = parsePerfData(input);
|
|
188
|
+
const recordSamplesJson = formatPerfDataToJson(recordSamples);
|
|
189
|
+
const recordSamplesTxt = formatPerfDataToText(recordSamples);
|
|
190
|
+
writeFileSync(dumpStackJson, JSON.stringify(recordSamplesJson, null, 2), "utf-8");
|
|
191
|
+
writeFileSync(dumpStackTxt, recordSamplesTxt, "utf-8");
|
|
192
|
+
},
|
|
193
|
+
}
|
|
194
|
+
];
|
|
195
|
+
const resultGroups = {
|
|
196
|
+
init: initEnvGroup,
|
|
197
|
+
monitor: monitorGroup,
|
|
198
|
+
collect: collectGroup,
|
|
199
|
+
analysis: analysisGroup,
|
|
200
|
+
};
|
|
201
|
+
const order = ['init', 'monitor', 'collect', 'analysis'];
|
|
202
|
+
return {
|
|
203
|
+
groups: resultGroups,
|
|
204
|
+
defaultGroupOrder: order,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foo.d.ts","sourceRoot":"","sources":["../../../src/lib/foo.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foo.js","sourceRoot":"","sources":["../../../src/lib/foo.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,kBAAkB,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,OAAO,GAAG,MAAM,eAAe,CAAC;AAClC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "snapshot-checker",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "CLI 工具:按顺序执行 bat / mac / shell 命令",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -47,7 +47,8 @@
|
|
|
47
47
|
"typescript": "^5.3.0"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"commander": "^12.0.0"
|
|
50
|
+
"commander": "^12.0.0",
|
|
51
|
+
"hiperf_txt_parser": "^1.0.5"
|
|
51
52
|
},
|
|
52
53
|
"engines": {
|
|
53
54
|
"node": ">=18"
|