Công cụ phát triển Chrome: [VM] tệp từ javascript


139

Tôi đã thêm một điểm dừng trong tệp javascript của mình (jaydata.js) và đang nhấn "Bước qua cuộc gọi chức năng tiếp theo." Khi nó đến một dòng đó là:

},

một tệp khác có tiêu đề "[VM] (8312)" xuất hiện. Tôi tiếp tục nhấp vào "Bước qua cuộc gọi chức năng tiếp theo" và bây giờ màn hình của tôi là:

nhập mô tả hình ảnh ở đây

Những kịch bản kỳ lạ và bí ẩn này có tiêu đề "[VM] (XXXX" và chúng đến từ đâu?


1
Các tệp VM này cũng xuất hiện khi bạn đang chỉnh sửa các tệp đang gỡ lỗi cùng một lúc. Chrome mất đồng bộ và khi điểm dừng được đặt vào tệp, nó sẽ dừng mã ở một vị trí khác trong tệp trong bộ nhớ ở đâu đó. ví dụ: test.html sẽ cho phép điểm dừng nhưng khi Chrome dừng thì điều đó xảy ra tại VM99: test.html tại một số vị trí khác. Giải pháp là đóng Chrome đổi tên các tệp, ví dụ test2.html và bắt đầu lại. (Xóa lịch sử, bộ nhớ cache, v.v. không hoạt động và Chrome sẽ tiếp tục tải VM99: test.html nếu bạn thử điều đó.
QuentinUK

Câu trả lời:


112

[VM] (scriptId)không có ý nghĩa đặc biệt. Đó là một tên giả để giúp chúng tôi phân biệt mã không được liên kết trực tiếp với tên tệp, chẳng hạn như mã được tạo bằng evalvà bạn bè.

Trong quá khứ, tất cả các kịch bản này chỉ được dán nhãn (program).

Nếu bạn quan tâm, chỉ cần tra cứu "[VM]"mã nguồn của Chromium , bạn sẽ phát hiện ra rằng những con số này không có ý nghĩa quan trọng bên ngoài các công cụ dành cho nhà phát triển.

cập nhật 2015-06-25

[VM] (scriptId)đã được đổi tên thành VMscriptId một thời gian trước đây và đây là liên kết trực tiếp đến kết quả tìm kiếm trong trường hợp giá trị thay đổi một lần nữa.


1
Chrome sẽ nhấn tệp [VM] thay vì tệp js trực tiếp? Nếu vậy, tại sao?
Matt

@Matt Ý bạn là gì khi "Nhấn tệp [VM] thay vì tệp js trực tiếp"?
Rob W

@RobW coi thường; trình duyệt của tôi đã lưu bộ đệm js (mặc dù đã cập nhật bộ đệm cache của tôi).
Matt

1
[VM] (scriptId)đã được đổi tên thành VMscriptId một thời gian trước đây , nhưng tôi đã giữ câu trả lời ở trạng thái hiện tại để không làm mất hiệu lực câu hỏi. Liên kết tìm kiếm mã mới nhất là: cs.chromium.org/%22VM%5C%22%20+%22 (liên kết trực tiếp đến kết quả tìm kiếm trong trường hợp giá trị thay đổi một lần nữa: chromium.googlesource.com/chromium/blink/+/ tựa )
Rob W

Gần đây tôi đã gặp phải vấn đề này mà không có bất kỳ sự phản đối nào - nó dường như có liên quan đến việc sử dụng iFrames. Bằng chứng của tôi cho điều này là khi tôi đặt điểm dừng trên mã trong iFrame, tôi gặp vấn đề [VM], nhưng khi tôi mở iFrame trong cửa sổ riêng của mình, tôi sẽ thấy điểm dừng tốt. Chỉ cần chắc chắn nếu điều này đủ điều kiện là một trong những "người bạn" của eval như được mô tả trong câu trả lời.
Nguy hiểm

42

Bất cứ khi nào bạn tải nội dung HTML thông qua AJAX và nội dung đó chứa <script>các thẻ, tập lệnh sẽ được đánh giá bằng cách sử dụng eval () và được nhận dạng bởi chế độ xem Nguồn của Chrome dưới dạng tệp mới bắt đầu bằng 'VM'. Bạn luôn có thể chuyển đến tab Mạng, tìm yêu cầu AJAX và xem toàn bộ phản hồi HTML, bao gồm cả tập lệnh của bạn.


3
Điều này hút để gỡ lỗi mặc dù. Nếu tôi sử dụng thẻ script src=/test.jssau đó gây ra lỗi truy tìm test.js, thì truy nguyên chứa tên tệp chính xác, nhưng sau đó, stacktraces chứa ma thuật VM. Điều này khiến cho không thể lấy mã nguồn [từ cùng một nguồn gốc] cho các tệp trong stacktrace nhiều lần và bạn không thể lưu trữ chúng, vì bạn không biết tệp nào trong stacktraces trong tương lai. Điều này được cố định trong Dev Tools, nhưng không phải trong ứng dụng web.
Carl Smith

Đây có lẽ là lý do phổ biến nhất xảy ra trong các ứng dụng web hiện đại và một ví dụ điển hình khác về lý do tại sao chúng ta nên tách mã khỏi nội dung.
alexw

37

Khi sử dụng eval, javascript sẽ bị ném vào máy ảo gỡ lỗi Chrome. Để xem js được tạo bằng eval trong Nguồn gỡ lỗi Chrome, hãy đặt thuộc tính này ở cuối (cảm ơn Splaktar) của js:

//@ sourceURL=dynamicScript.js

Có thể gỡ lỗi JavaScript tải động bằng một số trình gỡ lỗi như WebKit, FireBug hoặc IE8 Developer Tool không?


9
Cú pháp đã thay đổi, bây giờ là: // # sourceURL = DynamicScript.js
ThiagoPonte

1
Nó cũng nên ở cuối JavaScript, không phải là bắt đầu.
Splaktar

Đã tìm kiếm một cái gì đó như thế này. Cảm ơn
David Kierans

Cảm ơn bạn! Nó rất hữu ích!
Đêm giao thừa

4
Trên các công cụ gỡ lỗi của Firefox, nó nóiUsing //@ to indicate sourceURL pragmas is deprecated. Use //# instead
Nighto 17/03/2016

6

Nếu bạn muốn gỡ lỗi các tệp JS được lập trình trong chrome, bạn có thể sử dụng debugger;câu lệnh, điều này nhanh hơn việc tìm kiếm tập lệnh của bạn ở đâu và cũng nhanh hơn so với việc tạo một tệp có nguồn .

Nó hoạt động như một điểm dừng và tự động xác định chính xác mã của bạn trong tab nguồn chrome bất cứ nơi nào bạn sử dụng debugger;câu lệnh.

Trình gỡ lỗi;

Lưu ý rằng nguồn của tập lệnh là tệp VMXXX.


Điều này không xuất hiện để trả lời câu hỏi.
Grant Miller

Xấu của tôi, tôi để cho mình đi qua các câu trả lời khác cho câu hỏi này.
Rodrirokr

1
Siêu! Đây chính xác là những gì tôi đang tìm kiếm. Không cần phải tìm ra VM mà mã của bạn được chèn bởi công cụ JS.
Oleg Bolden

mối liên hệ giữa câu trả lời này và câu hỏi là gì?
Ravindra Thorat

Với debugger;tuyên bố, anh ta có thể làm sáng tỏ nơi các kịch bản 'kỳ lạ và bí ẩn' mang tên "[VM] (XXXX" 'đang đến nếu anh ta muốn như vậy.
Rodrirokr

4

Tôi thấy VM được tạo từ một số tiện ích mở rộng của Chrome - họ chèn CSS / JS vào trang và Chrome sử dụng các tệp VM để chạy nó.


0

Khi bạn gỡ lỗi một nguồn cửa sổ con (iframe) mà sau đó được tải, tệp nguồn của bạn cũng sẽ nhận được tiền tố VM và nền màu vàng.


0

Tôi gặp vấn đề tương tự. Vấn đề là mã ứng dụng của tôi được coi là hộp đen một cách tình cờ. Khi tôi cố gắng bước vào mã, nó tiếp tục mở các VMXXXXtab này .

Sau khi xóa cài đặt hộp đen cho tệp js của ứng dụng, tôi có thể chuyển thành công mã của mình.


0

để ngăn chặn điều này

(function ()
 {
  var originalEval = eval;
  eval =
   function (script)
   {
    return originalEval(script + "\n//# sourceURL=blackbox-this.js");
   }
 }());

Và sau đó hộp đen ^.*blackbox-this.js$

Tương tự đối với setInterval / setTimeout khi nó nhận được một chuỗi (nhưng dù sao đó cũng là một cách làm tồi tệ phải không?))

Điều đó có làm việc cho bạn?


-1

Tôi đã có cùng một vấn đề khi tôi gỡ lỗi ứng dụng góc cạnh của tôi. Nhìn thấy quá nhiều tập lệnh VM không thể được hộp đen thực sự mất nhiều thời gian để gỡ lỗi. Tôi thay vì chọn mozilla / IE explorer để gỡ lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.