Chẩn đoán lỗi khi chạy của VM
Mã đã làm rối VM của bạn ném lỗi khi chạy - có thể là RangeError: Invalid array length, nhưng cùng danh sách kiểm tra này cũng
áp dụng cho các lỗi bất ngờ khác chỉ xuất hiện sau khi làm rối. Hãy làm theo các bước dưới đây theo thứ tự. Bước đầu tiên
bắt được nguyên nhân phổ biến áp đảo; các bước còn lại giúp khoanh vùng một lỗi thực sự.
Bước 1 - Đối chiếu môi trường chạy với tùy chọn target
Nguyên nhân phổ biến nhất của Invalid array length và các lỗi tương tự là sự lệch nhau giữa tùy chọn target và
môi trường mà mã thực sự chạy, kết hợp với vmSelfDefending: true.
Các môi trường kích hoạt điều này:
- Node.js (chạy trực tiếp bundle đã làm rối bằng
node) - Headless Chrome / Chromium, PhantomJS
- Puppeteer, Playwright, Cypress, Selenium / ChromeDriver, Nightmare
- jsdom và các bản giả lập DOM phía máy chủ khác
- Bất kỳ môi trường nào mà các builtin gốc của trình duyệt đã bị hook hoặc thay thế
Nếu môi trường chạy của bạn nằm trong danh sách đó, lỗi này là lớp bảo vệ đang hoạt động đúng thiết kế, không phải lỗi phần mềm. Hãy chọn cách xử lý phù hợp với trường hợp của bạn:
- Chạy trong Node.js một cách có chủ đích (script phía máy chủ, công cụ CLI, tiến trình main của Electron): hãy đặt
target: 'node'khi làm rối. Lớp self-defending sẽ tự hiệu chỉnh cho Node thay vì cho trình duyệt. - Chạy kiểm thử tự động / E2E trên một bản build đã làm rối (Cypress, Playwright, Puppeteer, Selenium): hãy tạo một bản build kiểm thử riêng với
vmSelfDefending: false. Tùy chọn này được thiết kế để phá vỡ tự động hóa; nó không thể được cho vào danh sách trắng cho từng công cụ riêng lẻ. Xem VM Self Defending để có danh sách đầy đủ các môi trường không tương thích. - Chạy trong trình duyệt thật nhưng vẫn thấy lỗi: hãy xác nhận không có tiện ích mở rộng, script devtools, hay trang bao nào đang hook các builtin gốc (
Array,Function.prototype,JSON, v.v.). Hãy tái hiện trong một profile sạch trước khi coi đó là một lỗi phần mềm.
Bước 2 - Khoanh vùng về một hàm duy nhất
Nếu Bước 1 không giải quyết được, lỗi nằm ở một đoạn mã đã biến đổi cụ thể. Hãy chuyển sang
vmTargetFunctionsMode: 'comment' và thêm /* javascript-obfuscator:vm */
cho từng hàm một cho đến khi lỗi xuất hiện trở lại. Hàm bạn đánh dấu ngay khi lỗi quay lại chính là thủ phạm -
đó là bản tái hiện tối giản mà bạn sẽ gửi cho bộ phận hỗ trợ.
Bước 3 - Gửi báo cáo lỗi
Khi bạn đã xác nhận đây không phải là sự lệch nhau giữa target và self-defending, và đã khoanh vùng được hàm gây lỗi, hãy gửi email cho
support@obfuscator.io. Bạn cung cấp càng nhiều thông tin dưới đây, chúng tôi càng sửa được nhanh:
- Toàn bộ stack trace của lỗi, đúng như nó hiển thị trong console - không phải diễn giải lại.
- Các tùy chọn làm rối dưới dạng JSON. Hãy sao chép toàn bộ đối tượng tùy chọn bạn đã dùng (hoặc tên preset cùng mọi giá trị ghi đè). Các tương tác tinh tế giữa các tùy chọn là chuyện thường gặp, nên chúng tôi cần đúng bộ tùy chọn đó.
- Phiên bản trình làm rối - hiển thị ở góc dưới bên phải của trình soạn thảo.
- Môi trường - trình duyệt + phiên bản, phiên bản Node.js, hệ điều hành, bất cứ điều gì khác thường về môi trường chạy (tiện ích mở rộng, polyfill, builtin tùy chỉnh).
- Bản tái hiện tối giản - lý tưởng nhất là hàm duy nhất từ Bước 2, cùng với đoạn mã gọi cần thiết để kích hoạt lỗi.
- Mã nguồn gốc (trước khi làm rối), nếu có thể. Đầu ra đã làm rối cũng khó đọc với chính chúng tôi; nếu không có đầu vào, chúng tôi phải dịch ngược bytecode của chính mình.
