Інструмент розробки Chrome: файл [VM] з JavaScript


139

Я додав точку перерви у своєму файлі javascript (jaydata.js) і натискав "Перейти до наступного виклику функції". Коли він потрапив до рядка, який був:

},

з'явився ще один файл під назвою "[VM] (8312)". Я продовжував натискати "Перехід до наступного виклику функції", і тепер мій екран:

введіть тут опис зображення

Які ці дивні та загадкові сценарії під назвою "[VM] (XXXX" і звідки вони беруться?


1
Ці файли VM також з’являються під час редагування файлів, які одночасно налагоджують. Chrome втрачає синхронізацію, і коли на файл буде поставлено точку розриву, він зупинить код на іншому місці файлу десь у пам'яті. наприклад, test.html дозволить точку розриву, але коли Chrome зупиняється, це робить у VM99: test.html в іншому положенні. Рішення полягає в тому, щоб закрити перейменування файлів Chrome, наприклад, test2.html, і почати заново. (Очищення історії, кешу тощо не працює, і Chrome продовжить завантажувати VM99: test.html, якщо ви спробуєте це.
QuentinUK

Відповіді:


112

[VM] (scriptId)не має особливого значення. Це ім'я-манекен, яке допоможе нам розрізнити код, який не пов'язаний безпосередньо з ім'ям файлу, наприклад код, створений за допомогою evalта друзі

У минулому всі ці сценарії були просто марковані (program).

Якщо вам цікаво, просто подивіться "[VM]"на вихідний код Chromium , ви виявите, що ці номери не мають значущого значення поза інструментами розробника.

оновлення 2015-06-25

[VM] (scriptId)був перейменований на VMscriptId деякий час тому , і ось пряме посилання на результат пошуку, якщо значення знову зміниться.


1
Чи потрапив би Chrome у файл [VM] замість живого js-файлу? Якщо так, то чому?
Метт

@Matt Що ви маєте на увазі під «натисніть на файл [VM] замість живого js-файлу»?
Роб Ш

@ Зневаги до RobW; мій браузер кешував файл js (незважаючи на те, що я оновив програму кеша).
Метт

1
[VM] (scriptId)був перейменований на VMscriptId деякий час тому , але я зберігав відповідь у її нинішньому стані, щоб не визнати недійсним питання. Останнє посилання на пошук коду : cs.chromium.org/%22VM%5C%22%20+%22 (пряме посилання на результат пошуку у випадку, якщо значення знову зміниться: chromium.googlesource.com/chromium/blink/+/… )
Rob W

Нещодавно я стикався з цією проблемою без будь-яких оцінок - вона, мабуть, пов’язана з використанням iFrames. Мої докази цього свідчать про те, що коли в iFrame я встановлюю точку перерви на код, я отримую проблему [VM], але коли я відкриваю iFrame у власному вікні, я потрапляю в точку перелому. Просто переконайтесь, що це кваліфікується як один із "друзів" eval, як описано у відповіді.
Небезпека

42

Кожного разу, коли ви завантажуєте вміст HTML через AJAX, і цей вміст містить <script>теги, сценарій буде оцінюватися за допомогою eval () і розпізнаватись у поданні джерел Chrome як новий файл, починаючи з "VM". Ви завжди можете перейти на вкладку «Мережа», знайти запит AJAX та переглянути всю відповідь HTML, включаючи ваш сценарій.


3
Однак це відстійно для налагодження. Якщо я використовую тег скрипта, src=/test.jsтоді викликаю помилку, яка простежується назад до test.js, прослідку містить правильне ім'я файлу, але після цього стек-треки містять магію VM. Це унеможливлює отримання вихідного коду [з того самого походження] для файлів у стек-трасі не один раз, і ви не можете їх кешувати, оскільки ви не знаєте, який саме файл є у майбутніх стек-трасах. Це зафіксовано в Dev Tools, але не у веб-сайтах.
Карл Сміт

Це, мабуть, найпоширеніша причина, що трапляється в сучасних веб-додатках, і ще один хороший приклад того, чому нам слід відокремлювати код від контенту.
alexw

37

Під час використання eval javascript потрапляє у віртуальну версію відладчика Chrome. Для того щоб переглянути js, створений за допомогою eval у джерелах налагодження Chrome, встановіть цей атрибут у кінці (дякую Splaktar) js:

//@ sourceURL=dynamicScript.js

Чи можливо налагодження динамічного завантаження JavaScript деяким налагоджувачем, таким як WebKit, FireBug або IE8 Developer Tool?


9
Синтаксис змінився, тепер його: // # sourceURL = dinamiScript.js
ThiagoPonte

1
Він також повинен бути в кінці JavaScript, а не на початку.
Splaktar

Шукали щось подібне. Спасибі
David Kierans

Дякую! Це так корисно!
Єва, червень

4
Про інструменти для налагодження Firefox написаноUsing //@ to indicate sourceURL pragmas is deprecated. Use //# instead
Nighto

6

Якщо ви хочете налагоджувати програмно введені файли JS в chrome, ви можете використовувати debugger;оператор, це швидше, ніж знайти, де ваш скрипт, а також швидше, ніж генерувати файл з sourceurl .

Він працює як точка розриву і автоматично визначає ваш код на вкладці джерела хромування, де б ви не використовували debugger;оператор.

Налагоджувач;

Зауважте, що джерелом сценарію є файл VMXXX.


Здається, це не дає відповіді на запитання.
Грант Міллер

Моє погано, я відпустив інші відповіді на це питання.
Родрірокр

1
Супер! Це саме те, що я шукав. Не потрібно з'ясовувати, в який VM ваш код був вставлений двигуном JS.
Олег Болден

який зв’язок між цією відповіддю та питанням?
Равіндра Торат

За допомогою цього debugger;твердження він може демістифікувати, звідки надходять таємничі «дивні та таємничі сценарії під назвою« [VM] (XXXX »), якщо він цього хоче.
Rodrirokr

4

Я виявив, що VM генерується з деяких розширень Chrome - вони вставляють CSS / JS на сторінку, а Chrome використовує файли VM для його запуску.


0

Коли ви налагоджуєте джерело дочірнього вікна (iframe), яке згодом вивантажується, ваш вихідний файл також отримає префікс VM та жовтий фон.


0

Я зіткнувся з тією ж проблемою. Проблема полягає в тому, що код мого додатка випадково вважався чорними скриньками. Коли я намагався вступити в код, він продовжував відкривати ці VMXXXXвкладки.

Після видалення налаштування чорної скриньки для js-файлу мого додатка я міг успішно переглядати свій код.


0

для запобігання цьому

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

А потім blackbox ^.*blackbox-this.js$

Те саме для setInterval / setTimeout, коли він отримує рядок (але це все одно погана практика, правда?;))

Це працює для вас?


-1

У мене виникло те саме питання, коли я налагоджував свою кутову програму. Бачачи занадто багато скриптів VM, які не вдалося вкласти в чорний код, насправді знадобилося довго налагоджувати. Я скоріше вибрав mozilla / IE Explorer для налагодження.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.