文档
/

故障排查

/

诊断 VM 运行时错误

诊断 VM 运行时错误

请按顺序完成以下步骤。每一步都会先排除一个常见原因,免得您花时间去缩小出错代码的范围。

1. 排除高级防护

与您的代码对不上的错误,最常见的是 RangeError: Invalid array length,通常意味着生产构建运行在了不应运行生产构建的地方。VM Self Defending 和 VM Debug Protection 会在测试运行器及其他自动化工具、无头浏览器、运行浏览器构建的 Node.js 或 jsdom,以及打开了 DevTools 的浏览器中故意让代码失效。请先检查出错的代码运行在哪里。

首先排除高级防护(VM Self Defending、VM Debug Protection、VM Domain Lock)的影响:使用应用了测试与 CI中覆盖项的测试构建来复现失败。如果测试构建运行正常,说明是防御在对您的工具或环境作出反应,而不是您的代码被破坏了。

2. 检查运行环境兼容性并定位出错的函数

检查 target、构建流程以及所有环境声明是否与代码的实际运行位置一致。

如果构建报告了 VMNoFunctionsToVirtualize 等覆盖范围警告,请参阅 VM 混淆,了解 VM 保护覆盖哪些内容。

把失败用例缩减到仍能复现问题的最小函数和调用点。使用 comment 模式缩小被虚拟化的函数范围。

如果将 vmBytecodeArrayEncoding 与 vmBytecodeArrayEncodingKeyGetter 一起使用,getter 必须返回与构建时完全相同的密钥。同步 getter 要求在混淆代码运行之前就已设置好密钥。返回 Promise 的 getter 需要 vmAsyncExecutor。缺少其中任何一项,字节码都无法解码。

运行环境兼容性 · Bytecode Array Encoding 密钥

3. 提交错误报告

发送邮件至 support@obfuscator.io。以下信息提供得越多,我们修复得就越快:

  • 完整的错误堆栈,与控制台中显示的完全一致,不要转述。
  • JSON 格式的混淆器选项。 复制您使用的完整选项对象(或预设名称加上所有覆盖项)。选项之间的微妙相互作用很常见,所以我们需要确切的选项集合。
  • 构建警告(如有):每条警告的 type、message 和 functionName。
  • 混淆器版本,显示在编辑器下方控制台的版本选择器中。对于直接调用 API,它是 result 或 chunk_end 消息中的 version 字段。使用 javascript-obfuscator 包时,它会出现在进度消息(Obfuscating with VM protection (vX.Y.Z)...)中,CLI 会打印该消息,obfuscatePro 会把它传给 onProgress 回调。
  • 运行环境:浏览器及版本、Node.js 版本、操作系统,以及运行时的任何特殊之处(扩展、polyfill、自定义内置对象)。
  • 最小复现:最好是第 2 节中得到的那个单一函数,再加上触发错误所需的调用点。
  • 原始(混淆前)源码,如有可能请提供。混淆后的输出对我们来说同样难以理解;没有输入,我们就只能逆向自己的字节码。

如果源码是专有的,请在邮件中说明,我们可以在您分享之前签署 NDA。如果看不到产生错误字节码的输入模式,我们就无法可靠地诊断 VM 缺陷,所以这一来一回是值得的。