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

Debugging Chrome开发工具:[VM]来自javascript的文件,debugging,google-chrome-devtools,Debugging,Google Chrome Devtools,我在javascript文件(jaydata.js)中添加了一个断点,并按下“切换到下一个函数调用” 当它到达一条线时: }, 另一个名为“[VM](8312)”的文件弹出。我一直单击“转到下一个函数调用”,现在我的屏幕是: 这些名为“[VM](XXXX)”的奇怪而神秘的脚本是什么?它们来自哪里?[VM](scriptId)没有特殊意义。它是一个虚拟名称,帮助我们区分不直接与文件名绑定的代码,例如使用eval和friends创建的代码 在过去,所有这些脚本都被标记为(程序) 如果你感兴趣,你

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

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

这些名为“[VM](XXXX)”的奇怪而神秘的脚本是什么?它们来自哪里?
[VM](scriptId)
没有特殊意义。它是一个虚拟名称,帮助我们区分不直接与文件名绑定的代码,例如使用
eval
和friends创建的代码

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

如果你感兴趣,你会发现这些数字在开发者工具之外没有什么意义

更新2015-06-25
[VM](scriptId)
被重命名为
VMscriptId
,以下是值再次更改的情况。

使用eval时,javascript会被抛出到Chrome调试器VMs中。为了查看在Chrome调试器源下使用eval创建的js,请在js的末尾设置此属性(感谢Splaktar):

//@ sourceURL=dynamicScript.js

无论何时通过AJAX加载HTML内容,并且该内容包含
标记,都将使用eval()对脚本进行评估并且被Chrome的Sources视图识别为一个以“VM”开头的新文件。您可以随时转到网络选项卡,查找AJAX请求,并查看整个HTML响应,包括您的脚本。

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

您正在调试一个子窗口(iframe)源,该源随后被卸载。您的源文件也将获得VM前缀和黄色背景。

我遇到了相同的问题。问题是我的应用程序的代码被意外地视为黑盒。当我尝试单步执行代码时,它一直打开这些
VMXXXX
选项卡


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

我在调试angular应用程序时也遇到了同样的问题。看到太多无法黑盒的VM脚本,真的需要很长时间才能调试。
我宁愿选择mozilla/IE浏览器进行调试。

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

它就像一个断点,无论您在哪里使用
debugger;
语句,它都会自动在chrome源代码选项卡中定位代码

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

为了防止这种情况发生

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

当setInterval/setTimeout获取字符串时也是如此(但无论如何,这是一种糟糕的做法,对不对?;)



这对你有用吗?

Chrome会点击[VM]文件而不是live js文件吗?如果是,为什么?@Matt“点击[VM]文件而不是实时js文件”是什么意思;我的浏览器正在缓存js文件(尽管已经更新了缓存buster)。
[VM](scriptId)
被重命名为
VMscriptId
,但我将答案保持在当前状态,以避免问题无效。最新的codesearch链接是:(直接链接到搜索结果,以防值再次更改:)我最近在没有任何评估的情况下遇到了这个问题-它似乎与iFrame的使用有关。我的证据是,当我在iFrame中的代码上设置断点时,我遇到了[VM]问题,但当我在自己的窗口中打开iFrame时,我正好碰到了断点。只是确定这是否符合答案中所述的eval的“朋友”之一。语法已更改,现在它的://#sourceURL=dynamicScript.jsIt也应该位于JavaScript的末尾,而不是开头。我们一直在寻找类似的内容。谢谢你!太有用了!在Firefox调试工具上,它说
使用//@表示sourceURL pragmas已被弃用。使用//#而不是
这对于调试来说很糟糕。如果我将脚本标记与
src=/test.js
一起使用,则会导致一个错误,该错误可追溯到test.js,回溯包含正确的文件名,但此后,stacktrace包含VM magic。这使得无法多次获取stacktrace中文件的源代码[来自同一来源],并且您无法缓存它们,因为您不知道在将来的stacktrace中哪个文件是哪个文件。这在开发工具中是固定的,但在web应用程序中不是。这可能是现代web应用程序中最常见的原因,也是我们应该将代码与内容分开的另一个很好的例子。当您编辑同时调试的文件时,这些VM文件也会出现。Chrome会丢失同步,当在文件上放置断点时,它会在内存中的某个位置停止代码。e、 g.test.html将允许一个断点,但当Chrome停止时,它会在VM99:test.html的其他位置上这样做。解决方案是关闭Chrome重命名文件,例如test2.html,然后重新启动。(清除历史记录、缓存等不起作用,如果您尝试这样做,Chrome将继续加载VM99:test.html。@QuentinUK如果在任何浏览器上发生这种情况会怎样?这似乎并不能回答问题。糟糕的是,我放弃了这个问题的其他答案。太好了!这正是我想要的。不需要找出您的代码在哪个VM中。)是由JS引擎插入的。这个答案和这个问题之间有什么联系?通过
调试器;
语句,他可以揭开神秘的“奇怪和神秘的脚本”(标题为“[VM](XXXX)”的位置如果他愿意的话,我也有同样的问题,你到底做了什么?抱歉@sTx,我根本不记得这些。没问题,我的代码中有一个空引用错误。没有VM