cli: add --trace-exit cli option#30516
Conversation
dbf2329 to
fd1f0da
Compare
fd1f0da to
4eb4b5c
Compare
src/env.cc
Outdated
There was a problem hiding this comment.
Why do we mark this as a warning and pipe to stderr?
There was a problem hiding this comment.
Other traces were printed as warnings and piped to stderr. Do you have any suggestions on the format of the traces?
There was a problem hiding this comment.
Feel free to resolve this by yourself, I'm okay if this is a default behavior :)
src/env.cc
Outdated
There was a problem hiding this comment.
Ditto, are this function called always from exceptions?
|
It seems |
jasnell
left a comment
There was a problem hiding this comment.
LGTM once the doc/node.1 is also updated
It could be convenient to trace abnormal exit of the Node.js processes that printing stacktrace on each `process.exit` call with a cli option. This also takes effects on worker threads.
4eb4b5c to
1b99ae9
Compare
doc/api/cli.md
Outdated
| added: REPLACEME | ||
| --> | ||
|
|
||
| Prints a stack trace whenever an environment is been exited proactively, i.e. |
There was a problem hiding this comment.
Typo: is been should be has been (or simply remove the word been).
doc/node.1
Outdated
| Enable the collection of trace event tracing information. | ||
| . | ||
| .It Fl -trace-exit | ||
| Prints a stack trace whenever an environment is been exited proactively, i.e. |
There was a problem hiding this comment.
See above; the typo has been made here too.
In addition, I recommend putting \& after i.e. to stop troff mistaking it as the end of a sentence. Doing so will stop an uncomfortable gap being inserted due to paragraph justification:
exited proactively, i.e. invoking # Without \&
exited proactively, i.e. invoking # With \&
\& is Roff's “do nothing” character, which is helpful to suppress the behaviour of constructs that have syntactic meaning (for example, starting a line with a dot, which is Roff's way of identifying formatting instructions).
|
@legendecas Let me know if there’s anything I can do to help move this along, I’d definitely like to see it happen :) |
|
Landed in 6859fcf :) |
It could be convenient to trace abnormal exit of the Node.js processes that printing stacktrace on each `process.exit` call with a cli option. This also takes effects on worker threads. PR-URL: #30516 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
It could be convenient to trace abnormal exit of the Node.js processes that printing stacktrace on each `process.exit` call with a cli option. This also takes effects on worker threads. PR-URL: #30516 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
Notable Changes:
* cli:
* add --trace-exit cli option (legendecas)
#30516
* http,https:
* increase server headers timeout (Tim Costa)
#30071
* readline:
* update ansi-regex (Ruben Bridgewater)
#30907
* promote \_getCursorPos to public api (Jeremy Albright)
#30687
* repl:
* add completion preview (Ruben Bridgewater)
#30907
* util:
* add Set and map size to inspect output (Ruben Bridgewater)
#30225
* wasi:
* require CLI flag to require() wasi module (Colin Ihrig)
#30963
PR-URL: #31010
Notable Changes:
* cli:
* add --trace-exit cli option (legendecas)
#30516
* http,https:
* increase server headers timeout (Tim Costa)
#30071
* readline:
* update ansi-regex (Ruben Bridgewater)
#30907
* promote \_getCursorPos to public api (Jeremy Albright)
#30687
* repl:
* add completion preview (Ruben Bridgewater)
#30907
* util:
* add Set and map size to inspect output (Ruben Bridgewater)
#30225
* wasi:
* require CLI flag to require() wasi module (Colin Ihrig)
#30963
PR-URL: #31010
It could be convenient to trace abnormal exit of the Node.js processes that printing stacktrace on each `process.exit` call with a cli option. This also takes effects on worker threads. PR-URL: #30516 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
It could be convenient to trace abnormal exit of the Node.js processes that printing stacktrace on each `process.exit` call with a cli option. This also takes effects on worker threads. PR-URL: #30516 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
Notable changes: New assert APIs The `assert` module now provides experimental `assert.match()` and `assert.doesNotMatch()` methods. They will validate that the first argument is a string and matches (or does not match) the provided regular expression This is an experimental feature. Ruben Bridgewater [#30929](#30929). Advanced serialization for IPC The `child_process` and `cluster` modules now support a `serialization` option to change the serialization mechanism used for IPC. The option can have one of two values: * `'json'` (default): `JSON.stringify()` and `JSON.parse()` are used. This is how message serialization was done before. * `'advanced'`: The serialization API of the `v8` module is used. It is based on the HTML structured clone algorithm. and is able to serialize more built-in JavaScript object types, such as `BigInt`, `Map`, `Set` etc. as well as circular data structures. Anna Henningsen [#30162](#30162). CLI flags The new `--trace-exit` CLI flag makes Node.js print a stack trace whenever the Node.js environment is exited proactively (i.e. by invoking the `process.exit()` function or pressing Ctrl+C). legendecas [#30516](#30516). ___ The new `--trace-uncaught` CLI flag makes Node.js print a stack trace at the time of throwing uncaught exceptions, rather than at the creation of the `Error` object, if there is any. This option is not enabled by default because it may affect garbage collection behavior negatively. Anna Henningsen [#30025](#30025). ___ The `--disallow-code-generation-from-strings` V8 CLI flag is now whitelisted in the `NODE_OPTIONS` environment variable. Shelley Vohr [#30094](#30094). New crypto APIs For DSA and ECDSA, a new signature encoding is now supported in addition to the existing one (DER). The `verify` and `sign` methods accept a `dsaEncoding` option, which can have one of two values: * `'der'` (default): DER-encoded ASN.1 signature structure encoding `(r, s)`. * `'ieee-p1363'`: Signature format `r || s` as proposed in IEEE-P1363. Tobias Nießen [#29292](#29292). ___ A new method was added to `Hash`: `Hash.prototype.copy`. It makes it possible to clone the internal state of a `Hash` object into a new `Hash` object, allowing to compute the digest between updates. Ben Noordhuis [#29910](#29910). Dependency updates libuv was updated to 1.34.0. This includes fixes to `uv_fs_copyfile()` and `uv_interface_addresses()` and adds two new functions: `uv_sleep()` and `uv_fs_mkstemp()`. Colin Ihrig [#30783](#30783). ___ V8 was updated to 7.8.279.23. This includes performance improvements to object destructuring, RegExp match failures and WebAssembly startup time. The official release notes are available at https://v8.dev/blog/v8-release-78. Michaël Zasso [#30109](#30109). New EventEmitter APIs The new `EventEmitter.on` static method allows to async iterate over events. Matteo Collina [#27994](#27994). ___ It is now possible to monitor `'error'` events on an `EventEmitter` without consuming the emitted error by installing a listener using the symbol `EventEmitter.errorMonitor`. Gerhard Stoebich [#30932](#30932). ___ Using `async` functions with event handlers is problematic, because it can lead to an unhandled rejection in case of a thrown exception. The experimental `captureRejections` option in the `EventEmitter` constructor or the global setting change this behavior, installing a `.then(undefined, handler)` handler on the `Promise`. This handler routes the exception asynchronously to the `Symbol.for('nodejs.rejection')` method if there is one, or to the `'error'` event handler if there is none. Setting `EventEmitter.captureRejections = true` will change the default for all new instances of `EventEmitter`. This is an experimental feature. Matteo Collina [#27867](#27867). Performance Hooks are no longer experimental The `perf_hooks` module is now considered a stable API. legendecas [#31101](#31101). Introduction of experimental WebAssembly System Interface (WASI) support A new core module, `wasi`, is introduced to provide an implementation of the [WebAssembly System Interface](https://wasi.dev/) specification. WASI gives sandboxed WebAssembly applications access to the underlying operating system via a collection of POSIX-like functions. This is an experimental feature. Colin Ihrig [#30258](#30258). PR-URL: #31691
Notable changes: New assert APIs The `assert` module now provides experimental `assert.match()` and `assert.doesNotMatch()` methods. They will validate that the first argument is a string and matches (or does not match) the provided regular expression This is an experimental feature. Ruben Bridgewater [#30929](#30929). Advanced serialization for IPC The `child_process` and `cluster` modules now support a `serialization` option to change the serialization mechanism used for IPC. The option can have one of two values: * `'json'` (default): `JSON.stringify()` and `JSON.parse()` are used. This is how message serialization was done before. * `'advanced'`: The serialization API of the `v8` module is used. It is based on the HTML structured clone algorithm. and is able to serialize more built-in JavaScript object types, such as `BigInt`, `Map`, `Set` etc. as well as circular data structures. Anna Henningsen [#30162](#30162). CLI flags The new `--trace-exit` CLI flag makes Node.js print a stack trace whenever the Node.js environment is exited proactively (i.e. by invoking the `process.exit()` function or pressing Ctrl+C). legendecas [#30516](#30516). ___ The new `--trace-uncaught` CLI flag makes Node.js print a stack trace at the time of throwing uncaught exceptions, rather than at the creation of the `Error` object, if there is any. This option is not enabled by default because it may affect garbage collection behavior negatively. Anna Henningsen [#30025](#30025). ___ The `--disallow-code-generation-from-strings` V8 CLI flag is now whitelisted in the `NODE_OPTIONS` environment variable. Shelley Vohr [#30094](#30094). New crypto APIs For DSA and ECDSA, a new signature encoding is now supported in addition to the existing one (DER). The `verify` and `sign` methods accept a `dsaEncoding` option, which can have one of two values: * `'der'` (default): DER-encoded ASN.1 signature structure encoding `(r, s)`. * `'ieee-p1363'`: Signature format `r || s` as proposed in IEEE-P1363. Tobias Nießen [#29292](#29292). ___ A new method was added to `Hash`: `Hash.prototype.copy`. It makes it possible to clone the internal state of a `Hash` object into a new `Hash` object, allowing to compute the digest between updates. Ben Noordhuis [#29910](#29910). Dependency updates libuv was updated to 1.34.0. This includes fixes to `uv_fs_copyfile()` and `uv_interface_addresses()` and adds two new functions: `uv_sleep()` and `uv_fs_mkstemp()`. Colin Ihrig [#30783](#30783). ___ V8 was updated to 7.8.279.23. This includes performance improvements to object destructuring, RegExp match failures and WebAssembly startup time. The official release notes are available at https://v8.dev/blog/v8-release-78. Michaël Zasso [#30109](#30109). New EventEmitter APIs The new `EventEmitter.on` static method allows to async iterate over events. Matteo Collina [#27994](#27994). ___ It is now possible to monitor `'error'` events on an `EventEmitter` without consuming the emitted error by installing a listener using the symbol `EventEmitter.errorMonitor`. Gerhard Stoebich [#30932](#30932). ___ Using `async` functions with event handlers is problematic, because it can lead to an unhandled rejection in case of a thrown exception. The experimental `captureRejections` option in the `EventEmitter` constructor or the global setting change this behavior, installing a `.then(undefined, handler)` handler on the `Promise`. This handler routes the exception asynchronously to the `Symbol.for('nodejs.rejection')` method if there is one, or to the `'error'` event handler if there is none. Setting `EventEmitter.captureRejections = true` will change the default for all new instances of `EventEmitter`. This is an experimental feature. Matteo Collina [#27867](#27867). Performance Hooks are no longer experimental The `perf_hooks` module is now considered a stable API. legendecas [#31101](#31101). Introduction of experimental WebAssembly System Interface (WASI) support A new core module, `wasi`, is introduced to provide an implementation of the [WebAssembly System Interface](https://wasi.dev/) specification. WASI gives sandboxed WebAssembly applications access to the underlying operating system via a collection of POSIX-like functions. This is an experimental feature. Colin Ihrig [#30258](#30258). PR-URL: #31691
| stderr.match(/WARNING: Exited the environment with code 0/g); | ||
| if (warnings === 0) { | ||
| assert.strictEqual(actualWarnings, null); | ||
| return; |
There was a problem hiding this comment.
This return; terminates the whole async function i.e. terminates the enclosing for cycle after the second iteration (i.e. the first iteration with warnings === 0). I assume that continue; should have been here instead.
There was a problem hiding this comment.
Thank you for identifying this. Would you mind opening an issue for it (preferably with a snippet showing the bug if you have one)? It will get more attention as an issue that a comment here.
| assert.strictEqual(actualWarnings.length, warnings); | ||
|
|
||
| if (variant.startsWith('worker')) { | ||
| const workerIds = stderr.match(/\(node:\d+, thread:\d+)/g); |
There was a problem hiding this comment.
This regular expression in invalid. It contains an unmatched ) i.e. ) at the end should be \). This was not noticed because there is a lazy syntax check of regular expressions in V8 and this statement is never reached because of the incorrect return; mentioned above.
There was a problem hiding this comment.
Thanks for reporting this! I've submitted a fix for this #33769.
It could be convenient to trace abnormal exit of the Node.js processes
that printing stacktrace on each
process.exitcall with a cli option.This also takes effects on worker threads.
Checklist
make -j4 test(UNIX), orvcbuild test(Windows) passes