如何在V8 / Node应用程序中检索字符串对象和分配的字符串值的堆内存?

问题描述

我来自网络开发人员,我对将V8嵌入C ++的理解是有限的(无效)。所以我要来这里,希望能有所帮助。

我的任务是当我的Node应用程序使用Node的VM API执行不安全的用户代码时,进入V8的堆。目前,我正在直接从我的Node应用程序调用{​​{1}} api来访问[getHeapStatistics()][1],但我需要更详细的内容

具体地说,我想跟踪在Node的VM沙箱中执行的用户代码中创建的所有字符串。许多字符串将在运行时在while循环内连接。为此,我到达了C ++应用程序中的embedding V8。问题如下:

  1. 我听说原语(例如字符串)保留在堆栈中,但是对于动态分配的对象(例如串联字符串),它们是否存储在堆中?
  2. 通过将V8嵌入C ++,访问字符串是否可行?当我说访问时,我的意思是,给定JS代码used_heap_size,我想获得整个源代码中String对象占用的内存量,并且还检索所有字符串的值(例如{{1} })。
  3. V8的嵌入文档暗示通过C ++应用程序运行JS代码,但是是否可以让Node应用程序执行用户代码,并在Node应用程序的堆中使C ++应用程序达到峰值?
  4. 我遇到过诸如跟踪和垃圾收集器之类的术语,但是由于我是新来的,所以我认为我没有适当地提出问题。我应该搜索一个通用术语或问题陈述吗?

解决方法

我的Node应用正在使用Node的VM API执行不安全的用户代码

https://nodejs.org/api/vm.html的第一段以粗体显示:

vm模块不是安全机制。不要使用它来运行不受信任的代码。

在Node上运行的代码可以例如删除或破坏或感染您的文件,或者窃取您的密码和安全凭证(例如已保存的cookie等)。您了解此警告吗?

关于您的其他问题:

  1. 我听说原语(例如字符串)保留在堆栈中,但是对于动态分配的对象(例如串联字符串),它们是否存储在堆中?

所有字符串都存储在堆中。

  1. 通过将V8嵌入C ++,访问字符串是否可行?

这并不容易,但是使用HeapProfiler API可以构建出某种效果。

  1. 是否可以让Node应用程序执行用户代码,并在Node应用程序的堆中使C ++应用程序的峰值独立?

不。同样,再次在Node中运行不受信任的代码是一个非常不好的主意。您必须构建自己的嵌入应用程序。这样做的好处是,它还使您有机会通过不让它访问文件系统或网络等来安全地构建它。另一方面,“ JavaScript”代码通常表示它假定在以下环境中运行浏览器,其中有windowdocumentXMLHTTPRequest之类的东西,而V8中都不存在,因此,如果需要支持所有这些,您将需要做很多工作你。

  1. 我遇到过诸如跟踪和垃圾收集器之类的术语,但是由于我是新来的,所以我认为我没有适当地提出问题。我应该搜索一个通用术语或问题陈述吗?

尝试“ HeapProfiler”。