166

我在我的 javascript 文件 (jaydata.js) 中添加了一个断点,并按下了“Step over to the next function call”。当它到达一条线时:

},

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

在此处输入图像描述

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

4

9 回答 9

123

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

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

如果你有兴趣,只要看看"[VM]"Chromium 的源代码,你就会发现这些数字在开发者工具之外没有任何意义。

更新 2015-06-25

[VM] (scriptId)已重命名为VMscriptId a while ago,这里是搜索结果的直接链接,以防值再次更改。

于 2013-06-28T20:52:04.920 回答
48

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

于 2014-05-05T14:43:30.333 回答
47

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

//@ sourceURL=dynamicScript.js

是否可以通过 WebKit、FireBug 或 IE8 开发工具等调试器来调试动态加载 JavaScript?

于 2013-09-04T18:45:01.217 回答
10

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

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

调试器;

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

于 2018-05-29T20:16:28.270 回答
5

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

于 2015-05-19T09:02:02.830 回答
1

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

于 2017-10-26T13:40:23.423 回答
0

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

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

于 2018-02-23T22:12:05.467 回答
0

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

于 2018-03-28T04:31:07.287 回答
0

为了防止这种情况

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

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

setInterval/setTimeout 在获取字符串时也是如此(但这无论如何都是不好的做法,对吧?;))

那对你有用吗?

于 2020-02-13T11:22:18.580 回答