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

时间:2013-06-28 14:50:18

标签: debugging google-chrome-devtools

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

},

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

enter image description here

这些奇怪而神秘的剧本名为“[VM](XXXX”以及它们来自哪里?

10 个答案:

答案 0 :(得分:94)

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

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

如果您感兴趣,只需look up "[VM]"in the source code of Chromium,您会发现这些数字在开发者工具之外没有重要意义。

更新2015-06-25

[VM] (scriptId)已重命名为VMscriptId a while ago,如果值再次更改,则此处为direct link to search result

答案 1 :(得分:34)

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

答案 2 :(得分:33)

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

//@ sourceURL=dynamicScript.js

Is possible to debug dynamic loading JavaScript by some debugger like WebKit, FireBug or IE8 Developer Tool?

答案 3 :(得分:4)

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

答案 4 :(得分:3)

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

它就像断点一样,无论您在何处使用debugger;语句,都会自动在Chrome源代码选项卡中查找代码。

Debugger;

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我遇到了同样的问题。问题是我的应用程序代码被意外地视为黑盒子。当我尝试进入代码时,它会不断打开这些VMXXXX标签。

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

答案 7 :(得分:0)

@sourceURL使您可以在使用评估时简化开发。

通过在代码中包含以下将被规避的特殊注释,您可以命名评估,内联脚本和样式,以便它们在DevTools中显示为更合逻辑的名称。

//# sourceURL=someName

此处有更多信息-https://developers.google.com/web/tools/chrome-devtools/javascript/source-maps#sourceurl_and_displayname

答案 8 :(得分:0)

为防止这种情况

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

然后将黑盒^.*blackbox-this.js$

与setInterval / setTimeout相同,当它得到一个字符串时(但这仍然是一种不好的做法,对吗?)

对您有用吗?

答案 9 :(得分:-1)

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