Документация
/
Рецепты
/

Диагностика ошибок выполнения VM

Диагностика ошибок выполнения VM

Ваш VM-обфусцированный код падает во время выполнения — это может быть RangeError: Invalid array length, но тот же чек-лист подходит и для других неожиданных ошибок, которые появляются только после обфускации. Пройдите по шагам ниже по порядку. Первый отсекает подавляющее большинство типичных причин; остальные помогают локализовать настоящий баг.

Шаг 1 — сверьте среду выполнения с опцией target

Самая частая причина ошибки Invalid array length и подобных — несоответствие между опцией target и средой, в которой код действительно выполняется, в сочетании с vmSelfDefending: true.

Среды, в которых это срабатывает:

  • Node.js (запуск обфусцированного бандла напрямую через node)
  • Headless Chrome / Chromium, PhantomJS
  • Puppeteer, Playwright, Cypress, Selenium / ChromeDriver, Nightmare
  • jsdom и другие серверные эмуляции DOM
  • Любая среда, в которой встроенные объекты браузера были перехвачены или подменены

Если ваша среда выполнения в этом списке, ошибка — это работающая как задумано защита, а не баг. Выберите решение под свой случай:

  • Запуск в Node.js намеренно (серверный скрипт, CLI-инструмент, главный процесс Electron): задайте target: 'node' при обфускации. Слой самозащиты откалибруется под Node вместо браузера.
  • Запуск автоматических / E2E-тестов против обфусцированной сборки (Cypress, Playwright, Puppeteer, Selenium): соберите отдельную тестовую сборку с vmSelfDefending: false. Опция специально ломает автоматизацию; отдельные инструменты нельзя добавить в белый список. Полный перечень несовместимых сред см. в VM Self Defending.
  • Запуск в настоящем браузере, но ошибка всё равно есть: убедитесь, что ни одно расширение, скрипт devtools или страница-обёртка не перехватывают встроенные объекты (Array, Function.prototype, JSON и т. д.). Воспроизведите в чистом профиле, прежде чем считать это багом.

Шаг 2 — сузьте область до одной функции

Если Шаг 1 не помог, ошибка кроется в конкретном фрагменте преобразованного кода. Переключитесь на vmTargetFunctionsMode: 'comment' и добавляйте /* javascript-obfuscator:vm */ по одной функции за раз, пока ошибка не появится снова. Функция, которую вы пометили в момент возврата ошибки, и есть виновник — это минимальный пример воспроизведения, который вы отправите в поддержку.

Шаг 3 — отправьте отчёт об ошибке

Убедившись, что дело не в несоответствии target/самозащиты, и локализовав функцию, напишите на support@obfuscator.io. Чем больше из перечисленного вы приложите, тем быстрее мы это исправим:

  • Полный стек ошибки, ровно как он выглядит в консоли, — не пересказ.
  • Опции обфускатора в виде JSON. Скопируйте весь объект опций, который вы использовали (или название пресета плюс любые переопределения). Тонкие взаимодействия между опциями встречаются часто, поэтому нам нужен точный набор.
  • Версия обфускатора — показана в правом нижнем углу редактора.
  • Среда — браузер и версия, версия Node.js, ОС, всё необычное в среде выполнения (расширения, полифилы, пользовательские встроенные объекты).
  • Минимальное воспроизведение — в идеале та самая функция из Шага 2 плюс всё, что нужно для вызова, приводящего к ошибке.
  • Исходный (до обфускации) код, если это возможно. Обфусцированный результат непрозрачен и для нас тоже; без входных данных мы реверс-инжинирим собственный байт-код.