探针输出格式
🌐 Probe output format
当探测会话结束时,探测过程会打印所有探测命中和结果的最终报告。
🌐 When the probe session ends, the probing process prints a final report of all the probe hits and results.
考虑这个脚本:
🌐 Consider this script:
// cli.js
let maxRSS = 0;
for (let i = 0; i < 2; i++) {
const { rss } = process.memoryUsage();
maxRSS = Math.max(maxRSS, rss);
} 没有 --json,默认情况下输出将以人类可读的文本格式打印:
🌐 Without --json, by default the output is printed in a human-readable text format:
$ node inspect --probe cli.js:5 --expr 'rss' cli.js
Hit 1 at file:///path/to/cli.js:5:3
rss = 54935552
Hit 2 at file:///path/to/cli.js:5:3
rss = 55083008
Completed 传递给 --probe 的原始 <file>:<line>[:<col>] 可能会被解析到不同的位置以确保它可暂停,或者它可以匹配多个已加载的脚本,因此实际的评估位置有助于消除结果的歧义。
原始结果会直接打印,而对象和数组在可用时会使用 Chrome 开发者工具协议预览数据。其他非原始值会回退到 Chrome 开发者工具协议 description 字符串。表达式失败会记录为 [error] ... 行,并且不会导致整体会话失败。如果需要更丰富的文本格式,可以将表达式封装在 JSON.stringify(...) 或 util.inspect(...) 中。
🌐 Primitive results are printed directly, while objects and arrays use Chrome
DevTools Protocol preview data when available. Other non-primitive values
fall back to the Chrome DevTools Protocol description string.
Expression failures are recorded as [error] ... lines and do not fail
the overall session. If richer text formatting is needed, wrap the expression
in JSON.stringify(...) or util.inspect(...).
当使用 --json 时,输出形状如下:
🌐 When --json is used, the output shape looks like this:
$ node inspect --json --probe cli.js:5 --expr 'rss' cli.js
{"v":2,"probes":[{"expr":"rss","target":{"suffix":"cli.js","line":5}}],"results":[{"probe":0,"event":"hit","hit":1,"location":{"url":"file:///path/to/cli.js","line":5,"column":3},"result":{"type":"number","value":55443456,"description":"55443456"}},{"probe":0,"event":"hit","hit":2,"location":{"url":"file:///path/to/cli.js","line":5,"column":3},"result":{"type":"number","value":55574528,"description":"55574528"}},{"event":"completed"}]} {
"v": 2, // Probe JSON schema version.
"probes": [
{
"expr": "rss", // The expression paired with --probe.
"target": {
// The user's probe specification. `suffix` is the raw <file> passed
// to --probe and is matched as a path-separator-anchored suffix
// against every loaded script's URL. `column` is present only if the
// user supplied `:col`. The actual evaluation location may differ
// from the target and will be reported in each hit's `location` field.
"suffix": "cli.js",
"line": 5
}
}
],
"results": [
{
"probe": 0, // Index into probes[].
"event": "hit", // Hit events are recorded in observation order.
"hit": 1, // 1-based hit count for this probe.
"location": {
// The actual location where the execution is paused to evaluate
// the expression of the probe. This may differ from the probe's
// target due to pausability adjustments or multiple matches.
"url": "file:///path/to/cli.js",
"line": 5,
"column": 3
},
"result": {
"type": "number",
"value": 55443456,
"description": "55443456"
}
// If the expression throws, "error" is present instead of "result".
},
{
"probe": 0,
"event": "hit",
"hit": 2,
"location": { "url": "file:///path/to/cli.js", "line": 5, "column": 3 },
"result": {
"type": "number",
"value": 55574528,
"description": "55574528"
}
},
{
"event": "completed"
// The final entry is always a terminal event, for example:
// 1. { "event": "completed" }
// 2. { "event": "miss", "pending": [0, 1] }
// 3. {
// "event": "timeout",
// "pending": [0],
// "error": {
// "code": "probe_timeout",
// "message": "Timed out after 30000ms waiting for probes: app.js:10"
// }
// }
// 4. {
// "event": "error",
// "pending": [0],
// "error": {
// "code": "probe_target_exit",
// "exitCode": 1,
// "stderr": "[Error: boom]",
// "message": "Target exited with code 1 before probes: app.js:10"
// }
// }
}
]
}