Documentazione
/
Ricette
/

Diagnosticare gli errori di runtime della VM

Diagnosticare gli errori di runtime della VM

Il codice offuscato con VM genera un errore a runtime: può trattarsi di un RangeError: Invalid array length, ma la stessa checklist si applica agli altri errori imprevisti che si manifestano soltanto dopo l'offuscamento. Si consiglia di seguire i passaggi seguenti nell'ordine indicato. Il primo intercetta di gran lunga la causa più frequente, mentre i successivi permettono di circoscrivere un bug reale.

Passaggio 1 - Verificare l'ambiente di esecuzione rispetto all'opzione target

La causa di gran lunga più frequente di Invalid array length e degli errori analoghi è la discrepanza fra l'opzione target e l'ambiente in cui il codice viene effettivamente eseguito, in combinazione con vmSelfDefending: true.

Ambienti in cui il fenomeno si verifica:

  • Node.js (esecuzione diretta del bundle offuscato tramite node)
  • Chrome / Chromium headless, PhantomJS
  • Puppeteer, Playwright, Cypress, Selenium / ChromeDriver, Nightmare
  • jsdom e altre emulazioni del DOM lato server
  • Qualsiasi ambiente in cui le funzioni native del browser siano state sottoposte a hooking o sostituite

Se il proprio ambiente di esecuzione compare in questo elenco, l'errore non è un bug ma il funzionamento previsto della protezione. Occorre scegliere la soluzione corrispondente al proprio caso:

  • Esecuzione intenzionale in Node.js (script lato server, strumento CLI, processo main di Electron): impostare target: 'node' durante l'offuscamento. Il livello self-defending si calibrerà su Node anziché sul browser.
  • Esecuzione di test automatici o E2E su una build offuscata (Cypress, Playwright, Puppeteer, Selenium): produrre una build di test separata con vmSelfDefending: false. L'opzione è progettata per impedire l'automazione e non può essere autorizzata per singoli strumenti. Per l'elenco completo degli ambienti incompatibili si veda VM Self Defending.
  • Esecuzione in un browser reale con l'errore ancora presente: verificare che nessuna estensione, script dei devtools o pagina wrapper stia effettuando l'hooking delle funzioni native (Array, Function.prototype, JSON e simili). Prima di considerarlo un bug, occorre riprodurre il problema in un profilo pulito.

Passaggio 2 - Circoscrivere il problema a una singola funzione

Se il Passaggio 1 non ha risolto il problema, l'errore risiede in una porzione specifica del codice trasformato. Passare a vmTargetFunctionsMode: 'comment' e aggiungere /* javascript-obfuscator:vm */ a una funzione alla volta finché l'errore non si ripresenta. La funzione contrassegnata al momento della ricomparsa dell'errore è quella responsabile e costituisce la riproduzione minima da inviare al supporto.

Passaggio 3 - Inviare una segnalazione di bug

Una volta accertato che non si tratta di una discrepanza fra target e self-defending e individuata la funzione responsabile, scrivere a support@obfuscator.io. Maggiore è il numero di elementi seguenti inclusi nella segnalazione, più rapida sarà la correzione:

  • Stack trace completo dell'errore, esattamente come compare nella console e non parafrasato.
  • Opzioni dell'offuscatore in formato JSON. Copiare l'intero oggetto delle opzioni utilizzato (oppure il nome del preset e le eventuali modifiche). Le interazioni sottili fra le opzioni sono frequenti, per cui è necessario disporre dell'insieme esatto.
  • Versione dell'offuscatore - indicata nell'angolo inferiore destro dell'editor.
  • Ambiente - browser e relativa versione, versione di Node.js, sistema operativo e qualsiasi particolarità dell'ambiente di esecuzione (estensioni, polyfill, funzioni native personalizzate).
  • Riproduzione minima - idealmente la singola funzione individuata al Passaggio 2, insieme al punto di chiamata necessario a provocare l'errore.
  • Il sorgente originale (precedente all'offuscamento), ove possibile. L'output offuscato è opaco anche per noi: senza l'input saremmo costretti a decompilare il nostro stesso bytecode.