Files
node/test/parallel/test-debugger-probe-cond-invalid.js
T
Joyee Cheung 8c6cbb8e0a inspector: add --cond to node inspect probe mode
On a hot path, the probe can record every hit and require
filtering afterwards. This patch adds a per-probe `--cond <expr>`
option that allows limiting the hit to only when the expression
is truthy at the probe location. V8 evaluates it as the breakpoint's
native condition, so the target is not paused when it does not hold,
and a condition that throws is treated as false. Since in CDP,
a location can only carry one breakpoint per URL pattern,
probes sharing a location must share one condition (or none).
Conflicting conditions are rejected.

Example:

```js
// app.js
let total = 0;
for (let i = 0; i < 10; i++) {
  total += i;  // line 4
}
```

```
$ out/Release/node inspect --probe app.js:4 --expr 'total' \
                           --cond 'i % 3 === 0' app.js
```

```
Hit 1 at file:///path/to/app.js:3:3
  total = 0
Hit 2 at file:///path/to/app.js:3:3
  total = 3
Hit 3 at file:///path/to/app.js:3:3
  total = 15
Hit 4 at file:///path/to/app.js:3:3
  total = 36
Completed
```

Signed-off-by: Joyee Cheung <joyeec9h3@gmail.com>
PR-URL: https://github.com/nodejs/node/pull/64328
Refs: https://github.com/nodejs/node/issues/63646
Reviewed-By: James M Snell <jasnell@gmail.com>
2026-07-13 17:00:51 +00:00

41 lines
1.5 KiB
JavaScript

// This tests that probe mode rejects malformed --cond usage.
'use strict';
const common = require('../common');
common.skipIfInspectorDisabled();
const fixtures = require('../common/fixtures');
const { assertProbeCliError } = require('../common/debugger-probe');
const cwd = fixtures.path('debugger');
assertProbeCliError(
['--cond', 'x', '--probe', 'probe.js:12', '--expr', 'finalValue', 'probe.js'],
/Unexpected --cond before --probe/, { cwd });
assertProbeCliError(
['--probe', 'probe.js:12', '--cond', 'x', '--expr', 'finalValue', 'probe.js'],
/Each --probe must be followed immediately by --expr/, { cwd });
assertProbeCliError(
['--probe', 'probe.js:12', '--expr', 'finalValue', '--cond', 'x', '--cond', 'y', 'probe.js'],
/A --probe can have at most one --cond/, { cwd });
assertProbeCliError(
['--probe', 'probe.js:12', '--expr', 'finalValue', '--cond', ' ', 'probe.js'],
/Missing value for --cond/, { cwd });
assertProbeCliError(
['--probe', 'probe.js:12', '--expr', 'finalValue', '--cond'],
/Missing value for --cond/, { cwd });
assertProbeCliError(
['--probe', 'probe.js:12', '--expr', 'a', '--cond', 'x',
'--probe', 'probe.js:12', '--expr', 'b', '--cond', 'y', 'probe.js'],
/Probes at probe\.js:12 must use the same --cond \(or none\)/, { cwd });
assertProbeCliError(
['--probe', 'probe.js:12', '--expr', 'a', '--cond', 'x',
'--probe', 'probe.js:12', '--expr', 'b', 'probe.js'],
/Probes at probe\.js:12 must use the same --cond \(or none\)/, { cwd });