如何从Node.js应用程序与基于函数的V8调试API对话?

如何从Node.js应用程序与基于函数的V8调试API对话?,node.js,v8,Node.js,V8,我有一个相当特殊的调试问题,我的节点应用程序本身就是一个节点调试器(应用程序的一个部分将为调试另一个部分提供调试接口) 我熟悉记录在以下位置的V8调试协议: 以及使用它的多种工具(包括Node中的内部调试器、Node inspector和许多其他工具)。如果我必须通过网络连接与该API对话,正如所有现有工具所做的那样,我可以这样做,但出于以下几个原因,我宁愿不这样做。我已经在proc中,希望避免在所有情况下打开调试端口和网络开销(这是我的生产环境的一部分),并且我希望从调试API中获取Java

我有一个相当特殊的调试问题,我的节点应用程序本身就是一个节点调试器(应用程序的一个部分将为调试另一个部分提供调试接口)

我熟悉记录在以下位置的V8调试协议:

以及使用它的多种工具(包括Node中的内部调试器、Node inspector和许多其他工具)。如果我必须通过网络连接与该API对话,正如所有现有工具所做的那样,我可以这样做,但出于以下几个原因,我宁愿不这样做。我已经在proc中,希望避免在所有情况下打开调试端口和网络开销(这是我的生产环境的一部分),并且我希望从调试API中获取Javascript对象,而不是通过JSON API获得的JSON化版本(缺少一些保真度)

V8调试器文档说:“有两种API用于此:使用JavaScript对象的基于函数的API和使用基于JSON协议的基于消息的API。基于函数的API可以由进程内调试器代理使用,而基于消息的API也可以在进程外使用。”


使用JavaScript对象的基于函数的API听起来正是我所需要的,但是我在V8文档中看不到其他关于此API或如何使用它的内容。我也看不到如何从Node.js访问此API(或通常的V8)。那么这是可能的,如果是的话,如何实现呢?

它永远不会失败。整天研究。寄到某处。10分钟后找到答案

使用此参数启动Node.js:
--将调试公开为=v8debug

不出所料,它将V8调试状态公开为一个模块,您可以引用该模块:

var debug = v8debug.Debug;
var scripts = debug.scripts();

仍然在整理成堆的JS入口点以及它们如何与已发布的API保持一致,但我认为我遇到的主要问题或多或少已经解决了。

它从未失败过。整天研究。寄到某处。10分钟后找到答案

使用此参数启动Node.js:
--将调试公开为=v8debug

不出所料,它将V8调试状态公开为一个模块,您可以引用该模块:

var debug = v8debug.Debug;
var scripts = debug.scripts();

仍然在整理JS入口点的堆以及它们如何与已发布的API对齐,但我认为我遇到的主要问题或多或少已经解决。

如果其他人走上这条道路,我可以在proc中访问v8调试API,但由于节点线程模型,它并不是非常有用(例如,我假设来自调试器的通知将位于与正在调试的应用程序不同的线程上).我认为节点应用程序要进行自我调试,确实需要不止一个进程,并且需要使用基于网络的API。我现在正在这样做,经过一点痛苦之后,这是一种更好的方法。这可能有助于为未来的读者指出(像我一样).:-/看起来node.JS仍然通过仿真拥有它,但它不在v8中。如果其他人走这条路,我可以在proc中访问v8调试API,但由于节点线程模型,它没有太大的用处(例如,我假设来自调试器的通知将位于与正在调试的应用程序不同的线程上).我认为节点应用程序要进行自我调试,确实需要不止一个进程,并且需要使用基于网络的API。我现在正在这样做,经过一点痛苦之后,这是一种更好的方法。这可能有助于为未来的读者指出(像我一样).:-/看起来node.JS仍然通过仿真拥有它,但它不在v8中。如果您想实现这一点,不管命令行参数如何,最好与v8::v8::SetFlagsFromString结合使用。还可以公开垃圾收集器。如果您想与v8::v8::SetFlagsFromString结合使用,也很好无论命令行参数如何,都可以实现这一点。这也有助于公开垃圾收集器。