簡體   English   中英

如何在 V8/Node 應用程序中檢索字符串對象的堆內存和分配的字符串值?

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

我來自網絡開發,我對在 C++ 中嵌入 V8 的理解是有限的(null)。 所以我來這里,希望得到一些幫助。

我的任務是在我的 Node 應用程序使用 Node 的 VM api 執行不安全的用戶代碼時進入 V8 的堆峰值。 目前,我直接從我的 Node 應用程序調用[getHeapStatistics()][1] api 來訪問used_heap_size但我需要更細粒度的東西。

具體來說,我想跟蹤在 Node 的 VM 沙箱中執行的用戶代碼中創建的所有字符串。 許多字符串將在運行時在 while 循環中連接起來。 為此,我已經將 V8 嵌入到 C++ 應用程序中。 問題如下:

  1. 我聽說原語(如字符串)保存在堆棧中,但對於動態分配的對象(如連接字符串),它們是否存儲在堆中?
  2. 我通過在 C++ 中嵌入 V8 來訪問字符串的問題是否可行? 當我說訪問時,我的意思是,給定 JS 代碼, let globalVar = "Hello World"; ,我想獲得整個源代碼中 String 對象占用多少內存,並檢索所有字符串的值(例如, "Hello World" )。
  3. V8 的 embed doc 暗示通過 C++ 應用程序運行 JS 代碼,但是是否有可能讓 Node 應用程序執行用戶代碼並在 Node 應用程序的堆內獨立地擁有一個 C++ 應用程序峰值?
  4. 我遇到過諸如跟蹤和垃圾收集器之類的術語,但是因為我對此很陌生,所以我認為我沒有正確地提出我的問題。 是否有我應該搜索的通用術語或問題陳述?

我的 Node 應用程序正在使用 Node 的 VM api 執行不安全的用戶代碼

https://nodejs.org/api/vm.html 上的第一段用粗體表示:

vm 模塊不是一種安全機制。 不要使用它來運行不受信任的代碼。

例如,在 Node 上運行的代碼可能會刪除、損壞或感染您的文件,或竊取您的密碼和安全憑證(例如保存的 cookie 等)。您了解此警告嗎?

至於你的其他問題:

  1. 我聽說原語(如字符串)保存在堆棧中,但對於動態分配的對象(如連接字符串),它們是否存儲在堆中?

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

  1. 我通過在 C++ 中嵌入 V8 來訪問字符串的問題是否可行?

這並不容易,但是使用HeapProfiler API 應該可以構建具有這種效果的東西。

  1. 是否可以讓 Node 應用程序執行用戶代碼並在 Node 應用程序的堆內獨立地擁有一個 C++ 應用程序峰值?

不。同樣,在 Node 中運行不受信任的代碼是一個非常糟糕的主意 您必須構建自己的嵌入應用程序。 這樣做的好處是它還讓您有機會通過不讓其訪問您的文件系統或網絡等來安全地構建它。另一方面,“JavaScript”代碼通常意味着它假定在瀏覽器,其中有windowdocument以及XMLHTTPRequest類的東西,V8 中都不存在這些東西,所以如果您需要支持所有這些,那么您將有很多工作要做。

  1. 我遇到過諸如跟蹤和垃圾收集器之類的術語,但是因為我對此很陌生,所以我認為我沒有正確地提出我的問題。 是否有我應該搜索的通用術語或問題陳述?

試試“HeapProfiler”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM