Chrome开发工具:来自javascript的[VM]文件

All*_*Cat 128 debugging google-chrome-devtools

我在我的javascript文件(jaydata.js)中添加了一个断点,并按下"跳到下一个函数调用".当它到达一条线时:

},
Run Code Online (Sandbox Code Playgroud)

弹出另一个标题为"[VM](8312)"的文件.我一直点击"跳到下一个函数调用",现在我的屏幕是:

在此输入图像描述

什么是这些奇怪而神秘的剧本名为"[VM](XXXX",它们来自哪里?

Rob*_*b W 100

[VM] (scriptId)没有特别的意义.它是一个虚拟名称,可帮助我们区分与文件名无直接关联的代码,例如使用eval和朋友创建的代码.

过去,所有这些脚本都是标记的(program).

如果您有兴趣,只需查看"[VM]"Chromium的源代码,您会发现这些数字在开发人员工具之外没有重要意义.

更新2015-06-25

[VM] (scriptId)更名为VMscriptId 前一段时间,这里是直接链接到搜索结果再次值变化情况.

  • `[VM] (scriptId)` 已重命名为 `VMscriptId` [不久前](https://chromiumcodereview.appspot.com/23530041),但我将答案保留在当前状态,以免问题无效。最新的代码搜索链接是:https://cs.chromium.org/%22VM%5C%22%20+%22(如果值再次更改,则直接链接到搜索结果:https://chromium.googlesource.com/铬/闪烁/+/669a2f29610ca8d0a8790bb829bfde4ba768e936/Source/devtools/front_end/bindings/DefaultScriptMapping.js#193) (2认同)
  • 我最近在没有任何 eval 的情况下遇到了这个问题——它似乎与 iFrames 的使用有关。我的证据是,当我在 iFrame 中的代码上设置断点时,我会遇到 [VM] 问题,但是当我在自己的窗口中打开 iFrame 时,我会很好地命中断点。只要确定这是否符合答案中描述的 eval 的“朋友”之一。 (2认同)

Sam*_*man 37

每当您通过AJAX加载HTML内容,并且该内容包含<script>标签时,将使用eval()评估该脚本,并将Chrome的Sources视图识别为以"VM"开头的新文件.您始终可以转到"网络"选项卡,查找AJAX请求,并完整地查看HTML响应,包括脚本.

  • 虽然这很麻烦调试。如果我将脚本标记与src = / test.js一起使用,则会导致错误回溯到test.js,回溯包含正确的文件名,但是此后,堆栈跟踪包含VM魔术。这使得不可能从堆栈跟踪中获取文件的源代码(来自同一来源),而且无法缓存它们,因为您不知道将来的堆栈跟踪中哪个文件。此问题已在开发工具中修复,但在webapps中未修复。 (2认同)

Sul*_*lly 34

使用eval时,javascript会被抛入Chrome Debugger虚拟机.要在Chrome调试器源下查看使用eval创建的js,请在js的末尾(感谢Splaktar)设置此属性:

//@ sourceURL=dynamicScript.js
Run Code Online (Sandbox Code Playgroud)

可以通过WebKit,FireBug或IE8 Developer Tool等调试器来调试动态加载JavaScript吗?

  • 语法已更改,现在为://#sourceURL = dynamicScript.js (9认同)
  • 在Firefox调试工具上,它说`使用// @表示sourceURL pragma已被弃用.使用//#而不是` (4认同)

小智 8

我发现 VM 是由一些 Chrome 扩展生成的 - 它们将 CSS/JS 插入页面,Chrome 使用 VM 文件来运行它。


Rod*_*okr 8

如果您想在 chrome 中调试以编程方式注入的 JS 文件,您可以使用该debugger;语句,这比查找脚本的位置更快,也比使用sourceurl生成文件更快

它就像断点一样工作,并在您使用该debugger;语句的任何地方自动在 chrome 源选项卡中查明您的代码。

调试器;

请注意,脚本的来源是一个 VMXXX 文件。