snapshot-checker 0.2.2 → 0.3.1
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 +103 -343
- package/dist/commands/forkall.d.ts +4 -12
- package/dist/commands/forkall.d.ts.map +1 -1
- package/dist/commands/forkall.js +46 -23
- package/dist/commands/forkall.js.map +1 -1
- package/dist/commands/report.d.ts +7 -0
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +133 -32
- package/dist/commands/report.js.map +1 -1
- package/dist/demos/context-demo.d.ts +10 -0
- package/dist/demos/context-demo.d.ts.map +1 -0
- package/dist/{commands/context_demo.js → demos/context-demo.js} +15 -18
- package/dist/demos/context-demo.js.map +1 -0
- package/dist/{commands → demos}/mac-example.d.ts +1 -3
- package/dist/demos/mac-example.d.ts.map +1 -0
- package/dist/{commands → demos}/mac-example.js +2 -4
- package/dist/demos/mac-example.js.map +1 -0
- package/dist/{commands/timeout_demo.d.ts → demos/timeout-demo.d.ts} +2 -2
- package/dist/demos/timeout-demo.d.ts.map +1 -0
- package/dist/demos/timeout-demo.js +35 -0
- package/dist/demos/timeout-demo.js.map +1 -0
- package/dist/src/cli.js +209 -169
- package/dist/src/cli.js.map +1 -1
- package/dist/src/executor.d.ts +1 -3
- package/dist/src/executor.d.ts.map +1 -1
- package/dist/src/executor.js +1 -3
- package/dist/src/executor.js.map +1 -1
- package/dist/src/groupSpecs.d.ts +1 -4
- package/dist/src/groupSpecs.d.ts.map +1 -1
- package/dist/src/groupSpecs.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/{common_groups.d.ts → presets.d.ts} +13 -2
- package/dist/src/lib/presets.d.ts.map +1 -0
- package/dist/src/lib/{common_groups.js → presets.js} +66 -24
- package/dist/src/lib/presets.js.map +1 -0
- package/dist/src/lib/{programmatic.d.ts → scenario.d.ts} +9 -11
- package/dist/src/lib/scenario.d.ts.map +1 -0
- package/dist/src/lib/{programmatic.js → scenario.js} +6 -10
- package/dist/src/lib/scenario.js.map +1 -0
- package/dist/src/logger.d.ts +23 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +92 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/runCommand.d.ts +27 -35
- package/dist/src/runCommand.d.ts.map +1 -1
- package/dist/src/runCommand.js +81 -70
- package/dist/src/runCommand.js.map +1 -1
- package/dist/src/runGroups.d.ts +6 -12
- package/dist/src/runGroups.d.ts.map +1 -1
- package/dist/src/runGroups.js +14 -19
- package/dist/src/runGroups.js.map +1 -1
- package/dist/src/runners/builtinFunctionRunner.d.ts +1 -0
- package/dist/src/runners/builtinFunctionRunner.d.ts.map +1 -1
- package/dist/src/runners/builtinFunctionRunner.js +5 -12
- package/dist/src/runners/builtinFunctionRunner.js.map +1 -1
- package/dist/src/runners/embedRunner.d.ts +1 -0
- package/dist/src/runners/embedRunner.d.ts.map +1 -1
- package/dist/src/runners/embedRunner.js +5 -1
- package/dist/src/runners/embedRunner.js.map +1 -1
- package/dist/src/runners/shellRunner.d.ts +1 -0
- package/dist/src/runners/shellRunner.d.ts.map +1 -1
- package/dist/src/runners/shellRunner.js +40 -8
- package/dist/src/runners/shellRunner.js.map +1 -1
- package/dist/src/runners/types.d.ts +9 -0
- package/dist/src/runners/types.d.ts.map +1 -1
- package/dist/src/types.d.ts +47 -77
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +37 -10
- package/dist/src/types.js.map +1 -1
- package/package.json +10 -3
- package/dist/commands/context_demo.d.ts +0 -18
- package/dist/commands/context_demo.d.ts.map +0 -1
- package/dist/commands/context_demo.js.map +0 -1
- package/dist/commands/mac-example.d.ts.map +0 -1
- package/dist/commands/mac-example.js.map +0 -1
- package/dist/commands/timeout_demo.d.ts.map +0 -1
- package/dist/commands/timeout_demo.js +0 -48
- package/dist/commands/timeout_demo.js.map +0 -1
- package/dist/src/lib/common_groups.d.ts.map +0 -1
- package/dist/src/lib/common_groups.js.map +0 -1
- package/dist/src/lib/foo.d.ts +0 -3
- package/dist/src/lib/foo.d.ts.map +0 -1
- package/dist/src/lib/foo.js +0 -7
- package/dist/src/lib/foo.js.map +0 -1
- package/dist/src/lib/programmatic.d.ts.map +0 -1
- package/dist/src/lib/programmatic.js.map +0 -1
- package/dist/src/lib/trace_formatter.d.ts +0 -9
- package/dist/src/lib/trace_formatter.d.ts.map +0 -1
- package/dist/src/lib/trace_formatter.js +0 -148
- package/dist/src/lib/trace_formatter.js.map +0 -1
package/dist/commands/forkall.js
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { CommandKind } from "../src/types.js";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { existsSync, mkdirSync } from "node:fs";
|
|
4
|
-
import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGroup, } from "../src/lib/
|
|
4
|
+
import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGroup, } from "../src/lib/presets.js";
|
|
5
|
+
import { logger } from "../src/logger.js";
|
|
5
6
|
/**
|
|
6
|
-
* forkall
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* 作为 npm 包被外部项目引用时:
|
|
10
|
-
* import * as forkall from 'snapshot-checker/commands/forkall';
|
|
11
|
-
* resolveScenario(forkall, { app, eventPath, ... })
|
|
12
|
-
* 完整示例见 demos/consumer-app。
|
|
7
|
+
* forkall 场景占位;实际命令由 {@link applyOptions} 按 CLI 注入。
|
|
8
|
+
* 包消费方:`import * as forkall from 'snapshot-checker/commands/forkall'` 后配合 `resolveScenario`;示例见 `demos/consumer-app`。
|
|
13
9
|
*/
|
|
10
|
+
/** 输出根目录下中间文件目录名(与 report 一致;不含 dump_stack*) */
|
|
11
|
+
const WORKSPACE_SUBDIR = "workspace";
|
|
14
12
|
export const groups = {};
|
|
15
13
|
export const defaultGroupOrder = [
|
|
16
14
|
"reboot",
|
|
@@ -60,6 +58,14 @@ export const options = [
|
|
|
60
58
|
description: "trace 事件格式版本(默认 default)",
|
|
61
59
|
defaultValue: "default",
|
|
62
60
|
},
|
|
61
|
+
{
|
|
62
|
+
flags: "--skip-perf-dedupe",
|
|
63
|
+
description: "跳过 perf 解码后的 compare 去重(dedupePerfData)",
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
flags: "--drop-failed-samples",
|
|
67
|
+
description: "解码 perf 时丢弃「有 raw 但无对应 trace 解析器」的样本(decodePerfRawData dropFailedSamples);库会输出丢弃数量日志",
|
|
68
|
+
},
|
|
63
69
|
];
|
|
64
70
|
function buildRebootGroup(input) {
|
|
65
71
|
const { mode, eventPath, defaultTimeout } = input;
|
|
@@ -132,12 +138,12 @@ function buildMonitorGroup(input) {
|
|
|
132
138
|
func: (ctx) => {
|
|
133
139
|
const apppoolPids = ctx.get("apppool_pids");
|
|
134
140
|
if (!apppoolPids) {
|
|
135
|
-
|
|
141
|
+
logger.warn("[提取检测目标信息] apppool_pids 缺失或不是字符串,跳过处理");
|
|
136
142
|
return false;
|
|
137
143
|
}
|
|
138
144
|
const monitorTarget = apppoolPids.split(/\s+/).join(",");
|
|
139
145
|
ctx.set("monitor_target", monitorTarget);
|
|
140
|
-
|
|
146
|
+
logger.info("提取检测目标: ", monitorTarget);
|
|
141
147
|
},
|
|
142
148
|
},
|
|
143
149
|
{
|
|
@@ -174,25 +180,39 @@ function buildAnalysisPreDecodeCommands(input) {
|
|
|
174
180
|
: []),
|
|
175
181
|
];
|
|
176
182
|
}
|
|
177
|
-
/**
|
|
178
|
-
* 将 CLI 解析出来的参数应用到 forkall 场景,动态生成各阶段命令。
|
|
179
|
-
*/
|
|
183
|
+
/** 按 CLI 结果生成 reboot/monitor/collect/analysis 各阶段命令表 */
|
|
180
184
|
export function applyOptions(ctx) {
|
|
181
|
-
const { eventPath = "", app = "", systemSymbolFilePath = "", logKey = "pid", duration = "70", defaultTimeout = "90", bufferSize = "512000", mode = "monitor", outputDir = String.raw `.\output`, traceFormatProfile = "default", } = ctx.options ?? {};
|
|
185
|
+
const { eventPath = "", app = "", systemSymbolFilePath = "", logKey = "pid", duration = "70", defaultTimeout = "90", bufferSize = "512000", mode = "monitor", outputDir = String.raw `.\output`, traceFormatProfile = "default", skipPerfDedupe = false, dropFailedSamples = false, dryRun = false, } = ctx.options ?? {};
|
|
182
186
|
const eventName = eventPath ? eventPath.replace(/\//g, ":") : "";
|
|
183
187
|
const checkStateCommand = "hidumper -s 1901 -a '-p libforkall_plugin.z.so --list'";
|
|
184
188
|
const outputDirNormalized = path.normalize(outputDir);
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
189
|
+
const workspaceDir = path.join(outputDirNormalized, WORKSPACE_SUBDIR);
|
|
190
|
+
const workspaceDirNormalized = path.normalize(workspaceDir);
|
|
191
|
+
const workspaceDirWithSep = workspaceDirNormalized.endsWith(path.sep)
|
|
192
|
+
? workspaceDirNormalized
|
|
193
|
+
: `${workspaceDirNormalized}${path.sep}`;
|
|
194
|
+
const perfTextDir = path.join(outputDirNormalized, "perf_txt");
|
|
195
|
+
const perfTextDirNormalized = path.normalize(perfTextDir);
|
|
196
|
+
const perfTextDirWithSep = perfTextDirNormalized.endsWith(path.sep)
|
|
197
|
+
? perfTextDirNormalized
|
|
198
|
+
: `${perfTextDirNormalized}${path.sep}`;
|
|
199
|
+
const snapshotLogFile = path.join(workspaceDirNormalized, "snapshot_log.txt");
|
|
200
|
+
const snapshotPerfFile = path.join(perfTextDirNormalized, "snapshot_perf.data.txt");
|
|
190
201
|
const dumpStackTxt = path.join(outputDirNormalized, "dump_stack.txt");
|
|
191
202
|
const dumpStackJson = path.join(outputDirNormalized, "dump_stack.json");
|
|
203
|
+
const dumpStackXlsx = path.join(outputDirNormalized, "dump_stack.xlsx");
|
|
192
204
|
const parserSystemStackScript = path.normalize(path.join(".", "tools", "host", "checker", "parse_system_stack.py"));
|
|
193
205
|
const startAppCommand = `hidumper -s 1901 -a '-p libforkall_plugin.z.so --create 100 ${app}'`;
|
|
194
|
-
if (!
|
|
195
|
-
|
|
206
|
+
if (!dryRun) {
|
|
207
|
+
if (!existsSync(outputDirNormalized)) {
|
|
208
|
+
mkdirSync(outputDirNormalized, { recursive: true });
|
|
209
|
+
}
|
|
210
|
+
if (!existsSync(workspaceDirNormalized)) {
|
|
211
|
+
mkdirSync(workspaceDirNormalized, { recursive: true });
|
|
212
|
+
}
|
|
213
|
+
if (!existsSync(perfTextDirNormalized)) {
|
|
214
|
+
mkdirSync(perfTextDirNormalized, { recursive: true });
|
|
215
|
+
}
|
|
196
216
|
}
|
|
197
217
|
const rebootGroup = buildRebootGroup({ mode, eventPath, defaultTimeout });
|
|
198
218
|
const initEnvGroup = buildCommonInitEnvGroup({
|
|
@@ -215,8 +235,8 @@ export function applyOptions(ctx) {
|
|
|
215
235
|
});
|
|
216
236
|
const collectGroup = buildCommonCollectGroup({
|
|
217
237
|
checkStateCommand,
|
|
218
|
-
snapshotPerfReceiveDirWithSep:
|
|
219
|
-
outputDirWithSep,
|
|
238
|
+
snapshotPerfReceiveDirWithSep: perfTextDirWithSep,
|
|
239
|
+
outputDirWithSep: workspaceDirWithSep,
|
|
220
240
|
});
|
|
221
241
|
const analysisGroup = buildCommonAnalysisGroup({
|
|
222
242
|
app,
|
|
@@ -230,9 +250,12 @@ export function applyOptions(ctx) {
|
|
|
230
250
|
decodeInput: { inputFilePath: snapshotPerfFile },
|
|
231
251
|
dumpStackTxt,
|
|
232
252
|
dumpStackJson,
|
|
253
|
+
dumpStackXlsx,
|
|
233
254
|
traceFormatProfile,
|
|
234
255
|
decodeStageName: "风险调用栈数据分析",
|
|
235
256
|
missingInputMessage: "[风险调用栈数据分析] 输入文件缺失,跳过处理",
|
|
257
|
+
skipDedupePerfData: skipPerfDedupe,
|
|
258
|
+
dropFailedSamples,
|
|
236
259
|
});
|
|
237
260
|
const resultGroups = {
|
|
238
261
|
reboot: rebootGroup,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forkall.js","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,
|
|
1
|
+
{"version":3,"file":"forkall.js","sourceRoot":"","sources":["../../commands/forkall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C;;;GAGG;AAEH,gDAAgD;AAChD,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAErC,MAAM,CAAC,MAAM,MAAM,GAAW,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAAa;IACzC,QAAQ;IACR,SAAS;IACT,SAAS;IACT,UAAU;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,EAAE;IACrD,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE;IAC5C;QACE,KAAK,EAAE,kCAAkC;QACzC,WAAW,EAAE,UAAU;KACxB;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,iBAAiB;QAC9B,YAAY,EAAE,KAAK;KACpB;IACD;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,iBAAiB;QAC9B,YAAY,EAAE,IAAI;KACnB;IACD;QACE,KAAK,EAAE,6BAA6B;QACpC,WAAW,EAAE,iBAAiB;QAC9B,YAAY,EAAE,IAAI;KACnB;IACD;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,qBAAqB;QAClC,YAAY,EAAE,QAAQ;KACvB;IACD;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,+BAA+B;QAC5C,YAAY,EAAE,SAAS;KACxB;IACD;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,sBAAsB;QACnC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAA,UAAU;KACnC;IACD;QACE,KAAK,EAAE,+BAA+B;QACtC,WAAW,EAAE,0BAA0B;QACvC,YAAY,EAAE,SAAS;KACxB;IACD;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,yCAAyC;KACvD;IACD;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,sFAAsF;KACzF;CACF,CAAC;AAkBF,SAAS,gBAAgB,CAAC,KAIzB;IACC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAClD,IAAI,IAAI,KAAK,gBAAgB;QAAE,OAAO,EAAE,CAAC;IACzC,OAAO;QACL;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,GAAG,EAAE,mBAAmB;SACzB;QACD;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,GAAG,EAAE,sJAAsJ;SAC5J;QACD;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,GAAG,EAAE,wEAAwE;SAC9E;QACD;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,WAAW,EAAE,eAAe;YAC5B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,kGAAkG;SAClH;QACD;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,WAAW,EAAE,UAAU;YACvB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,sDAAsD;SACtE;QACD;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,WAAW,EAAE,cAAc;YAC3B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,uCAAuC,SAAS,4CAA4C;SAC5G;QACD;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,WAAW,EAAE,YAAY;YACzB,GAAG,EAAE,kFAAkF;SACxF;QACD;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,WAAW,EAAE,MAAM;YACnB,GAAG,EAAE,kBAAkB;SACxB;QACD;YACE,IAAI,EAAE,WAAW,CAAC,KAAK;YACvB,WAAW,EAAE,iBAAiB;YAC9B,GAAG,EAAE,WAAW,cAAc,EAAE;SACjC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAS1B;IACC,MAAM,EACJ,SAAS,EACT,GAAG,EACH,MAAM,EACN,UAAU,EACV,QAAQ,EACR,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,GAAG,KAAK,CAAC;IACV,OAAO;QACL;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,WAAW,EAAE,SAAS;YACtB,UAAU,EAAE,IAAI;YAChB,GAAG,EAAE,mCAAmC,MAAM,QAAQ,eAAe,EAAE;SACxE;QACD;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,GAAG,EAAE,yBAAyB;YAC9B,YAAY,EAAE;gBACZ,IAAI,EAAE,cAAc;aACrB;SACF;QACD;YACE,IAAI,EAAE,WAAW,CAAC,eAAe;YACjC,WAAW,EAAE,UAAU;YACvB,IAAI,EAAE,CAAC,GAAmB,EAAE,EAAE;gBAC5B,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAS,cAAc,CAAC,CAAC;gBACpD,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CACT,uCAAuC,CACxC,CAAC;oBACF,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzD,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YACzC,CAAC;SACF;QACD;YACE,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,WAAW,EAAE,UAAU;YACvB,GAAG,EAAE;gBACH,aAAa;gBACb,uCAAuC,UAAU,OAAO,QAAQ,6CAA6C;gBAC7G,SAAS;oBACP,CAAC,CAAC,oBAAoB,SAAS,8GAA8G,QAAQ,KAAK;oBAC1J,CAAC,CAAC,EAAE;gBACN,aAAa;gBACb,GAAG,CAAC,CAAC,CAAC,GAAG,eAAe,MAAM,CAAC,CAAC,CAAC,EAAE;gBACnC,GAAG,iBAAiB,KAAK;gBACzB,UAAU;gBACV,qFAAqF;aACtF;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,EAAE,CAAC;SACZ;KACF,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CAAC,KAIvC;IACC,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,GACvE,KAAK,CAAC;IACR,OAAO;QACL,GAAG,CAAC,oBAAoB;YACtB,CAAC,CAAC;gBACE;oBACE,IAAI,EAAE,WAAW,CAAC,OAAO;oBACzB,WAAW,EAAE,OAAO;oBACpB,GAAG,EAAE,UAAU,uBAAuB,IAAI,gBAAgB,IAAI,gBAAgB,OAAO,oBAAoB,EAAE;iBAC5G;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,GAI5B;IACC,MAAM,EACJ,SAAS,GAAG,EAAE,EACd,GAAG,GAAG,EAAE,EACR,oBAAoB,GAAG,EAAE,EACzB,MAAM,GAAG,KAAK,EACd,QAAQ,GAAG,IAAI,EACf,cAAc,GAAG,IAAI,EACrB,UAAU,GAAG,QAAQ,EACrB,IAAI,GAAG,SAAS,EAChB,SAAS,GAAG,MAAM,CAAC,GAAG,CAAA,UAAU,EAChC,kBAAkB,GAAG,SAAS,EAC9B,cAAc,GAAG,KAAK,EACtB,iBAAiB,GAAG,KAAK,EACzB,MAAM,GAAG,KAAK,GACf,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAEtB,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,MAAM,iBAAiB,GACrB,wDAAwD,CAAC;IAC3D,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;IACtE,MAAM,sBAAsB,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QACnE,CAAC,CAAC,sBAAsB;QACxB,CAAC,CAAC,GAAG,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QACjE,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,GAAG,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAC;IAC9E,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAChC,qBAAqB,EACrB,wBAAwB,CACzB,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IACxE,MAAM,uBAAuB,GAAG,IAAI,CAAC,SAAS,CAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,CAAC,CACpE,CAAC;IACF,MAAM,eAAe,GAAG,+DAA+D,GAAG,GAAG,CAAC;IAE9F,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACrC,SAAS,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACxC,SAAS,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACvC,SAAS,CAAC,qBAAqB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,uBAAuB,CAAC;QAC3C,GAAG;QACH,eAAe;QACf,iBAAiB;QACjB,kBAAkB,EAAE;YAClB,mDAAmD,SAAS,4CAA4C,SAAS,UAAU;SAC5H;KACF,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,iBAAiB,CAAC;QACrC,SAAS;QACT,GAAG;QACH,MAAM;QACN,UAAU;QACV,QAAQ;QACR,eAAe;QACf,eAAe;QACf,iBAAiB;KAClB,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,uBAAuB,CAAC;QAC3C,iBAAiB;QACjB,6BAA6B,EAAE,kBAAkB;QACjD,gBAAgB,EAAE,mBAAmB;KACtC,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,wBAAwB,CAAC;QAC7C,GAAG;QACH,gBAAgB;QAChB,oBAAoB,EAAE,KAAK;QAC3B,iBAAiB,EAAE,8BAA8B,CAAC;YAChD,oBAAoB;YACpB,gBAAgB;YAChB,uBAAuB;SACxB,CAAC;QACF,WAAW,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE;QAChD,YAAY;QACZ,aAAa;QACb,aAAa;QACb,kBAAkB;QAClB,eAAe,EAAE,WAAW;QAC5B,mBAAmB,EAAE,yBAAyB;QAC9C,kBAAkB,EAAE,cAAc;QAClC,iBAAiB;KAClB,CAAC,CAAC;IAEH,MAAM,YAAY,GAAW;QAC3B,MAAM,EAAE,WAAW;QACnB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,aAAa;KACxB,CAAC;IAEF,MAAM,KAAK,GACT,IAAI,KAAK,gBAAgB;QACvB,CAAC,CAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAc;QACpE,CAAC,CAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAc,CAAC;IAE/D,OAAO;QACL,MAAM,EAAE,YAAY;QACpB,iBAAiB,EAAE,KAAK;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Groups } from "../src/types.js";
|
|
2
|
+
/** report 场景占位;内容由 `applyOptions` 注入 */
|
|
2
3
|
export declare const groups: Groups;
|
|
3
4
|
export declare const defaultGroupOrder: string[];
|
|
4
5
|
export declare const options: ({
|
|
@@ -19,7 +20,13 @@ interface ForkallOptions {
|
|
|
19
20
|
bufferSize?: string;
|
|
20
21
|
outputDir?: string;
|
|
21
22
|
traceFormatProfile?: string;
|
|
23
|
+
riskTargets?: string;
|
|
24
|
+
skipPerfDedupe?: boolean;
|
|
25
|
+
skipBacktrack?: boolean;
|
|
26
|
+
dropFailedSamples?: boolean;
|
|
27
|
+
dryRun?: boolean;
|
|
22
28
|
}
|
|
29
|
+
/** 注入 monitor/collect/analysis 流水线及风险目标等派生命令 */
|
|
23
30
|
export declare function applyOptions(ctx: {
|
|
24
31
|
groups: Groups;
|
|
25
32
|
defaultGroupOrder: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8B,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA8B,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAW1E,wCAAwC;AACxC,eAAO,MAAM,MAAM,EAAE,MAAW,CAAC;AAEjC,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAKrC,CAAC;AA4CF,eAAO,MAAM,OAAO;;;;;;;;IAgDnB,CAAC;AAEF,UAAU,cAAc;IACtB,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;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuLD,gDAAgD;AAChD,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,CAqIlD"}
|
package/dist/commands/report.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { CommandKind } from "../src/types.js";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { existsSync, mkdirSync } from "node:fs";
|
|
4
|
-
import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGroup, selectFirstValidPerfInput, } from "../src/lib/
|
|
4
|
+
import { buildCommonAnalysisGroup, buildCommonCollectGroup, buildCommonInitEnvGroup, selectFirstValidPerfInput, } from "../src/lib/presets.js";
|
|
5
|
+
import { logger } from "../src/logger.js";
|
|
6
|
+
/** report 场景占位;内容由 `applyOptions` 注入 */
|
|
5
7
|
export const groups = {};
|
|
6
8
|
export const defaultGroupOrder = [
|
|
7
9
|
"reboot",
|
|
@@ -9,6 +11,29 @@ export const defaultGroupOrder = [
|
|
|
9
11
|
"collect",
|
|
10
12
|
"analysis",
|
|
11
13
|
];
|
|
14
|
+
const RISK_TARGET_DEFINITIONS = {
|
|
15
|
+
backtrack: {
|
|
16
|
+
key: "backtrack",
|
|
17
|
+
displayName: "失效回溯",
|
|
18
|
+
hitraceTag: "checkpoint_backtrack",
|
|
19
|
+
hiperfEvent: "checkpoint:vfs_snapshot_dump_monitor",
|
|
20
|
+
permissionPath: "/sys/kernel/tracing/events/checkpoint/vfs_snapshot_dump_monitor",
|
|
21
|
+
},
|
|
22
|
+
direct: {
|
|
23
|
+
key: "direct",
|
|
24
|
+
displayName: "直接失效",
|
|
25
|
+
hitraceTag: "checkpoint_direct",
|
|
26
|
+
hiperfEvent: "checkpoint:checkpoint_revoked",
|
|
27
|
+
permissionPath: "/sys/kernel/tracing/events/checkpoint/checkpoint_revoked",
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
const DEFAULT_RISK_TARGETS = Object.keys(RISK_TARGET_DEFINITIONS);
|
|
31
|
+
/** 与 {@link RISK_TARGET_DEFINITIONS} 同步:各 key 及展示名,供 CLI 与校验错误信息复用 */
|
|
32
|
+
const RISK_TARGETS_LABELLED_KEYS = Object.keys(RISK_TARGET_DEFINITIONS)
|
|
33
|
+
.map((k) => `${k}(${RISK_TARGET_DEFINITIONS[k].displayName})`)
|
|
34
|
+
.join("、");
|
|
35
|
+
/** `--risk-targets` 选项说明(随 {@link RISK_TARGET_DEFINITIONS} 自动更新) */
|
|
36
|
+
const RISK_TARGETS_CLI_DESCRIPTION = `风险抓取目标(逗号分隔:${RISK_TARGETS_LABELLED_KEYS};可用 all 表示全部;默认 all)`;
|
|
12
37
|
export const options = [
|
|
13
38
|
{ flags: "--app <app>", description: "应用名" },
|
|
14
39
|
{ flags: "--hstack-tool-path <path>", description: "hstack 工具地址" },
|
|
@@ -38,10 +63,55 @@ export const options = [
|
|
|
38
63
|
description: "trace 事件格式版本(默认 default)",
|
|
39
64
|
defaultValue: "default",
|
|
40
65
|
},
|
|
66
|
+
{
|
|
67
|
+
flags: "--risk-targets <targets>",
|
|
68
|
+
description: RISK_TARGETS_CLI_DESCRIPTION,
|
|
69
|
+
defaultValue: "all",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
flags: "--skip-perf-dedupe",
|
|
73
|
+
description: "跳过 perf 解码后的 compare 去重(dedupePerfData)",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
flags: "--skip-backtrack",
|
|
77
|
+
description: "跳过解码后对回溯样本的 FS/VFS 关联(hmtrace-parser fs_vfs / associateFsVfs);默认在启用失效回溯采集时开启;不影响采集",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
flags: "--drop-failed-samples",
|
|
81
|
+
description: "解码 perf 时丢弃「有 raw 但无对应 trace 解析器」的样本(decodePerfRawData dropFailedSamples);库会输出丢弃数量日志",
|
|
82
|
+
},
|
|
41
83
|
];
|
|
42
84
|
const PERF_INPUT_CONTEXT_KEY = "perf_input_file";
|
|
85
|
+
/** 与 forkall 一致:输出根目录下中间文件目录名(含日志、hitrace、perf.data、hstack 产物等,不含 dump_stack*) */
|
|
86
|
+
const WORKSPACE_SUBDIR = "workspace";
|
|
87
|
+
function parseRiskTargets(rawValue) {
|
|
88
|
+
if (!rawValue || rawValue.trim() === "" || rawValue.trim() === "all") {
|
|
89
|
+
return [...DEFAULT_RISK_TARGETS];
|
|
90
|
+
}
|
|
91
|
+
const entries = rawValue
|
|
92
|
+
.split(",")
|
|
93
|
+
.map((item) => item.trim().toLowerCase())
|
|
94
|
+
.filter(Boolean);
|
|
95
|
+
if (entries.length === 0) {
|
|
96
|
+
return [...DEFAULT_RISK_TARGETS];
|
|
97
|
+
}
|
|
98
|
+
const uniqueKeys = Array.from(new Set(entries));
|
|
99
|
+
if (uniqueKeys.includes("all")) {
|
|
100
|
+
return [...DEFAULT_RISK_TARGETS];
|
|
101
|
+
}
|
|
102
|
+
const invalidKeys = uniqueKeys.filter((key) => !(key in RISK_TARGET_DEFINITIONS));
|
|
103
|
+
if (invalidKeys.length > 0) {
|
|
104
|
+
throw new Error(`[风险抓取目标] 不支持的风险类型: ${invalidKeys.join(", ")}。可选值: all、${RISK_TARGETS_LABELLED_KEYS}`);
|
|
105
|
+
}
|
|
106
|
+
return uniqueKeys;
|
|
107
|
+
}
|
|
108
|
+
function buildPermissionCommands(targets) {
|
|
109
|
+
return targets.map((target) => `hdc shell "chmod 755 ${target.permissionPath} && chmod 666 ${target.permissionPath}/enable"`);
|
|
110
|
+
}
|
|
43
111
|
function buildMonitorGroup(input) {
|
|
44
|
-
const { logKey, bufferSize, duration, app, snapshotLogFile, startAppCommand, checkStateCommand, } = input;
|
|
112
|
+
const { logKey, bufferSize, duration, app, snapshotLogFile, startAppCommand, checkStateCommand, riskTargets, } = input;
|
|
113
|
+
const hitraceTags = riskTargets.map((target) => target.hitraceTag).join(" ");
|
|
114
|
+
const hiperfEvents = riskTargets.map((target) => target.hiperfEvent).join(",");
|
|
45
115
|
return [
|
|
46
116
|
{
|
|
47
117
|
kind: CommandKind.Windows,
|
|
@@ -62,24 +132,35 @@ function buildMonitorGroup(input) {
|
|
|
62
132
|
func: (ctx) => {
|
|
63
133
|
const apppoolPids = ctx.get("apppool_pids");
|
|
64
134
|
if (!apppoolPids) {
|
|
65
|
-
|
|
135
|
+
logger.warn("[提取检测目标信息] apppool_pids 缺失或不是字符串,跳过处理");
|
|
66
136
|
return false;
|
|
67
137
|
}
|
|
68
138
|
const monitorTarget = apppoolPids.split(/\s+/).join(",");
|
|
69
139
|
ctx.set("monitor_target", monitorTarget);
|
|
70
|
-
|
|
140
|
+
logger.info("提取检测目标: ", monitorTarget);
|
|
71
141
|
},
|
|
72
142
|
},
|
|
143
|
+
{
|
|
144
|
+
kind: CommandKind.Windows,
|
|
145
|
+
description: "在设备端输出操作提示并执行状态检测",
|
|
146
|
+
background: true,
|
|
147
|
+
backgroundDelayMs: 80_000,
|
|
148
|
+
run: `hdc shell "echo '=== 请按测试要求在设备上完成操作(以下为状态检测输出)===' && ${checkStateCommand}"`,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
kind: CommandKind.Embed,
|
|
152
|
+
description: "等待 15 秒后开始收集风险事件数据",
|
|
153
|
+
run: "sleep 15",
|
|
154
|
+
},
|
|
73
155
|
{
|
|
74
156
|
kind: CommandKind.Windows,
|
|
75
157
|
description: "收集风险事件数据",
|
|
76
158
|
run: [
|
|
77
159
|
'hdc shell "',
|
|
78
|
-
`hitrace
|
|
79
|
-
`hiperf record -e
|
|
160
|
+
`hitrace ${hitraceTags} --overwrite -b ${bufferSize} -t ${duration} -o /data/local/tmp/snapshot_hitrace.txt & `,
|
|
161
|
+
`hiperf --much record -e ${hiperfEvents} --period 1 -s fp --clockid boottime --callchain-useronly --cpu-limit 100 -o /data/local/tmp/perf.data -p {{monitor_target}} -d ${duration} & `,
|
|
80
162
|
`sleep 1 && `,
|
|
81
163
|
app ? `${startAppCommand} && ` : "",
|
|
82
|
-
`${checkStateCommand} & `,
|
|
83
164
|
`wait && `,
|
|
84
165
|
`hiperf dump -i /data/local/tmp/perf.data -o /data/local/tmp/snapshot_perf.data.txt"`,
|
|
85
166
|
]
|
|
@@ -89,14 +170,14 @@ function buildMonitorGroup(input) {
|
|
|
89
170
|
];
|
|
90
171
|
}
|
|
91
172
|
function buildAnalysisPreDecodeCommands(input) {
|
|
92
|
-
const { snapshotPerfFile, parsedSnapshotPerfFile, hstackToolPathNormalized, perfTextDir,
|
|
173
|
+
const { snapshotPerfFile, parsedSnapshotPerfFile, hstackToolPathNormalized, perfTextDir, workspaceDirNormalized, sourcemapDirNormalized, } = input;
|
|
93
174
|
return [
|
|
94
175
|
...(hstackToolPathNormalized
|
|
95
176
|
? [
|
|
96
177
|
{
|
|
97
178
|
kind: CommandKind.Windows,
|
|
98
179
|
description: "解析采集结果",
|
|
99
|
-
run: `${hstackToolPathNormalized} -i ${perfTextDir} -o ${
|
|
180
|
+
run: `${hstackToolPathNormalized} -i ${perfTextDir} -o ${workspaceDirNormalized} -s ${sourcemapDirNormalized}`,
|
|
100
181
|
},
|
|
101
182
|
]
|
|
102
183
|
: [
|
|
@@ -104,7 +185,7 @@ function buildAnalysisPreDecodeCommands(input) {
|
|
|
104
185
|
kind: CommandKind.BuiltinFunction,
|
|
105
186
|
description: "未配置 hstack,跳过解析采集结果",
|
|
106
187
|
func: () => {
|
|
107
|
-
|
|
188
|
+
logger.warn("[解析采集结果] 未配置 hstack 工具,跳过 hstack 解析");
|
|
108
189
|
},
|
|
109
190
|
},
|
|
110
191
|
]),
|
|
@@ -117,17 +198,18 @@ function buildAnalysisPreDecodeCommands(input) {
|
|
|
117
198
|
: [snapshotPerfFile];
|
|
118
199
|
const { filePath, reason } = selectFirstValidPerfInput(candidates);
|
|
119
200
|
if (!filePath) {
|
|
120
|
-
|
|
201
|
+
logger.error(`[选择 perf 输入] ${reason},放弃后续解析`);
|
|
121
202
|
return false;
|
|
122
203
|
}
|
|
123
204
|
ctx.set(PERF_INPUT_CONTEXT_KEY, filePath);
|
|
124
|
-
|
|
205
|
+
logger.info(`[选择 perf 输入] 使用文件: ${filePath}`);
|
|
125
206
|
},
|
|
126
207
|
},
|
|
127
208
|
];
|
|
128
209
|
}
|
|
210
|
+
/** 注入 monitor/collect/analysis 流水线及风险目标等派生命令 */
|
|
129
211
|
export function applyOptions(ctx) {
|
|
130
|
-
const { app = "", hstackToolPath = "", sourcemapDir = "", logKey = "pid", duration = "70", bufferSize = "512000", outputDir = String.raw `.\output`, traceFormatProfile = "default", } = ctx.options ?? {};
|
|
212
|
+
const { app = "", hstackToolPath = "", sourcemapDir = "", logKey = "pid", duration = "70", bufferSize = "512000", outputDir = String.raw `.\output`, traceFormatProfile = "default", riskTargets = "all", skipPerfDedupe = false, skipBacktrack = false, dropFailedSamples = false, dryRun = false, } = ctx.options ?? {};
|
|
131
213
|
const checkStateCommand = "hidumper -s 1901 -a '-p libforkall_plugin.z.so --list'";
|
|
132
214
|
const hstackToolPathNormalized = hstackToolPath
|
|
133
215
|
? path.normalize(hstackToolPath)
|
|
@@ -136,30 +218,42 @@ export function applyOptions(ctx) {
|
|
|
136
218
|
? path.normalize(sourcemapDir)
|
|
137
219
|
: "";
|
|
138
220
|
const outputDirNormalized = path.normalize(outputDir);
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
221
|
+
const workspaceDir = path.join(outputDirNormalized, WORKSPACE_SUBDIR);
|
|
222
|
+
const workspaceDirNormalized = path.normalize(workspaceDir);
|
|
223
|
+
const workspaceDirWithSep = workspaceDirNormalized.endsWith(path.sep)
|
|
224
|
+
? workspaceDirNormalized
|
|
225
|
+
: `${workspaceDirNormalized}${path.sep}`;
|
|
143
226
|
const perfTextDir = path.join(outputDirNormalized, "perf_txt");
|
|
144
|
-
const
|
|
145
|
-
const
|
|
227
|
+
const perfTextDirNormalized = path.normalize(perfTextDir);
|
|
228
|
+
const perfTextDirWithSep = perfTextDirNormalized.endsWith(path.sep)
|
|
229
|
+
? perfTextDirNormalized
|
|
230
|
+
: `${perfTextDirNormalized}${path.sep}`;
|
|
231
|
+
const selectedRiskTargets = parseRiskTargets(riskTargets).map((key) => RISK_TARGET_DEFINITIONS[key]);
|
|
232
|
+
const runAssociateFsVfs = !skipBacktrack &&
|
|
233
|
+
selectedRiskTargets.some((target) => target.key === "backtrack");
|
|
234
|
+
const snapshotLogFile = path.join(workspaceDirNormalized, "snapshot_log.txt");
|
|
235
|
+
const snapshotPerfFile = path.join(perfTextDirNormalized, "snapshot_perf.data.txt");
|
|
236
|
+
const parsedSnapshotPerfFile = path.join(workspaceDirNormalized, "_snapshot_perf.data.txt");
|
|
146
237
|
const dumpStackTxt = path.join(outputDirNormalized, "dump_stack.txt");
|
|
147
238
|
const dumpStackJson = path.join(outputDirNormalized, "dump_stack.json");
|
|
239
|
+
const dumpStackXlsx = path.join(outputDirNormalized, "dump_stack.xlsx");
|
|
148
240
|
const start_app_command = `hidumper -s 1901 -a '-p libforkall_plugin.z.so --create 100 ${app}'`;
|
|
149
|
-
if (!
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
241
|
+
if (!dryRun) {
|
|
242
|
+
if (!existsSync(outputDirNormalized)) {
|
|
243
|
+
mkdirSync(outputDirNormalized, { recursive: true });
|
|
244
|
+
}
|
|
245
|
+
if (!existsSync(workspaceDirNormalized)) {
|
|
246
|
+
mkdirSync(workspaceDirNormalized, { recursive: true });
|
|
247
|
+
}
|
|
248
|
+
if (!existsSync(perfTextDirNormalized)) {
|
|
249
|
+
mkdirSync(perfTextDirNormalized, { recursive: true });
|
|
250
|
+
}
|
|
154
251
|
}
|
|
155
252
|
const initEnvGroup = buildCommonInitEnvGroup({
|
|
156
253
|
app,
|
|
157
254
|
snapshotLogFile,
|
|
158
255
|
checkStateCommand,
|
|
159
|
-
permissionCommands:
|
|
160
|
-
'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"',
|
|
161
|
-
'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"',
|
|
162
|
-
],
|
|
256
|
+
permissionCommands: buildPermissionCommands(selectedRiskTargets),
|
|
163
257
|
});
|
|
164
258
|
const monitorGroup = buildMonitorGroup({
|
|
165
259
|
logKey,
|
|
@@ -169,11 +263,12 @@ export function applyOptions(ctx) {
|
|
|
169
263
|
snapshotLogFile,
|
|
170
264
|
startAppCommand: start_app_command,
|
|
171
265
|
checkStateCommand,
|
|
266
|
+
riskTargets: selectedRiskTargets,
|
|
172
267
|
});
|
|
173
268
|
const collectGroup = buildCommonCollectGroup({
|
|
174
269
|
checkStateCommand,
|
|
175
|
-
snapshotPerfReceiveDirWithSep:
|
|
176
|
-
outputDirWithSep,
|
|
270
|
+
snapshotPerfReceiveDirWithSep: perfTextDirWithSep,
|
|
271
|
+
outputDirWithSep: workspaceDirWithSep,
|
|
177
272
|
});
|
|
178
273
|
const analysisGroup = buildCommonAnalysisGroup({
|
|
179
274
|
app,
|
|
@@ -183,17 +278,23 @@ export function applyOptions(ctx) {
|
|
|
183
278
|
snapshotPerfFile,
|
|
184
279
|
parsedSnapshotPerfFile,
|
|
185
280
|
hstackToolPathNormalized,
|
|
186
|
-
perfTextDir,
|
|
187
|
-
|
|
281
|
+
perfTextDir: perfTextDirNormalized,
|
|
282
|
+
workspaceDirNormalized,
|
|
188
283
|
sourcemapDirNormalized,
|
|
189
284
|
}),
|
|
190
285
|
decodeInput: { inputContextKey: PERF_INPUT_CONTEXT_KEY },
|
|
191
286
|
dumpStackTxt,
|
|
192
287
|
dumpStackJson,
|
|
288
|
+
dumpStackXlsx,
|
|
193
289
|
traceFormatProfile,
|
|
194
290
|
decodeStageName: "镜像失效风险栈分析",
|
|
195
291
|
missingInputMessage: "[镜像失效风险栈分析] 未选择到可用 perf 输入文件,跳过处理",
|
|
292
|
+
skipDedupePerfData: skipPerfDedupe,
|
|
293
|
+
runAssociateFsVfs,
|
|
294
|
+
dropFailedSamples,
|
|
196
295
|
});
|
|
296
|
+
logger.info(`[风险抓取目标] ${selectedRiskTargets.map((target) => target.displayName).join("、")}`);
|
|
297
|
+
logger.info(`[fs_vfs] ${runAssociateFsVfs ? "解码后将执行 FS/VFS 关联(associateFsVfs)" : "已跳过 FS/VFS 关联"}`);
|
|
197
298
|
const resultGroups = {
|
|
198
299
|
init: initEnvGroup,
|
|
199
300
|
monitor: monitorGroup,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Groups } from "../src/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* `CommandContext` 与跨组 `{{var}}` 演示。
|
|
4
|
+
*
|
|
5
|
+
* CLI:`npm run dev -- context-demo` / `node dist/cli.js context-demo`;别名 `context_demo`。
|
|
6
|
+
* 库用法:`snapshot-checker` + `snapshot-checker/demos/context-demo`,详 `demos/consumer-app`。
|
|
7
|
+
*/
|
|
8
|
+
export declare const groups: Groups;
|
|
9
|
+
export declare const defaultGroupOrder: string[];
|
|
10
|
+
//# sourceMappingURL=context-demo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-demo.d.ts","sourceRoot":"","sources":["../../demos/context-demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACZ,MAAM,iBAAiB,CAAC;AAazB;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,MA8CpB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAKrC,CAAC"}
|
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
import { CommandKind, getCurrentPlatformKind, } from "../src/types.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
function demoGreeting(user) {
|
|
3
|
+
return `demo says hi to ${user}`;
|
|
4
|
+
}
|
|
5
|
+
function demoTag(prefix) {
|
|
6
|
+
return `${prefix}:context-demo`;
|
|
7
|
+
}
|
|
8
|
+
/** 与非 macOS 主机对齐,以免整组被平台过滤 */
|
|
4
9
|
const kind = getCurrentPlatformKind();
|
|
5
10
|
/**
|
|
6
|
-
*
|
|
11
|
+
* `CommandContext` 与跨组 `{{var}}` 演示。
|
|
7
12
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* 使用方式(构建后):
|
|
12
|
-
* node dist/cli.js context_demo
|
|
13
|
-
*
|
|
14
|
-
* 作为 npm 包被外部项目引用时:
|
|
15
|
-
* import { resolveScenario, runScenarioGroups } from 'snapshot-checker';
|
|
16
|
-
* import * as contextDemo from 'snapshot-checker/commands/context_demo';
|
|
17
|
-
* 完整示例见 demos/consumer-app(需先发布包并 npm install snapshot-checker)。
|
|
13
|
+
* CLI:`npm run dev -- context-demo` / `node dist/cli.js context-demo`;别名 `context_demo`。
|
|
14
|
+
* 库用法:`snapshot-checker` + `snapshot-checker/demos/context-demo`,详 `demos/consumer-app`。
|
|
18
15
|
*/
|
|
19
16
|
export const groups = {
|
|
20
17
|
getUser: [
|
|
@@ -37,17 +34,17 @@ export const groups = {
|
|
|
37
34
|
builtinFn: [
|
|
38
35
|
{
|
|
39
36
|
kind: CommandKind.BuiltinFunction,
|
|
40
|
-
description: "
|
|
37
|
+
description: "演示:在同文件内小工具函数写入上下文变量",
|
|
41
38
|
func: (ctx) => {
|
|
42
39
|
const user = ctx.get("user") ?? "unknown";
|
|
43
|
-
ctx.set("builtinTag",
|
|
44
|
-
ctx.set("
|
|
40
|
+
ctx.set("builtinTag", demoTag("context-demo"));
|
|
41
|
+
ctx.set("demoGreet", demoGreeting(user));
|
|
45
42
|
},
|
|
46
43
|
},
|
|
47
44
|
{
|
|
48
45
|
kind,
|
|
49
46
|
description: "读取内置函数写入的变量",
|
|
50
|
-
run: 'echo "{{builtinTag}} | {{
|
|
47
|
+
run: 'echo "{{builtinTag}} | {{demoGreet}}"',
|
|
51
48
|
},
|
|
52
49
|
],
|
|
53
50
|
builtinFail: [
|
|
@@ -69,4 +66,4 @@ export const defaultGroupOrder = [
|
|
|
69
66
|
"builtinFn",
|
|
70
67
|
"builtinFail",
|
|
71
68
|
];
|
|
72
|
-
//# sourceMappingURL=
|
|
69
|
+
//# sourceMappingURL=context-demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-demo.js","sourceRoot":"","sources":["../../demos/context-demo.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,sBAAsB,GAGvB,MAAM,iBAAiB,CAAC;AAEzB,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,mBAAmB,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,GAAG,MAAM,eAAe,CAAC;AAClC,CAAC;AAED,8BAA8B;AAC9B,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;AAEtC;;;;;GAKG;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,GAAmB,EAAE,EAAE;gBAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAS,MAAM,CAAC,IAAI,SAAS,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC/C,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC;SACF;QACD;YACE,IAAI;YACJ,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,uCAAuC;SAC7C;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;IACzC,SAAS;IACT,OAAO;IACP,WAAW;IACX,aAAa;CACd,CAAC"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import type { Groups } from "../src/types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Mac 示例场景:仅在 macOS 下执行,接收 --app 参数,参数不为空时打印 app。
|
|
4
|
-
*/
|
|
2
|
+
/** 仅 macOS 执行;可选 `--app`,非空时附加打印步骤 */
|
|
5
3
|
export declare const groups: Groups;
|
|
6
4
|
export declare const defaultGroupOrder: string[];
|
|
7
5
|
export declare const options: {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mac-example.d.ts","sourceRoot":"","sources":["../../demos/mac-example.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,sCAAsC;AACtC,eAAO,MAAM,MAAM,EAAE,MAQpB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAAoB,CAAC;AAE3D,eAAO,MAAM,OAAO;;;GAEnB,CAAC;AAEF,UAAU,iBAAiB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,iBAAiB,CAAC;CAC5B,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CAuBlD"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { CommandKind } from "../src/types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Mac 示例场景:仅在 macOS 下执行,接收 --app 参数,参数不为空时打印 app。
|
|
4
|
-
*/
|
|
2
|
+
/** 仅 macOS 执行;可选 `--app`,非空时附加打印步骤 */
|
|
5
3
|
export const groups = {
|
|
6
4
|
info: [
|
|
7
5
|
{
|
|
@@ -13,7 +11,7 @@ export const groups = {
|
|
|
13
11
|
};
|
|
14
12
|
export const defaultGroupOrder = ["info", "app"];
|
|
15
13
|
export const options = [
|
|
16
|
-
{ flags: "--app <app>", description: "
|
|
14
|
+
{ flags: "--app <app>", description: "非空时在执行序列中附带打印" },
|
|
17
15
|
];
|
|
18
16
|
export function applyOptions(ctx) {
|
|
19
17
|
const { groups: baseGroups, defaultGroupOrder } = ctx;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mac-example.js","sourceRoot":"","sources":["../../demos/mac-example.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,sCAAsC;AACtC,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,WAAW,CAAC,GAAG;YACrB,WAAW,EAAE,oBAAoB;YACjC,GAAG,EAAE,UAAU;SAChB;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE;CACvD,CAAC;AAMF,MAAM,UAAU,YAAY,CAAC,GAI5B;IACC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,GAAG,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAE3C,MAAM,QAAQ,GACZ,GAAG,KAAK,EAAE;QACR,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACE;gBACE,IAAI,EAAE,WAAW,CAAC,GAAG;gBACrB,WAAW,EAAE,yBAAyB;gBACtC,GAAG,EAAE,QAAQ,GAAG,EAAE;aACnB;SACF,CAAC;IAER,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/D,OAAO;QACL,MAAM,EAAE;YACN,GAAG,UAAU;YACb,GAAG,EAAE,QAAQ;SACd;QACD,iBAAiB,EAAE,KAAK;KACzB,CAAC;AACJ,CAAC"}
|