snapshot-checker 0.6.3 → 0.7.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.
Files changed (131) hide show
  1. package/README.md +209 -15
  2. package/dist/commands/forkall.d.ts.map +1 -1
  3. package/dist/commands/forkall.js +23 -16
  4. package/dist/commands/forkall.js.map +1 -1
  5. package/dist/commands/report-user.d.ts +25 -0
  6. package/dist/commands/report-user.d.ts.map +1 -0
  7. package/dist/commands/report-user.js +17 -0
  8. package/dist/commands/report-user.js.map +1 -0
  9. package/dist/commands/report.d.ts +1 -26
  10. package/dist/commands/report.d.ts.map +1 -1
  11. package/dist/commands/report.js +6 -425
  12. package/dist/commands/report.js.map +1 -1
  13. package/dist/demos/timeout-demo.d.ts.map +1 -1
  14. package/dist/demos/timeout-demo.js +1 -1
  15. package/dist/demos/timeout-demo.js.map +1 -1
  16. package/dist/src/bin.d.ts +3 -0
  17. package/dist/src/bin.d.ts.map +1 -0
  18. package/dist/src/bin.js +57 -0
  19. package/dist/src/bin.js.map +1 -0
  20. package/dist/src/cli.js +33 -55
  21. package/dist/src/cli.js.map +1 -1
  22. package/dist/src/executor.d.ts +5 -5
  23. package/dist/src/executor.d.ts.map +1 -1
  24. package/dist/src/executor.js +3 -3
  25. package/dist/src/executor.js.map +1 -1
  26. package/dist/src/{groupSpecs.d.ts → group_specs.d.ts} +2 -2
  27. package/dist/src/group_specs.d.ts.map +1 -0
  28. package/dist/src/{groupSpecs.js → group_specs.js} +1 -1
  29. package/dist/src/group_specs.js.map +1 -0
  30. package/dist/src/index.d.ts +4 -4
  31. package/dist/src/index.d.ts.map +1 -1
  32. package/dist/src/index.js +3 -3
  33. package/dist/src/index.js.map +1 -1
  34. package/dist/src/lib/format.d.ts +30 -0
  35. package/dist/src/lib/format.d.ts.map +1 -0
  36. package/dist/src/lib/format.js +76 -0
  37. package/dist/src/lib/format.js.map +1 -0
  38. package/dist/src/lib/{hostCommands.d.ts → host_commands.d.ts} +6 -1
  39. package/dist/src/lib/host_commands.d.ts.map +1 -0
  40. package/dist/src/lib/{hostCommands.js → host_commands.js} +9 -1
  41. package/dist/src/lib/host_commands.js.map +1 -0
  42. package/dist/src/lib/perf_decode.d.ts +25 -0
  43. package/dist/src/lib/perf_decode.d.ts.map +1 -0
  44. package/dist/src/lib/perf_decode.js +90 -0
  45. package/dist/src/lib/perf_decode.js.map +1 -0
  46. package/dist/src/lib/pipeline.d.ts +108 -0
  47. package/dist/src/lib/pipeline.d.ts.map +1 -0
  48. package/dist/src/lib/pipeline.js +294 -0
  49. package/dist/src/lib/pipeline.js.map +1 -0
  50. package/dist/src/lib/preflight.d.ts +2 -0
  51. package/dist/src/lib/preflight.d.ts.map +1 -0
  52. package/dist/src/lib/preflight.js +45 -0
  53. package/dist/src/lib/preflight.js.map +1 -0
  54. package/dist/src/lib/presets.d.ts +46 -27
  55. package/dist/src/lib/presets.d.ts.map +1 -1
  56. package/dist/src/lib/presets.js +187 -216
  57. package/dist/src/lib/presets.js.map +1 -1
  58. package/dist/src/lib/programmatic.d.ts +30 -0
  59. package/dist/src/lib/programmatic.d.ts.map +1 -0
  60. package/dist/src/lib/programmatic.js +40 -0
  61. package/dist/src/lib/programmatic.js.map +1 -0
  62. package/dist/src/lib/report_scenario.d.ts +50 -0
  63. package/dist/src/lib/report_scenario.d.ts.map +1 -0
  64. package/dist/src/lib/report_scenario.js +497 -0
  65. package/dist/src/lib/report_scenario.js.map +1 -0
  66. package/dist/src/lib/scenario.d.ts +17 -3
  67. package/dist/src/lib/scenario.d.ts.map +1 -1
  68. package/dist/src/lib/scenario.js +34 -8
  69. package/dist/src/lib/scenario.js.map +1 -1
  70. package/dist/src/lib/version.d.ts +12 -0
  71. package/dist/src/lib/version.d.ts.map +1 -0
  72. package/dist/src/lib/version.js +51 -0
  73. package/dist/src/lib/version.js.map +1 -0
  74. package/dist/src/logger.d.ts +31 -1
  75. package/dist/src/logger.d.ts.map +1 -1
  76. package/dist/src/logger.js +182 -16
  77. package/dist/src/logger.js.map +1 -1
  78. package/dist/src/{runCommand.d.ts → run_command.d.ts} +1 -1
  79. package/dist/src/run_command.d.ts.map +1 -0
  80. package/dist/src/{runCommand.js → run_command.js} +5 -6
  81. package/dist/src/run_command.js.map +1 -0
  82. package/dist/src/{runGroups.d.ts → run_groups.d.ts} +12 -3
  83. package/dist/src/run_groups.d.ts.map +1 -0
  84. package/dist/src/{runGroups.js → run_groups.js} +28 -13
  85. package/dist/src/run_groups.js.map +1 -0
  86. package/dist/src/runners/{backgroundExecutor.d.ts → background_executor.d.ts} +3 -3
  87. package/dist/src/runners/background_executor.d.ts.map +1 -0
  88. package/dist/src/runners/{backgroundExecutor.js → background_executor.js} +3 -3
  89. package/dist/src/runners/background_executor.js.map +1 -0
  90. package/dist/src/runners/{builtinRunner.d.ts → builtin_runner.d.ts} +1 -1
  91. package/dist/src/runners/builtin_runner.d.ts.map +1 -0
  92. package/dist/src/runners/{builtinRunner.js → builtin_runner.js} +1 -1
  93. package/dist/src/runners/builtin_runner.js.map +1 -0
  94. package/dist/src/runners/{embedRunner.d.ts → embed_runner.d.ts} +1 -1
  95. package/dist/src/runners/embed_runner.d.ts.map +1 -0
  96. package/dist/src/runners/{embedRunner.js → embed_runner.js} +2 -2
  97. package/dist/src/runners/{embedRunner.js.map → embed_runner.js.map} +1 -1
  98. package/dist/src/runners/index.d.ts +5 -5
  99. package/dist/src/runners/index.d.ts.map +1 -1
  100. package/dist/src/runners/index.js +4 -4
  101. package/dist/src/runners/index.js.map +1 -1
  102. package/dist/src/runners/{platformShellExecutor.d.ts → platform_shell_executor.d.ts} +1 -1
  103. package/dist/src/runners/platform_shell_executor.d.ts.map +1 -0
  104. package/dist/src/runners/{platformShellExecutor.js → platform_shell_executor.js} +2 -2
  105. package/dist/src/runners/platform_shell_executor.js.map +1 -0
  106. package/dist/src/runners/{shellRunner.d.ts → shell_runner.d.ts} +1 -1
  107. package/dist/src/runners/shell_runner.d.ts.map +1 -0
  108. package/dist/src/runners/{shellRunner.js → shell_runner.js} +11 -16
  109. package/dist/src/runners/shell_runner.js.map +1 -0
  110. package/dist/src/runners/types.d.ts.map +1 -1
  111. package/dist/src/types.d.ts +2 -2
  112. package/dist/src/types.d.ts.map +1 -1
  113. package/dist/src/types.js.map +1 -1
  114. package/package.json +13 -4
  115. package/dist/src/groupSpecs.d.ts.map +0 -1
  116. package/dist/src/groupSpecs.js.map +0 -1
  117. package/dist/src/lib/hostCommands.d.ts.map +0 -1
  118. package/dist/src/lib/hostCommands.js.map +0 -1
  119. package/dist/src/runCommand.d.ts.map +0 -1
  120. package/dist/src/runCommand.js.map +0 -1
  121. package/dist/src/runGroups.d.ts.map +0 -1
  122. package/dist/src/runGroups.js.map +0 -1
  123. package/dist/src/runners/backgroundExecutor.d.ts.map +0 -1
  124. package/dist/src/runners/backgroundExecutor.js.map +0 -1
  125. package/dist/src/runners/builtinRunner.d.ts.map +0 -1
  126. package/dist/src/runners/builtinRunner.js.map +0 -1
  127. package/dist/src/runners/embedRunner.d.ts.map +0 -1
  128. package/dist/src/runners/platformShellExecutor.d.ts.map +0 -1
  129. package/dist/src/runners/platformShellExecutor.js.map +0 -1
  130. package/dist/src/runners/shellRunner.d.ts.map +0 -1
  131. package/dist/src/runners/shellRunner.js.map +0 -1
@@ -1,436 +1,17 @@
1
- import { CommandKind, SHELL_PLATFORM_KINDS } from "../src/types.js";
2
- import path from "node:path";
3
- import { existsSync, mkdirSync } from "node:fs";
4
- import { AUTO_TRACE_FORMAT_PROFILE, buildCommonAnalysisGroup, buildCommonAnalysisTargetFilterGroup, buildCommonCollectGroup, buildCommonInitEnvGroup, buildCommonRestoreEnvGroup, resolveParseConcurrency, selectFirstValidPerfInput, TRACE_FORMAT_PROFILE_CLI_DESCRIPTION, } from "../src/lib/presets.js";
5
- import { createHdcCli } from "../src/lib/hdc.js";
6
- import { ensureTrailingSeparator, normalizeCliOutputDir, } from "../src/lib/paths.js";
7
- import { logger } from "../src/logger.js";
1
+ import { applyReportScenarioOptions, REPORT_DEFAULT_GROUP_ORDER, REPORT_OPTIONS, } from "../src/lib/report_scenario.js";
8
2
  /** report 场景占位;内容由 `applyOptions` 注入 */
9
3
  export const groups = {};
10
- export const defaultGroupOrder = [
11
- "init",
12
- "monitor",
13
- "collect",
14
- "restore",
15
- "filter",
16
- "analysis",
17
- ];
18
- /** backtrack / direct 当前共用同一 hitrace tag */
19
- const RISK_TARGET_DEFINITIONS = {
20
- backtrack: {
21
- key: "backtrack",
22
- displayName: "失效回溯",
23
- hitraceTag: "hyperstart",
24
- hiperfEvent: "checkpoint:vfs_snapshot_dump_monitor",
25
- formatPath: "/sys/kernel/tracing/events/checkpoint/vfs_snapshot_dump_monitor/format",
26
- },
27
- direct: {
28
- key: "direct",
29
- displayName: "直接失效",
30
- hitraceTag: "hyperstart",
31
- hiperfEvent: "checkpoint:checkpoint_revoked",
32
- formatPath: "/sys/kernel/tracing/events/checkpoint/checkpoint_revoked/format",
33
- },
34
- };
35
- const DEFAULT_RISK_TARGETS = Object.keys(RISK_TARGET_DEFINITIONS);
36
- /** 与 {@link RISK_TARGET_DEFINITIONS} 同步:各 key 及展示名,供 CLI 与校验错误信息复用 */
37
- const RISK_TARGETS_LABELLED_KEYS = Object.keys(RISK_TARGET_DEFINITIONS)
38
- .map((k) => `${k}(${RISK_TARGET_DEFINITIONS[k].displayName})`)
39
- .join("、");
40
- /** `--risk-targets` 选项说明(随 {@link RISK_TARGET_DEFINITIONS} 自动更新) */
41
- const RISK_TARGETS_CLI_DESCRIPTION = `风险事件类型,逗号分隔:${RISK_TARGETS_LABELLED_KEYS};all 为全部;默认 all`;
42
- const TRACE_FROM_VALUES = ["hiperf", "hitrace", "mix"];
43
- /** `--trace-from` 选项说明 */
44
- const TRACE_FROM_CLI_DESCRIPTION = "trace 来源:hitrace、hiperf、mix";
4
+ export const defaultGroupOrder = [...REPORT_DEFAULT_GROUP_ORDER];
45
5
  export const options = [
6
+ ...REPORT_OPTIONS,
46
7
  {
47
- flags: "--app <app>",
48
- description: "应用包名",
49
- helpGroup: "场景与工具链",
50
- },
51
- {
52
- flags: "--hstack-tool-path <path>",
53
- description: "hstack 可执行文件路径",
8
+ flags: "--user-start-app",
9
+ description: "monitor 阶段通过 uinput/power-shell 模拟点击启动应用,替代 hidumper forkall --create",
54
10
  helpGroup: "场景与工具链",
55
11
  },
56
- {
57
- flags: "--sourcemap-dir <path>",
58
- description: "sourcemap 根目录",
59
- helpGroup: "场景与工具链",
60
- },
61
- {
62
- flags: "--log-key <key>",
63
- description: "日志匹配字段,默认 pid",
64
- defaultValue: "pid",
65
- helpGroup: "采集与输出",
66
- },
67
- {
68
- flags: "--duration <seconds>",
69
- description: "采集时长(秒),默认 70",
70
- defaultValue: "70",
71
- helpGroup: "采集与输出",
72
- },
73
- {
74
- flags: "--backtrack-delay <seconds>",
75
- description: "monitor 阶段后台状态检测命令的启动延迟(秒),默认 80;对应 backgroundDelayMs",
76
- defaultValue: "80",
77
- helpGroup: "采集与输出",
78
- },
79
- {
80
- flags: "--risk-collect-wait <seconds>",
81
- description: "开始收集风险事件(hitrace/hiperf)前的等待秒数,默认 0(不等待);大于 0 时先 sleep 再采集",
82
- defaultValue: "0",
83
- helpGroup: "采集与输出",
84
- },
85
- {
86
- flags: "--buffer-size <bytes>",
87
- description: "hitrace 缓冲区(字节),默认 512000",
88
- defaultValue: "512000",
89
- helpGroup: "采集与输出",
90
- },
91
- {
92
- flags: "--output-dir <path>",
93
- description: "输出根目录,默认 ./output",
94
- defaultValue: "./output",
95
- helpGroup: "采集与输出",
96
- },
97
- {
98
- flags: "--risk-targets <targets>",
99
- description: RISK_TARGETS_CLI_DESCRIPTION,
100
- defaultValue: "all",
101
- helpGroup: "采集与输出",
102
- },
103
- {
104
- flags: "--trace-from <source>",
105
- description: TRACE_FROM_CLI_DESCRIPTION,
106
- defaultValue: "hitrace",
107
- helpGroup: "采集与输出",
108
- },
109
- {
110
- flags: "--trace-format-profile <name>",
111
- description: TRACE_FORMAT_PROFILE_CLI_DESCRIPTION,
112
- defaultValue: "default",
113
- helpGroup: "解码与栈分析",
114
- },
115
- {
116
- flags: "--skip-perf-dedupe",
117
- description: "跳过解码后 dedupePerfData",
118
- helpGroup: "解码与栈分析",
119
- },
120
- {
121
- flags: "--skip-backtrack",
122
- description: "跳过解码后 backtrackFS;风险目标含 backtrack 时默认会执行;不影响采集",
123
- helpGroup: "解码与栈分析",
124
- },
125
- {
126
- flags: "--skip-non-backtrack",
127
- description: "backtrackFS 使用 keepNonFsRevoked: false;未跑 backtrackFS 时不生效",
128
- helpGroup: "解码与栈分析",
129
- },
130
- {
131
- flags: "--drop-failed-samples",
132
- description: "decodePerfRawData 丢弃无对应 trace 解析器的 raw 样本(dropFailedSamples)",
133
- helpGroup: "解码与栈分析",
134
- },
135
12
  ];
136
- const PERF_INPUT_CONTEXT_KEY = "perf_input_file";
137
- /** 与 forkall 一致:输出根目录下中间文件目录名(含日志、hitrace、perf.data、hstack 产物等,不含 dump_stack*) */
138
- const WORKSPACE_SUBDIR = "workspace";
139
- function parseRiskTargets(rawValue) {
140
- if (!rawValue || rawValue.trim() === "" || rawValue.trim() === "all") {
141
- return [...DEFAULT_RISK_TARGETS];
142
- }
143
- const entries = rawValue
144
- .split(",")
145
- .map((item) => item.trim().toLowerCase())
146
- .filter(Boolean);
147
- if (entries.length === 0) {
148
- return [...DEFAULT_RISK_TARGETS];
149
- }
150
- const uniqueKeys = Array.from(new Set(entries));
151
- if (uniqueKeys.includes("all")) {
152
- return [...DEFAULT_RISK_TARGETS];
153
- }
154
- const invalidKeys = uniqueKeys.filter((key) => !(key in RISK_TARGET_DEFINITIONS));
155
- if (invalidKeys.length > 0) {
156
- throw new Error(`[风险抓取目标] 不支持的风险类型: ${invalidKeys.join(", ")}。可选值: all、${RISK_TARGETS_LABELLED_KEYS}`);
157
- }
158
- return uniqueKeys;
159
- }
160
- function parseTraceFrom(rawValue) {
161
- const normalized = (rawValue ?? "hitrace").trim().toLowerCase();
162
- if (!TRACE_FROM_VALUES.includes(normalized)) {
163
- throw new Error(`[--trace-from] 无效值: ${JSON.stringify(rawValue)}。可选: ${TRACE_FROM_VALUES.join("、")}`);
164
- }
165
- return normalized;
166
- }
167
- /** monitor 阶段「收集风险事件数据」shell 片段(不含 hdc shell 引号包裹) */
168
- function buildRiskCollectShellBody(input) {
169
- const { traceFrom, hitraceTags, bufferSize, duration, hiperfEvents, app, startAppCommand, } = input;
170
- const useHitrace = traceFrom === "hitrace" || traceFrom === "mix";
171
- const useHiperf = traceFrom === "hiperf" || traceFrom === "mix";
172
- const hiperfRawData = traceFrom === "hiperf" || traceFrom === "mix" ? " --raw-data" : "";
173
- const parts = [];
174
- if (useHitrace) {
175
- parts.push(`hitrace ${hitraceTags} --overwrite -b ${bufferSize} -t ${duration} -o /data/local/tmp/snapshot_hitrace.txt & `);
176
- }
177
- if (useHiperf) {
178
- parts.push(`hiperf record${hiperfRawData} -e ${hiperfEvents} --period 1 -s fp --clockid boottime --callchain-useronly --cpu-limit 100 -o /data/local/tmp/perf.data -p {{monitor_target}} -d ${duration} & `);
179
- }
180
- parts.push("sleep 1 && ");
181
- if (app) {
182
- parts.push(`${startAppCommand} && `);
183
- }
184
- parts.push("wait");
185
- if (useHiperf) {
186
- parts.push(" && hiperf dump -i /data/local/tmp/perf.data -o /data/local/tmp/snapshot_perf.data.txt");
187
- }
188
- return parts.join("");
189
- }
190
- function buildMonitorGroup(input) {
191
- const { hdcCli, logKey, bufferSize, duration, backgroundDelayMs, riskCollectWaitSec, app, snapshotLogFile, startAppCommand, checkStateCommand, riskTargets, traceFrom, } = input;
192
- const hitraceTags = [
193
- ...new Set(riskTargets.map((target) => target.hitraceTag)),
194
- ].join(" ");
195
- const hiperfEvents = riskTargets.map((target) => target.hiperfEvent).join(",");
196
- const riskCollectShellBody = buildRiskCollectShellBody({
197
- traceFrom,
198
- hitraceTags,
199
- bufferSize,
200
- duration,
201
- hiperfEvents,
202
- app,
203
- startAppCommand,
204
- });
205
- return [
206
- {
207
- kind: SHELL_PLATFORM_KINDS,
208
- description: "收集日志到本地",
209
- background: true,
210
- run: `${hdcCli.shell(`"hilog -t kmsg | grep ${logKey}"`)} >> ${snapshotLogFile}`,
211
- },
212
- ...(riskCollectWaitSec > 0
213
- ? [
214
- {
215
- kind: CommandKind.Embed,
216
- description: `等待 ${riskCollectWaitSec} 秒后开始收集风险事件数据`,
217
- run: `sleep ${riskCollectWaitSec}`,
218
- },
219
- ]
220
- : []),
221
- {
222
- kind: SHELL_PLATFORM_KINDS,
223
- run: hdcCli.shell("pidof apppool"),
224
- captureToVar: {
225
- name: "apppool_pids",
226
- },
227
- },
228
- {
229
- kind: CommandKind.Builtin,
230
- description: "提取 monitor_target",
231
- func: (ctx) => {
232
- const apppoolPids = ctx.get("apppool_pids");
233
- if (!apppoolPids) {
234
- logger.warn("[monitor] 无 apppool_pids,跳过");
235
- return false;
236
- }
237
- const monitorTarget = apppoolPids.split(/\s+/).join(",");
238
- ctx.set("monitor_target", monitorTarget);
239
- logger.info(`[monitor] target=${monitorTarget}`);
240
- },
241
- },
242
- {
243
- kind: SHELL_PLATFORM_KINDS,
244
- description: "在设备端输出操作提示并执行状态检测",
245
- background: true,
246
- backgroundDelayMs,
247
- run: hdcCli.shell(`"echo '=== 请按测试要求在设备上完成操作(以下为状态检测输出)===' && ${checkStateCommand}"`),
248
- },
249
- {
250
- kind: SHELL_PLATFORM_KINDS,
251
- description: "收集风险事件数据",
252
- run: `${hdcCli.prefix} shell "${riskCollectShellBody}"`,
253
- },
254
- ];
255
- }
256
- function buildAnalysisPreDecodeCommands(input) {
257
- const { snapshotPerfFile, parsedSnapshotPerfFile, hstackToolPathNormalized, perfTextDir, workspaceDirNormalized, sourcemapDirNormalized, } = input;
258
- return [
259
- ...(hstackToolPathNormalized
260
- ? [
261
- {
262
- kind: SHELL_PLATFORM_KINDS,
263
- description: "hstack 解析 perf",
264
- run: `${hstackToolPathNormalized} -i ${perfTextDir} -o ${workspaceDirNormalized} -s ${sourcemapDirNormalized}`,
265
- },
266
- ]
267
- : [
268
- {
269
- kind: CommandKind.Builtin,
270
- description: "无 hstack,跳过解析",
271
- func: () => {
272
- logger.warn("[hstack] 未配置,跳过解析");
273
- },
274
- },
275
- ]),
276
- {
277
- kind: CommandKind.Builtin,
278
- description: "选择 perf 输入",
279
- func: (ctx) => {
280
- const candidates = hstackToolPathNormalized
281
- ? [parsedSnapshotPerfFile, snapshotPerfFile]
282
- : [snapshotPerfFile];
283
- const { filePath, reason } = selectFirstValidPerfInput(candidates);
284
- if (!filePath) {
285
- logger.error(`[perf 输入] ${reason},中止`);
286
- return false;
287
- }
288
- ctx.set(PERF_INPUT_CONTEXT_KEY, filePath);
289
- logger.info(`[perf 输入] ${filePath}`);
290
- },
291
- },
292
- ];
293
- }
294
13
  /** 注入 init/monitor/collect/restore/filter/analysis 流水线及风险目标等派生命令 */
295
14
  export function applyOptions(ctx) {
296
- const { app = "", hstackToolPath = "", sourcemapDir = "", logKey = "pid", duration = "70", backtrackDelay = "80", riskCollectWait = "0", bufferSize = "512000", outputDir = "./output", traceFormatProfile = "default", riskTargets = "all", traceFrom: traceFromRaw = "hitrace", skipPerfDedupe = false, skipBacktrack = false, skipNonBacktrack = false, dropFailedSamples = false, hdcTarget, parseConcurrency: parseConcurrencyRaw, dryRun = false, list = false, } = ctx.options ?? {};
297
- const parseConcurrency = resolveParseConcurrency(parseConcurrencyRaw);
298
- const hdcCli = createHdcCli(hdcTarget);
299
- const traceFormatProfileNormalized = traceFormatProfile.trim();
300
- const backtrackDelaySec = Number(backtrackDelay);
301
- if (!Number.isFinite(backtrackDelaySec) || backtrackDelaySec < 0) {
302
- throw new Error(`[--backtrack-delay] 无效的秒数: ${JSON.stringify(backtrackDelay)},需为非负有限数值`);
303
- }
304
- const backgroundDelayMs = Math.round(backtrackDelaySec * 1000);
305
- const riskCollectWaitSec = Number(riskCollectWait);
306
- if (!Number.isFinite(riskCollectWaitSec) || riskCollectWaitSec < 0) {
307
- throw new Error(`[--risk-collect-wait] 无效的秒数: ${JSON.stringify(riskCollectWait)},需为非负有限数值`);
308
- }
309
- const checkStateCommand = "hidumper -s 1901 -a '-p libforkall_plugin.z.so --list'";
310
- const hstackToolPathNormalized = hstackToolPath
311
- ? path.normalize(hstackToolPath)
312
- : "";
313
- const sourcemapDirNormalized = sourcemapDir
314
- ? path.normalize(sourcemapDir)
315
- : "";
316
- const outputDirNormalized = normalizeCliOutputDir(outputDir);
317
- const workspaceDir = path.join(outputDirNormalized, WORKSPACE_SUBDIR);
318
- const workspaceDirNormalized = path.normalize(workspaceDir);
319
- const workspaceDirWithSep = ensureTrailingSeparator(workspaceDirNormalized);
320
- const perfTextDir = path.join(outputDirNormalized, "perf_txt");
321
- const perfTextDirNormalized = path.normalize(perfTextDir);
322
- const perfTextDirWithSep = ensureTrailingSeparator(perfTextDirNormalized);
323
- const traceFrom = parseTraceFrom(traceFromRaw);
324
- const selectedRiskTargets = parseRiskTargets(riskTargets).map((key) => RISK_TARGET_DEFINITIONS[key]);
325
- const runBacktrackFS = !skipBacktrack &&
326
- selectedRiskTargets.some((target) => target.key === "backtrack");
327
- const snapshotLogFile = path.join(workspaceDirNormalized, "snapshot_log.txt");
328
- const snapshotPerfFile = path.join(perfTextDirNormalized, "snapshot_perf.data.txt");
329
- const parsedSnapshotPerfFile = path.join(workspaceDirNormalized, "_snapshot_perf.data.txt");
330
- const dumpStackTxt = path.join(outputDirNormalized, "dump_stack.txt");
331
- const dumpStackJson = path.join(outputDirNormalized, "dump_stack.json");
332
- const dumpStackXlsx = path.join(outputDirNormalized, "dump_stack.xlsx");
333
- const start_app_command = `hidumper -s 1901 -a '-p libforkall_plugin.z.so --create 100 ${app}'`;
334
- if (!dryRun && !list) {
335
- if (!existsSync(outputDirNormalized)) {
336
- mkdirSync(outputDirNormalized, { recursive: true });
337
- }
338
- if (!existsSync(workspaceDirNormalized)) {
339
- mkdirSync(workspaceDirNormalized, { recursive: true });
340
- }
341
- if (!existsSync(perfTextDirNormalized)) {
342
- mkdirSync(perfTextDirNormalized, { recursive: true });
343
- }
344
- }
345
- const initEnvGroup = buildCommonInitEnvGroup({
346
- app,
347
- snapshotLogFile,
348
- checkStateCommand,
349
- hdc: hdcCli,
350
- });
351
- const monitorGroup = buildMonitorGroup({
352
- hdcCli,
353
- logKey,
354
- bufferSize,
355
- duration,
356
- backgroundDelayMs,
357
- riskCollectWaitSec,
358
- app,
359
- snapshotLogFile,
360
- startAppCommand: start_app_command,
361
- checkStateCommand,
362
- riskTargets: selectedRiskTargets,
363
- traceFrom,
364
- });
365
- const collectGroup = buildCommonCollectGroup({
366
- checkStateCommand,
367
- snapshotPerfReceiveDirWithSep: perfTextDirWithSep,
368
- outputDirWithSep: workspaceDirWithSep,
369
- hdc: hdcCli,
370
- });
371
- const filterGroup = buildCommonAnalysisTargetFilterGroup({
372
- app,
373
- snapshotPerfFile,
374
- writeBacktraceStacks: true,
375
- hdc: hdcCli,
376
- });
377
- const analysisGroup = buildCommonAnalysisGroup({
378
- preDecodeCommands: buildAnalysisPreDecodeCommands({
379
- snapshotPerfFile,
380
- parsedSnapshotPerfFile,
381
- hstackToolPathNormalized,
382
- perfTextDir: perfTextDirNormalized,
383
- workspaceDirNormalized,
384
- sourcemapDirNormalized,
385
- }),
386
- decodeInput: { inputContextKey: PERF_INPUT_CONTEXT_KEY },
387
- dumpStackTxt,
388
- dumpStackJson,
389
- dumpStackXlsx,
390
- traceFormatProfile,
391
- decodeStageName: "风险栈解码",
392
- missingInputMessage: "[风险栈解码] 无 perf 输入,跳过",
393
- skipDedupePerfData: skipPerfDedupe,
394
- runBacktrackFS,
395
- skipNonBacktrack,
396
- dropFailedSamples,
397
- parseConcurrency,
398
- traceFormatAuto: traceFormatProfileNormalized === AUTO_TRACE_FORMAT_PROFILE
399
- ? {
400
- hdcCli,
401
- formatPaths: selectedRiskTargets.map((target) => target.formatPath),
402
- }
403
- : undefined,
404
- });
405
- const restoreEnvGroup = buildCommonRestoreEnvGroup({ hdc: hdcCli });
406
- if (!list) {
407
- logger.info(`[trace-from] ${traceFrom}`);
408
- logger.info(`[风险目标] ${selectedRiskTargets.map((target) => target.displayName).join("、")}`);
409
- logger.info(`[backtrack] ${!runBacktrackFS
410
- ? "跳过"
411
- : skipNonBacktrack
412
- ? "仅 FS revoked"
413
- : "保留非 FS revoked"}`);
414
- }
415
- const resultGroups = {
416
- init: initEnvGroup,
417
- monitor: monitorGroup,
418
- collect: collectGroup,
419
- filter: filterGroup,
420
- analysis: analysisGroup,
421
- restore: restoreEnvGroup,
422
- };
423
- const order = [
424
- "init",
425
- "monitor",
426
- "collect",
427
- "restore",
428
- "filter",
429
- "analysis",
430
- ];
431
- return {
432
- groups: resultGroups,
433
- defaultGroupOrder: order,
434
- };
15
+ return applyReportScenarioOptions(ctx, "full");
435
16
  }
436
17
  //# sourceMappingURL=report.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../commands/report.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,cAAc,GACf,MAAM,+BAA+B,CAAC;AAEvC,wCAAwC;AACxC,MAAM,CAAC,MAAM,MAAM,GAAW,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,iBAAiB,GAAa,CAAC,GAAG,0BAA0B,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,cAAc;IACjB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,uEAAuE;QACzE,SAAS,EAAE,QAAQ;KACpB;CACF,CAAC;AAEF,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,GAI5B;IACC,OAAO,0BAA0B,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"timeout-demo.d.ts","sourceRoot":"","sources":["../../demos/timeout-demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,MAAM,EACZ,MAAM,iBAAiB,CAAC;AASzB,eAAO,MAAM,MAAM,EAAE,MAyBpB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAAsB,CAAC"}
1
+ {"version":3,"file":"timeout-demo.d.ts","sourceRoot":"","sources":["../../demos/timeout-demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AASnF,eAAO,MAAM,MAAM,EAAE,MAyBpB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAAsB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { CommandKind, getCurrentPlatformKind, } from "../src/types.js";
1
+ import { CommandKind, getCurrentPlatformKind } from "../src/types.js";
2
2
  /**
3
3
  * 内置 `embed`:`timeout` / `timieout`(TTY 下任意键跳过);参见 README 内建指令章节与 `EmbedCommandRunner`。
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"timeout-demo.js","sourceRoot":"","sources":["../../demos/timeout-demo.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,sBAAsB,GAEvB,MAAM,iBAAiB,CAAC;AAEzB;;;;GAIG;AACH,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;AAEtC,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,WAAW,CAAC,KAAK;YACvB,WAAW,EAAE,2BAA2B;YACxC,GAAG,EAAE,YAAY;SAClB;KACF;IACD,SAAS,EAAE;QACT;YACE,IAAI,EAAE,WAAW,CAAC,KAAK;YACvB,WAAW,EAAE,uBAAuB;YACpC,GAAG,EAAE,YAAY;SAClB;KACF;IACD,KAAK,EAAE;QACL;YACE,IAAI;YACJ,WAAW,EAAE,eAAe;YAC5B,GAAG,EACD,IAAI,KAAK,WAAW,CAAC,OAAO;gBAC1B,CAAC,CAAC,+BAA+B;gBACjC,CAAC,CAAC,iCAAiC;SACxC;KACF;CACF,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"timeout-demo.js","sourceRoot":"","sources":["../../demos/timeout-demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAe,MAAM,iBAAiB,CAAC;AAEnF;;;;GAIG;AACH,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;AAEtC,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,WAAW,CAAC,KAAK;YACvB,WAAW,EAAE,2BAA2B;YACxC,GAAG,EAAE,YAAY;SAClB;KACF;IACD,SAAS,EAAE;QACT;YACE,IAAI,EAAE,WAAW,CAAC,KAAK;YACvB,WAAW,EAAE,uBAAuB;YACpC,GAAG,EAAE,YAAY;SAClB;KACF;IACD,KAAK,EAAE;QACL;YACE,IAAI;YACJ,WAAW,EAAE,eAAe;YAC5B,GAAG,EACD,IAAI,KAAK,WAAW,CAAC,OAAO;gBAC1B,CAAC,CAAC,+BAA+B;gBACjC,CAAC,CAAC,iCAAiC;SACxC;KACF;CACF,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env node
2
+ import { program } from "commander";
3
+ import { resolveScenario, runScenarioGroups } from "./lib/programmatic.js";
4
+ import { runBinaryPreflight } from "./lib/preflight.js";
5
+ import * as reportScenario from "../commands/report.js";
6
+ function registerScenarioCommand(name, description, scenario) {
7
+ const cmd = program
8
+ .command(name)
9
+ .description(description)
10
+ .option("-g, --group <specs...>", "指定 group(支持 group 或 group:N)")
11
+ .option("--stop-on-error", "命令失败时终止后续执行")
12
+ .option("-s, --silent", "减少输出")
13
+ .option("--wait", "等待后台进程结束再退出")
14
+ .option("--ignore-platform", "忽略命令平台限制")
15
+ .option("-i, --interval <ms>", "组命令执行间隔(毫秒)", "0");
16
+ for (const option of scenario.options ?? []) {
17
+ if (option.defaultValue !== undefined) {
18
+ cmd.option(option.flags, option.description ?? "", option.defaultValue);
19
+ }
20
+ else {
21
+ cmd.option(option.flags, option.description ?? "");
22
+ }
23
+ }
24
+ cmd.action(async (opts) => {
25
+ const intervalRaw = String(opts.interval ?? "0");
26
+ const intervalMs = Math.max(0, Number.parseInt(intervalRaw, 10) || 0);
27
+ const { groups, defaultGroupOrder } = resolveScenario(scenario, opts);
28
+ const { failed } = await runScenarioGroups({
29
+ groups,
30
+ defaultGroupOrder,
31
+ group: opts.group,
32
+ stopOnError: opts.stopOnError === true,
33
+ silent: opts.silent === true,
34
+ waitForBackground: opts.wait === true,
35
+ ignorePlatform: opts.ignorePlatform === true,
36
+ intervalMs: intervalMs > 0 ? intervalMs : undefined,
37
+ });
38
+ if (failed) {
39
+ process.exitCode = 1;
40
+ }
41
+ });
42
+ }
43
+ async function main() {
44
+ runBinaryPreflight();
45
+ program
46
+ .name("snapshot-checker")
47
+ .description("snapshot-checker 二进制入口")
48
+ .version("0.1.3");
49
+ registerScenarioCommand("report", "运行 report 场景", reportScenario);
50
+ await program.parseAsync(process.argv);
51
+ }
52
+ main().catch((error) => {
53
+ const message = error instanceof Error ? error.message : String(error);
54
+ console.error(message);
55
+ process.exitCode = 1;
56
+ });
57
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":"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"}