snapshot-checker 0.6.4 → 0.7.4
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 +203 -11
- package/dist/commands/forkall.d.ts.map +1 -1
- package/dist/commands/forkall.js +23 -16
- package/dist/commands/forkall.js.map +1 -1
- package/dist/commands/report-user.d.ts +25 -0
- package/dist/commands/report-user.d.ts.map +1 -0
- package/dist/commands/report-user.js +17 -0
- package/dist/commands/report-user.js.map +1 -0
- package/dist/commands/report.d.ts +1 -26
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +6 -417
- package/dist/commands/report.js.map +1 -1
- package/dist/demos/timeout-demo.d.ts.map +1 -1
- package/dist/demos/timeout-demo.js +1 -1
- package/dist/demos/timeout-demo.js.map +1 -1
- package/dist/src/bin.d.ts +3 -0
- package/dist/src/bin.d.ts.map +1 -0
- package/dist/src/bin.js +57 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/cli.js +28 -48
- package/dist/src/cli.js.map +1 -1
- package/dist/src/executor.d.ts +5 -5
- package/dist/src/executor.d.ts.map +1 -1
- package/dist/src/executor.js +3 -3
- package/dist/src/executor.js.map +1 -1
- package/dist/src/{groupSpecs.d.ts → group_specs.d.ts} +2 -2
- package/dist/src/group_specs.d.ts.map +1 -0
- package/dist/src/{groupSpecs.js → group_specs.js} +1 -1
- package/dist/src/group_specs.js.map +1 -0
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/format.d.ts +30 -0
- package/dist/src/lib/format.d.ts.map +1 -0
- package/dist/src/lib/format.js +76 -0
- package/dist/src/lib/format.js.map +1 -0
- package/dist/src/lib/{hostCommands.d.ts → host_commands.d.ts} +6 -1
- package/dist/src/lib/host_commands.d.ts.map +1 -0
- package/dist/src/lib/{hostCommands.js → host_commands.js} +9 -1
- package/dist/src/lib/host_commands.js.map +1 -0
- package/dist/src/lib/perf_decode.d.ts +25 -0
- package/dist/src/lib/perf_decode.d.ts.map +1 -0
- package/dist/src/lib/perf_decode.js +90 -0
- package/dist/src/lib/perf_decode.js.map +1 -0
- package/dist/src/lib/pipeline.d.ts +114 -0
- package/dist/src/lib/pipeline.d.ts.map +1 -0
- package/dist/src/lib/pipeline.js +312 -0
- package/dist/src/lib/pipeline.js.map +1 -0
- package/dist/src/lib/preflight.d.ts +2 -0
- package/dist/src/lib/preflight.d.ts.map +1 -0
- package/dist/src/lib/preflight.js +45 -0
- package/dist/src/lib/preflight.js.map +1 -0
- package/dist/src/lib/presets.d.ts +53 -27
- package/dist/src/lib/presets.d.ts.map +1 -1
- package/dist/src/lib/presets.js +196 -215
- package/dist/src/lib/presets.js.map +1 -1
- package/dist/src/lib/programmatic.d.ts +30 -0
- package/dist/src/lib/programmatic.d.ts.map +1 -0
- package/dist/src/lib/programmatic.js +40 -0
- package/dist/src/lib/programmatic.js.map +1 -0
- package/dist/src/lib/report_scenario.d.ts +50 -0
- package/dist/src/lib/report_scenario.d.ts.map +1 -0
- package/dist/src/lib/report_scenario.js +501 -0
- package/dist/src/lib/report_scenario.js.map +1 -0
- package/dist/src/lib/scenario.d.ts +1 -1
- package/dist/src/lib/scenario.d.ts.map +1 -1
- package/dist/src/lib/scenario.js +3 -4
- package/dist/src/lib/scenario.js.map +1 -1
- package/dist/src/lib/version.d.ts +12 -0
- package/dist/src/lib/version.d.ts.map +1 -0
- package/dist/src/lib/version.js +51 -0
- package/dist/src/lib/version.js.map +1 -0
- package/dist/src/logger.d.ts +31 -1
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/logger.js +182 -16
- package/dist/src/logger.js.map +1 -1
- package/dist/src/{runCommand.d.ts → run_command.d.ts} +1 -1
- package/dist/src/run_command.d.ts.map +1 -0
- package/dist/src/{runCommand.js → run_command.js} +5 -6
- package/dist/src/run_command.js.map +1 -0
- package/dist/src/{runGroups.d.ts → run_groups.d.ts} +12 -3
- package/dist/src/run_groups.d.ts.map +1 -0
- package/dist/src/{runGroups.js → run_groups.js} +28 -13
- package/dist/src/run_groups.js.map +1 -0
- package/dist/src/runners/{backgroundExecutor.d.ts → background_executor.d.ts} +3 -3
- package/dist/src/runners/background_executor.d.ts.map +1 -0
- package/dist/src/runners/{backgroundExecutor.js → background_executor.js} +3 -3
- package/dist/src/runners/background_executor.js.map +1 -0
- package/dist/src/runners/{builtinRunner.d.ts → builtin_runner.d.ts} +1 -1
- package/dist/src/runners/builtin_runner.d.ts.map +1 -0
- package/dist/src/runners/{builtinRunner.js → builtin_runner.js} +1 -1
- package/dist/src/runners/builtin_runner.js.map +1 -0
- package/dist/src/runners/{embedRunner.d.ts → embed_runner.d.ts} +1 -1
- package/dist/src/runners/embed_runner.d.ts.map +1 -0
- package/dist/src/runners/{embedRunner.js → embed_runner.js} +2 -2
- package/dist/src/runners/{embedRunner.js.map → embed_runner.js.map} +1 -1
- package/dist/src/runners/index.d.ts +5 -5
- package/dist/src/runners/index.d.ts.map +1 -1
- package/dist/src/runners/index.js +4 -4
- package/dist/src/runners/index.js.map +1 -1
- package/dist/src/runners/{platformShellExecutor.d.ts → platform_shell_executor.d.ts} +1 -1
- package/dist/src/runners/platform_shell_executor.d.ts.map +1 -0
- package/dist/src/runners/{platformShellExecutor.js → platform_shell_executor.js} +2 -2
- package/dist/src/runners/platform_shell_executor.js.map +1 -0
- package/dist/src/runners/{shellRunner.d.ts → shell_runner.d.ts} +1 -1
- package/dist/src/runners/shell_runner.d.ts.map +1 -0
- package/dist/src/runners/{shellRunner.js → shell_runner.js} +11 -16
- package/dist/src/runners/shell_runner.js.map +1 -0
- package/dist/src/runners/types.d.ts.map +1 -1
- package/dist/src/types.d.ts +2 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/package.json +13 -4
- package/dist/src/groupSpecs.d.ts.map +0 -1
- package/dist/src/groupSpecs.js.map +0 -1
- package/dist/src/lib/hostCommands.d.ts.map +0 -1
- package/dist/src/lib/hostCommands.js.map +0 -1
- package/dist/src/runCommand.d.ts.map +0 -1
- package/dist/src/runCommand.js.map +0 -1
- package/dist/src/runGroups.d.ts.map +0 -1
- package/dist/src/runGroups.js.map +0 -1
- package/dist/src/runners/backgroundExecutor.d.ts.map +0 -1
- package/dist/src/runners/backgroundExecutor.js.map +0 -1
- package/dist/src/runners/builtinRunner.d.ts.map +0 -1
- package/dist/src/runners/builtinRunner.js.map +0 -1
- package/dist/src/runners/embedRunner.d.ts.map +0 -1
- package/dist/src/runners/platformShellExecutor.d.ts.map +0 -1
- package/dist/src/runners/platformShellExecutor.js.map +0 -1
- package/dist/src/runners/shellRunner.d.ts.map +0 -1
- package/dist/src/runners/shellRunner.js.map +0 -1
package/dist/commands/report.js
CHANGED
|
@@ -1,428 +1,17 @@
|
|
|
1
|
-
import {
|
|
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 = "hiperf record 是否带 --raw-data:hitrace(默认,不带)、hiperf / mix(带);与 --trace-format-profile 无关";
|
|
4
|
+
export const defaultGroupOrder = [...REPORT_DEFAULT_GROUP_ORDER];
|
|
45
5
|
export const options = [
|
|
6
|
+
...REPORT_OPTIONS,
|
|
46
7
|
{
|
|
47
|
-
flags: "--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 hiperfRawData = traceFrom === "hiperf" || traceFrom === "mix" ? " --raw-data" : "";
|
|
171
|
-
const parts = [
|
|
172
|
-
`hitrace ${hitraceTags} --overwrite -b ${bufferSize} -t ${duration} -o /data/local/tmp/snapshot_hitrace.txt & `,
|
|
173
|
-
`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} & `,
|
|
174
|
-
"sleep 1 && ",
|
|
175
|
-
];
|
|
176
|
-
if (app) {
|
|
177
|
-
parts.push(`${startAppCommand} && `);
|
|
178
|
-
}
|
|
179
|
-
parts.push("wait && hiperf dump -i /data/local/tmp/perf.data -o /data/local/tmp/snapshot_perf.data.txt");
|
|
180
|
-
return parts.join("");
|
|
181
|
-
}
|
|
182
|
-
function buildMonitorGroup(input) {
|
|
183
|
-
const { hdcCli, logKey, bufferSize, duration, backgroundDelayMs, riskCollectWaitSec, app, snapshotLogFile, startAppCommand, checkStateCommand, riskTargets, traceFrom, } = input;
|
|
184
|
-
const hitraceTags = [
|
|
185
|
-
...new Set(riskTargets.map((target) => target.hitraceTag)),
|
|
186
|
-
].join(" ");
|
|
187
|
-
const hiperfEvents = riskTargets.map((target) => target.hiperfEvent).join(",");
|
|
188
|
-
const riskCollectShellBody = buildRiskCollectShellBody({
|
|
189
|
-
traceFrom,
|
|
190
|
-
hitraceTags,
|
|
191
|
-
bufferSize,
|
|
192
|
-
duration,
|
|
193
|
-
hiperfEvents,
|
|
194
|
-
app,
|
|
195
|
-
startAppCommand,
|
|
196
|
-
});
|
|
197
|
-
return [
|
|
198
|
-
{
|
|
199
|
-
kind: SHELL_PLATFORM_KINDS,
|
|
200
|
-
description: "收集日志到本地",
|
|
201
|
-
background: true,
|
|
202
|
-
run: `${hdcCli.shell(`"hilog -t kmsg | grep ${logKey}"`)} >> ${snapshotLogFile}`,
|
|
203
|
-
},
|
|
204
|
-
...(riskCollectWaitSec > 0
|
|
205
|
-
? [
|
|
206
|
-
{
|
|
207
|
-
kind: CommandKind.Embed,
|
|
208
|
-
description: `等待 ${riskCollectWaitSec} 秒后开始收集风险事件数据`,
|
|
209
|
-
run: `sleep ${riskCollectWaitSec}`,
|
|
210
|
-
},
|
|
211
|
-
]
|
|
212
|
-
: []),
|
|
213
|
-
{
|
|
214
|
-
kind: SHELL_PLATFORM_KINDS,
|
|
215
|
-
run: hdcCli.shell("pidof apppool"),
|
|
216
|
-
captureToVar: {
|
|
217
|
-
name: "apppool_pids",
|
|
218
|
-
},
|
|
219
|
-
},
|
|
220
|
-
{
|
|
221
|
-
kind: CommandKind.Builtin,
|
|
222
|
-
description: "提取 monitor_target",
|
|
223
|
-
func: (ctx) => {
|
|
224
|
-
const apppoolPids = ctx.get("apppool_pids");
|
|
225
|
-
if (!apppoolPids) {
|
|
226
|
-
logger.warn("[monitor] 无 apppool_pids,跳过");
|
|
227
|
-
return false;
|
|
228
|
-
}
|
|
229
|
-
const monitorTarget = apppoolPids.split(/\s+/).join(",");
|
|
230
|
-
ctx.set("monitor_target", monitorTarget);
|
|
231
|
-
logger.info(`[monitor] target=${monitorTarget}`);
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
kind: SHELL_PLATFORM_KINDS,
|
|
236
|
-
description: "在设备端输出操作提示并执行状态检测",
|
|
237
|
-
background: true,
|
|
238
|
-
backgroundDelayMs,
|
|
239
|
-
run: hdcCli.shell(`"echo '=== 请按测试要求在设备上完成操作(以下为状态检测输出)===' && ${checkStateCommand}"`),
|
|
240
|
-
},
|
|
241
|
-
{
|
|
242
|
-
kind: SHELL_PLATFORM_KINDS,
|
|
243
|
-
description: "收集风险事件数据",
|
|
244
|
-
run: `${hdcCli.prefix} shell "${riskCollectShellBody}"`,
|
|
245
|
-
},
|
|
246
|
-
];
|
|
247
|
-
}
|
|
248
|
-
function buildAnalysisPreDecodeCommands(input) {
|
|
249
|
-
const { snapshotPerfFile, parsedSnapshotPerfFile, hstackToolPathNormalized, perfTextDir, workspaceDirNormalized, sourcemapDirNormalized, } = input;
|
|
250
|
-
return [
|
|
251
|
-
...(hstackToolPathNormalized
|
|
252
|
-
? [
|
|
253
|
-
{
|
|
254
|
-
kind: SHELL_PLATFORM_KINDS,
|
|
255
|
-
description: "hstack 解析 perf",
|
|
256
|
-
run: `${hstackToolPathNormalized} -i ${perfTextDir} -o ${workspaceDirNormalized} -s ${sourcemapDirNormalized}`,
|
|
257
|
-
},
|
|
258
|
-
]
|
|
259
|
-
: [
|
|
260
|
-
{
|
|
261
|
-
kind: CommandKind.Builtin,
|
|
262
|
-
description: "无 hstack,跳过解析",
|
|
263
|
-
func: () => {
|
|
264
|
-
logger.warn("[hstack] 未配置,跳过解析");
|
|
265
|
-
},
|
|
266
|
-
},
|
|
267
|
-
]),
|
|
268
|
-
{
|
|
269
|
-
kind: CommandKind.Builtin,
|
|
270
|
-
description: "选择 perf 输入",
|
|
271
|
-
func: (ctx) => {
|
|
272
|
-
const candidates = hstackToolPathNormalized
|
|
273
|
-
? [parsedSnapshotPerfFile, snapshotPerfFile]
|
|
274
|
-
: [snapshotPerfFile];
|
|
275
|
-
const { filePath, reason } = selectFirstValidPerfInput(candidates);
|
|
276
|
-
if (!filePath) {
|
|
277
|
-
logger.error(`[perf 输入] ${reason},中止`);
|
|
278
|
-
return false;
|
|
279
|
-
}
|
|
280
|
-
ctx.set(PERF_INPUT_CONTEXT_KEY, filePath);
|
|
281
|
-
logger.info(`[perf 输入] ${filePath}`);
|
|
282
|
-
},
|
|
283
|
-
},
|
|
284
|
-
];
|
|
285
|
-
}
|
|
286
13
|
/** 注入 init/monitor/collect/restore/filter/analysis 流水线及风险目标等派生命令 */
|
|
287
14
|
export function applyOptions(ctx) {
|
|
288
|
-
|
|
289
|
-
const parseConcurrency = resolveParseConcurrency(parseConcurrencyRaw);
|
|
290
|
-
const hdcCli = createHdcCli(hdcTarget);
|
|
291
|
-
const traceFormatProfileNormalized = traceFormatProfile.trim();
|
|
292
|
-
const backtrackDelaySec = Number(backtrackDelay);
|
|
293
|
-
if (!Number.isFinite(backtrackDelaySec) || backtrackDelaySec < 0) {
|
|
294
|
-
throw new Error(`[--backtrack-delay] 无效的秒数: ${JSON.stringify(backtrackDelay)},需为非负有限数值`);
|
|
295
|
-
}
|
|
296
|
-
const backgroundDelayMs = Math.round(backtrackDelaySec * 1000);
|
|
297
|
-
const riskCollectWaitSec = Number(riskCollectWait);
|
|
298
|
-
if (!Number.isFinite(riskCollectWaitSec) || riskCollectWaitSec < 0) {
|
|
299
|
-
throw new Error(`[--risk-collect-wait] 无效的秒数: ${JSON.stringify(riskCollectWait)},需为非负有限数值`);
|
|
300
|
-
}
|
|
301
|
-
const checkStateCommand = "hidumper -s 1901 -a '-p libforkall_plugin.z.so --list'";
|
|
302
|
-
const hstackToolPathNormalized = hstackToolPath
|
|
303
|
-
? path.normalize(hstackToolPath)
|
|
304
|
-
: "";
|
|
305
|
-
const sourcemapDirNormalized = sourcemapDir
|
|
306
|
-
? path.normalize(sourcemapDir)
|
|
307
|
-
: "";
|
|
308
|
-
const outputDirNormalized = normalizeCliOutputDir(outputDir);
|
|
309
|
-
const workspaceDir = path.join(outputDirNormalized, WORKSPACE_SUBDIR);
|
|
310
|
-
const workspaceDirNormalized = path.normalize(workspaceDir);
|
|
311
|
-
const workspaceDirWithSep = ensureTrailingSeparator(workspaceDirNormalized);
|
|
312
|
-
const perfTextDir = path.join(outputDirNormalized, "perf_txt");
|
|
313
|
-
const perfTextDirNormalized = path.normalize(perfTextDir);
|
|
314
|
-
const perfTextDirWithSep = ensureTrailingSeparator(perfTextDirNormalized);
|
|
315
|
-
const traceFrom = parseTraceFrom(traceFromRaw);
|
|
316
|
-
const selectedRiskTargets = parseRiskTargets(riskTargets).map((key) => RISK_TARGET_DEFINITIONS[key]);
|
|
317
|
-
const runBacktrackFS = !skipBacktrack &&
|
|
318
|
-
selectedRiskTargets.some((target) => target.key === "backtrack");
|
|
319
|
-
const snapshotLogFile = path.join(workspaceDirNormalized, "snapshot_log.txt");
|
|
320
|
-
const snapshotPerfFile = path.join(perfTextDirNormalized, "snapshot_perf.data.txt");
|
|
321
|
-
const parsedSnapshotPerfFile = path.join(workspaceDirNormalized, "_snapshot_perf.data.txt");
|
|
322
|
-
const dumpStackTxt = path.join(outputDirNormalized, "dump_stack.txt");
|
|
323
|
-
const dumpStackJson = path.join(outputDirNormalized, "dump_stack.json");
|
|
324
|
-
const dumpStackXlsx = path.join(outputDirNormalized, "dump_stack.xlsx");
|
|
325
|
-
const start_app_command = `hidumper -s 1901 -a '-p libforkall_plugin.z.so --create 100 ${app}'`;
|
|
326
|
-
if (!dryRun && !list) {
|
|
327
|
-
if (!existsSync(outputDirNormalized)) {
|
|
328
|
-
mkdirSync(outputDirNormalized, { recursive: true });
|
|
329
|
-
}
|
|
330
|
-
if (!existsSync(workspaceDirNormalized)) {
|
|
331
|
-
mkdirSync(workspaceDirNormalized, { recursive: true });
|
|
332
|
-
}
|
|
333
|
-
if (!existsSync(perfTextDirNormalized)) {
|
|
334
|
-
mkdirSync(perfTextDirNormalized, { recursive: true });
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
const initEnvGroup = buildCommonInitEnvGroup({
|
|
338
|
-
app,
|
|
339
|
-
snapshotLogFile,
|
|
340
|
-
checkStateCommand,
|
|
341
|
-
hdc: hdcCli,
|
|
342
|
-
});
|
|
343
|
-
const monitorGroup = buildMonitorGroup({
|
|
344
|
-
hdcCli,
|
|
345
|
-
logKey,
|
|
346
|
-
bufferSize,
|
|
347
|
-
duration,
|
|
348
|
-
backgroundDelayMs,
|
|
349
|
-
riskCollectWaitSec,
|
|
350
|
-
app,
|
|
351
|
-
snapshotLogFile,
|
|
352
|
-
startAppCommand: start_app_command,
|
|
353
|
-
checkStateCommand,
|
|
354
|
-
riskTargets: selectedRiskTargets,
|
|
355
|
-
traceFrom,
|
|
356
|
-
});
|
|
357
|
-
const collectGroup = buildCommonCollectGroup({
|
|
358
|
-
checkStateCommand,
|
|
359
|
-
snapshotPerfReceiveDirWithSep: perfTextDirWithSep,
|
|
360
|
-
outputDirWithSep: workspaceDirWithSep,
|
|
361
|
-
hdc: hdcCli,
|
|
362
|
-
});
|
|
363
|
-
const filterGroup = buildCommonAnalysisTargetFilterGroup({
|
|
364
|
-
app,
|
|
365
|
-
snapshotPerfFile,
|
|
366
|
-
writeBacktraceStacks: true,
|
|
367
|
-
hdc: hdcCli,
|
|
368
|
-
});
|
|
369
|
-
const analysisGroup = buildCommonAnalysisGroup({
|
|
370
|
-
preDecodeCommands: buildAnalysisPreDecodeCommands({
|
|
371
|
-
snapshotPerfFile,
|
|
372
|
-
parsedSnapshotPerfFile,
|
|
373
|
-
hstackToolPathNormalized,
|
|
374
|
-
perfTextDir: perfTextDirNormalized,
|
|
375
|
-
workspaceDirNormalized,
|
|
376
|
-
sourcemapDirNormalized,
|
|
377
|
-
}),
|
|
378
|
-
decodeInput: { inputContextKey: PERF_INPUT_CONTEXT_KEY },
|
|
379
|
-
dumpStackTxt,
|
|
380
|
-
dumpStackJson,
|
|
381
|
-
dumpStackXlsx,
|
|
382
|
-
traceFormatProfile,
|
|
383
|
-
decodeStageName: "风险栈解码",
|
|
384
|
-
missingInputMessage: "[风险栈解码] 无 perf 输入,跳过",
|
|
385
|
-
skipDedupePerfData: skipPerfDedupe,
|
|
386
|
-
runBacktrackFS,
|
|
387
|
-
skipNonBacktrack,
|
|
388
|
-
dropFailedSamples,
|
|
389
|
-
parseConcurrency,
|
|
390
|
-
traceFormatAuto: traceFormatProfileNormalized === AUTO_TRACE_FORMAT_PROFILE
|
|
391
|
-
? {
|
|
392
|
-
hdcCli,
|
|
393
|
-
formatPaths: selectedRiskTargets.map((target) => target.formatPath),
|
|
394
|
-
}
|
|
395
|
-
: undefined,
|
|
396
|
-
});
|
|
397
|
-
const restoreEnvGroup = buildCommonRestoreEnvGroup({ hdc: hdcCli });
|
|
398
|
-
if (!list) {
|
|
399
|
-
logger.info(`[trace-from] ${traceFrom}`);
|
|
400
|
-
logger.info(`[风险目标] ${selectedRiskTargets.map((target) => target.displayName).join("、")}`);
|
|
401
|
-
logger.info(`[backtrack] ${!runBacktrackFS
|
|
402
|
-
? "跳过"
|
|
403
|
-
: skipNonBacktrack
|
|
404
|
-
? "仅 FS revoked"
|
|
405
|
-
: "保留非 FS revoked"}`);
|
|
406
|
-
}
|
|
407
|
-
const resultGroups = {
|
|
408
|
-
init: initEnvGroup,
|
|
409
|
-
monitor: monitorGroup,
|
|
410
|
-
collect: collectGroup,
|
|
411
|
-
filter: filterGroup,
|
|
412
|
-
analysis: analysisGroup,
|
|
413
|
-
restore: restoreEnvGroup,
|
|
414
|
-
};
|
|
415
|
-
const order = [
|
|
416
|
-
"init",
|
|
417
|
-
"monitor",
|
|
418
|
-
"collect",
|
|
419
|
-
"restore",
|
|
420
|
-
"filter",
|
|
421
|
-
"analysis",
|
|
422
|
-
];
|
|
423
|
-
return {
|
|
424
|
-
groups: resultGroups,
|
|
425
|
-
defaultGroupOrder: order,
|
|
426
|
-
};
|
|
15
|
+
return applyReportScenarioOptions(ctx, "full");
|
|
427
16
|
}
|
|
428
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,
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeout-demo.js","sourceRoot":"","sources":["../../demos/timeout-demo.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/src/bin.js
ADDED
|
@@ -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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"}
|