问题描述
我来自网络开发人员,我对将V8嵌入C ++的理解是有限的(无效)。所以我要来这里,希望能有所帮助。
我的任务是当我的Node应用程序使用Node的VM API执行不安全的用户代码时,进入V8的堆。目前,我正在直接从我的Node应用程序调用{{1}} api来访问[getHeapStatistics()][1]
,但我需要更详细的内容。
具体地说,我想跟踪在Node的VM沙箱中执行的用户代码中创建的所有字符串。许多字符串将在运行时在while循环内连接。为此,我到达了C ++应用程序中的embedding V8。问题如下:
- 我听说原语(例如字符串)保留在堆栈中,但是对于动态分配的对象(例如串联字符串),它们是否存储在堆中?
- 通过将V8嵌入C ++,访问字符串是否可行?当我说访问时,我的意思是,给定JS代码
used_heap_size
,我想获得整个源代码中String对象占用的内存量,并且还检索所有字符串的值(例如{{1} })。 - V8的嵌入文档暗示通过C ++应用程序运行JS代码,但是是否可以让Node应用程序执行用户代码,并在Node应用程序的堆中使C ++应用程序达到峰值?
- 我遇到过诸如跟踪和垃圾收集器之类的术语,但是由于我是新来的,所以我认为我没有适当地提出问题。我应该搜索一个通用术语或问题陈述吗?
解决方法
我的Node应用正在使用Node的VM API执行不安全的用户代码
https://nodejs.org/api/vm.html的第一段以粗体显示:
vm模块不是安全机制。不要使用它来运行不受信任的代码。
在Node上运行的代码可以例如删除或破坏或感染您的文件,或者窃取您的密码和安全凭证(例如已保存的cookie等)。您了解此警告吗?
关于您的其他问题:
- 我听说原语(例如字符串)保留在堆栈中,但是对于动态分配的对象(例如串联字符串),它们是否存储在堆中?
所有字符串都存储在堆中。
- 通过将V8嵌入C ++,访问字符串是否可行?
这并不容易,但是使用HeapProfiler
API可以构建出某种效果。
- 是否可以让Node应用程序执行用户代码,并在Node应用程序的堆中使C ++应用程序的峰值独立?
不。同样,再次在Node中运行不受信任的代码是一个非常不好的主意。您必须构建自己的嵌入应用程序。这样做的好处是,它还使您有机会通过不让它访问文件系统或网络等来安全地构建它。另一方面,“ JavaScript”代码通常表示它假定在以下环境中运行浏览器,其中有window
和document
和XMLHTTPRequest
之类的东西,而V8中都不存在,因此,如果需要支持所有这些,您将需要做很多工作你。
- 我遇到过诸如跟踪和垃圾收集器之类的术语,但是由于我是新来的,所以我认为我没有适当地提出问题。我应该搜索一个通用术语或问题陈述吗?
尝试“ HeapProfiler”。