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

How can I retrieve heap memory for string objects and allocated string values in V8/Node app?

本人是web dev出身,对C++嵌入V8理解有限(null)。所以我来这里,希望得到一些帮助。

我的任务是在我的 Node 应用程序使用 Node 的 VM api 执行不安全的用户代码时进入 V8 的堆。目前我直接从我的 Node 应用程序调用 [getHeapStatistics()][1] api 来访问 used_heap_size 但我需要更精细的东西。

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

  1. 我听说原语(如字符串)保存在堆栈中,但对于动态分配的对象(如串联字符串),它们是否存储在堆中?
  2. 我这个访问字符串的问题在C++中嵌入V8是否可行?当我说访问时,我的意思是,给定 JS 代码,let globalVar = "Hello World";,我想获得整个源代码中的 String 对象占用了多少内存,并检索所有字符串的值(例如,"Hello World").
  3. V8 的嵌入文档暗示 运行 通过 C++ 应用程序的 JS 代码,但是是否有可能让 Node 应用程序执行用户代码并在 Node 应用程序的堆中独立地拥有一个 C++ 应用程序峰值?
  4. 我遇到过跟踪和垃圾收集器等术语,但因为我是新手,所以我认为我没有正确地表述我的问题。是否有我应该搜索的常用术语或问题陈述?

my Node app is executing insecure user code using Node's VM api

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

The vm module is not a security mechanism. Do not use it to run untrusted code.

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

关于您的其他问题:

  1. I have heard primitives (like strings) are kept in the stack, but for dynamically allocated objects like concatenated strings, are they stored in the heap?

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

  1. Is my problem of accessing strings feasible by embedding V8 in C++?

不容易,但是使用 HeapProfiler API 应该可以构建达到这种效果的东西。

  1. is it possible to have the Node app executing user code and have a C++ app peak inside the Node app's heap independently?

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

  1. I've come across terms like tracing and garbage collector, but because I am new to this, I don't think I'm formulating my question properly. Is there a common term or problem statement that I should be searching?

试试“HeapProfiler”。