文档
/
实用方案
/

诊断 VM 运行时错误

诊断 VM 运行时错误

您的 VM 混淆代码在运行时抛出错误 —— 它可能是 RangeError: Invalid array length,但同样的排查清单 也适用于混淆后才出现的其他意外错误。请按顺序逐步排查。第一步能够 命中绝大多数最常见的原因;其余步骤则用于缩小定位真正的缺陷。

步骤 1 - 对照 target 选项检查运行时

Invalid array length 及类似错误最常见的单一原因,是 target 选项与 代码实际运行环境之间不匹配,再叠加 vmSelfDefending: true

会触发此情况的环境:

  • Node.js(直接通过 node 运行混淆后的包)
  • 无头 Chrome / Chromium、PhantomJS
  • Puppeteer、Playwright、Cypress、Selenium / ChromeDriver、Nightmare
  • jsdom 及其他服务端 DOM 模拟
  • 原生浏览器内置对象被 Hook 或替换的任何环境

如果您的运行时在上述列表中,那么这个错误是保护按设计工作,而不是缺陷。请选择与 您的情况相匹配的解决方案:

  • 有意在 Node.js 中运行(服务端脚本、CLI 工具、Electron 主进程):混淆时设置 target: 'node'。自我防护层会针对 Node 而非浏览器进行自我校准。
  • 针对混淆后的构建运行自动化测试 / E2E(Cypress、Playwright、Puppeteer、Selenium):生成一个 单独的、带 vmSelfDefending: false 的测试构建。该选项就是为破坏自动化而设计的,无法 为个别工具加入白名单。不兼容环境的完整列表请参阅 VM 自我防护
  • 在真实浏览器中运行却仍看到该错误:请确认没有扩展、devtools 脚本或包装页面 在 Hook 原生内置对象(ArrayFunction.prototypeJSON 等)。在把它当作缺陷之前,先在干净的浏览器配置文件中 复现。

步骤 2 - 缩小到单个函数

如果步骤 1 没能解决问题,那么错误就出在某一段具体的转换后代码里。切换到 vmTargetFunctionsMode: 'comment',并每次只给一个函数 添加 /* javascript-obfuscator:vm */,直到错误再次出现。错误重现时您所标记的那个函数就是罪魁祸首 —— 那就是您要发送给支持团队的最小复现。

步骤 3 - 提交缺陷报告

一旦确认这不是 target/自我防护不匹配的问题,并已缩小到某个函数,请发送邮件至 support@obfuscator.io。您提供以下内容越多,我们修复得就越快:

  • 完整的错误堆栈跟踪,与控制台中显示的完全一致 —— 而不是转述。
  • 以 JSON 形式提供的混淆器选项。 复制您使用的整个选项对象(或预设名称加上任何覆盖项)。 选项之间难以察觉的相互作用很常见,因此我们需要确切的选项集合。
  • 混淆器版本 - 显示在编辑器的右下角。
  • 环境 - 浏览器 + 版本、Node.js 版本、操作系统,以及运行时中任何异常之处(扩展、polyfill、 自定义内置对象)。
  • 最小复现 - 最好是步骤 2 中的那个函数,外加触发该错误所需的任何调用点。
  • 原始(混淆前)源码,如有可能。混淆后的输出在我们这边同样是不透明的;没有 输入,我们就只能逆向工程自己的字节码。