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

我在 javascript 文件(jaydata.js)中添加了一个断点,并按下“ Step over to the next function call” 最后一句是:

},

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

enter image description here

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

101588 次浏览

[VM] (scriptId)没有特殊的意义。这是一个虚构的名称,可以帮助我们区分那些没有直接绑定到文件名的代码,比如使用 eval和好友创建的代码。

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

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

更新2015-06-25

[VM] (scriptId)被重命名为 VMscriptId 不久前,这里是 直接连结至搜寻结果,以防值再次发生变化。

当使用 eval 时,javascript 会被抛入 Chrome 调试器 VM 中。为了查看在 Chrome 调试器源下用 eval 创建的 js,在 js 的末尾设置这个属性(感谢 Splaktar) :

//# sourceURL=dynamicScript.js

虽然 @仍然可以代替 ##是规范所喜欢的工作。

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

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

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

在调试子窗口(iframe)源代码时,随后卸载的源文件也会显示 VM 前缀和黄色背景。

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

在删除了应用程序 js 文件的黑盒设置之后,我可以成功地遍历我的代码。

我在调试角度应用程序时遇到了同样的问题。看到太多不能被黑盒化的 VM 脚本确实需要很长时间来调试。 我宁愿选择 mozilla/IE 浏览器来调试。

如果你想在 chrome 中调试程序化注入的 JS 文件,你可以使用 debugger;语句,这比找到你的脚本快,也比用 源代码生成一个文件快。

它的工作原理类似于断点,无论您在哪里使用 debugger;语句,它都会自动在 chrome source 选项卡中精确定位您的代码。

Debugger;

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

来阻止这一切

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

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

当它得到一个字符串时,setInterval/setTimeout 也是如此(但这不是一个好的做法,对吗? ;)

这样可以吗?