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


139

我在我的javascript文件(jaydata.js)中添加了一个断点,然后按“进入下一个函数调用”。当到达一行时:

},

弹出另一个名为“ [VM](8312)”的文件。我一直单击“转到下一个函数调用”,现在的屏幕是:

在此处输入图片说明

这些标题为“ [VM](XXXX“”的奇怪而神秘的脚本是什么,它们是从哪里来的?


1
当您编辑同时调试的文件时,也会显示这些VM文件。Chrome失去同步性,当在文件上放置断点时,它将在文件内存中某处的其他位置停止代码。例如,test.html将允许断点,但Chrome停止时会在其他位置的VM99:test.html处允许断点。解决方案是关闭Chrome重命名文件(例如test2.html),然后重新启动。test.html的,如果你尝试:(清除历史记录,缓存等不能正常工作和Chrome将继续加载VM99。
QuentinUK

Answers:


112

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

过去,所有这些脚本都被标记为(program)

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

更新2015-06-25

[VM] (scriptId)已重命名为VMscriptId 前一阵子,这是到搜索结果直接链接,以防该值再次更改。


1
Chrome浏览器会命中[VM]文件而不是实时js文件吗?如果是这样,为什么?
马特

@Matt“点击[VM]文件而不是实时js文件”是什么意思?
罗布W

@RobW无视;我的浏览器正在缓存js文件(尽管已更新了我的缓存无效化程序)。
马特

1
[VM] (scriptId)已重命名为VMscriptId 前一阵子,但我将答案保持在当前状态以免使问题无效。最近于codesearch链接是:cs.chromium.org/%22VM%5C%22%20+%22(直接链接到搜索结果的情况下,该值再次发生变化:chromium.googlesource.com/chromium/blink/+/...
Rob W

我最近遇到了这个问题,没有任何评估-它似乎与iFrame的使用有关。我的证据是,当我在iFrame中的代码上设置断点时,出现了[VM]问题,但是当我在自己的窗口中打开iFrame时,我碰到了断点就好了。只要确定这是否符合答案中所述的eval的“朋友”之一即可。
危险

42

每当您通过AJAX加载HTML内容且该内容包含<script>标签时,该脚本都会使用eval()进行评估,并被Chrome的“源代码”视图识别为以“ VM”开头的新文件。您始终可以转到“网络”标签,找到AJAX请求,然后查看包括脚本在内的整个HTML响应。


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

这可能是它在现代Web应用程序中发生的最常见原因,也是为什么我们应该将代码与内容分开的另一个很好的例子。
alexw

37

使用eval时,JavaScript会扔进Chrome调试器VM。为了查看在Chrome调试器源下使用eval创建的js,请在js的末尾(感谢Splaktar)设置此属性:

//@ sourceURL=dynamicScript.js

是否可以通过某些调试器(例如WebKit,FireBug或IE8开发人员工具)来调试动态加载的JavaScript?


9
语法已更改,现在变为://#sourceURL = dynamicScript.js
ThiagoPonte 2014年

1
它也应该在JavaScript的末尾,而不是开始。
Splaktar 2014年

一直在寻找这样的东西。谢谢
David Kierans

谢谢!太有用了!
夏娃

4
在Firefox调试工具上,它说Using //@ to indicate sourceURL pragmas is deprecated. Use //# instead
Nighto

6

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

它像断点一样工作,无论您在何处使用该debugger;语句,都可以在chrome源标签中自动精确定位您的代码。

调试器;

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


这似乎无法回答问题。
格兰特·米勒

不好,我让我自己回答这个问题的其他答案。
罗德里罗克

1
超!这正是我想要的。无需找出您的代码由JS引擎插入了哪个VM。
奥列格·博登

这个答案和问题之间有什么联系?
拉文德拉·索拉特

通过debugger;声明,他可以揭开神秘的“奇怪的和神秘的脚本,标题为[[VM](XXXX“)”的来源,如果他愿意的话
Rodrirokr

4

我发现VM是从某些Chrome扩展程序中生成的-他们将CSS / JS插入页面,然后Chrome使用VM文件运行它。


0

调试子窗口(iframe)源(随后将其卸载)时,您的源文件还将获得VM前缀和黄色背景。


0

我遇到了同样的问题。问题是我的应用程序的代码被误认为是黑盒。当我尝试进入代码时,它一直打开这些VMXXXX选项卡。

删除应用程序js文件的黑盒设置后,我可以成功地逐步执行代码。


0

为了防止这个

(function ()
 {
  var originalEval = eval;
  eval =
   function (script)
   {
    return originalEval(script + "\n//# sourceURL=blackbox-this.js");
   }
 }());

然后黑匣子 ^.*blackbox-this.js$

当它获取字符串时,对于setInterval / setTimeout也是一样的(但无论如何都是不好的做法,对吗?))

那对你有用吗?


-1

在调试我的角度应用程序时,我遇到了同样的问题。看到太多无法被黑盒显示的VM脚本确实需要花费很长时间进行调试。我宁愿选择mozilla / IE资源管理器进行调试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.