Диагностика ошибок выполнения 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 плюс всё, что нужно для вызова, приводящего к ошибке.
- Исходный (до обфускации) код, если это возможно. Обфусцированный результат непрозрачен и для нас тоже; без входных данных мы реверс-инжинирим собственный байт-код.
