Hi,
I work on Node.js code coverage tools using V8's profiler (c8).

There are currently 2 methods to use the V8 debug protocol from Node.
1. You can spawn a process with the  `--inspect` or `--inspect-brk` flag. 
This starts V8 in "server mode" and remote clients can connect to it and 
interact with the debugger.
2. You can use Node's "inspector" module to enable a process to debug 
itself (communicate with its own V8)

This means to profile a V8 runtime, you need to first start the V8 process 
and then connect the inspector to it.

This system causes a mismatch with the needs of coverage. nyc (istanbul) 
and c8 want to get coverage for all the node processes spawned in a process 
sub-tree.
We have a single top process collecting coverage and each Node subprocess 
reports its results to it.

This means that we have the opposite system: the inspector is started 
first, and then many debugged processes connect to it.
But this is not supported by V8.
So we use a "brutal hack" called "spawn-wrap".

It intercepts all the Node processes created in a subtree and replaces its 
main module by another one. This wrapper module has the logic to start the 
profiler, execute the original entry point and then report the results.

This solution is far from optimal. The wrapping mechanism is complex and 
hard to maintain, if the entry point forces the process to close 
immediately the reporting code is not executed, and the execution of the 
wrapper entry-point can interfere with the the coverage.

Some of these issues can be solved, but the mismatch remains: we have to 
engineer a level on top of the V8 debugger because the connection can only 
go in one direction currently: the inspector connects to the debugger.

I would like to know what it would take to support the opposite scenario: 
start an inspector server on some port (ex 9333) and then ask the debugger 
to initiate the connection.
It would act like:

inspectorServer.on("connection", (client) => {console.log("New connection"
);})
await inspectorServer.start();
spawn("node", ["foo.js"], {env: {NODE_OPTIONS="--inspect-srv=9333"}});

Ensuring that all the subprocesses have the same env var or flag is easier 
to achieve than hijacking the entry-point to emulate this kind of feature.

I believe that this kind of feature needs to be implemented in V8. Am I 
right? Should I redirect this feature request to Node? Is it the right 
place to post this message?


-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to