Dodałem punkt przerwania do mojego pliku javascript (jaydata.js) i naciskałem „Przejdź do następnego wywołania funkcji”. Kiedy dotarło do linii, która brzmiała:
},
pojawił się inny plik zatytułowany „[VM] (8312)”. Ciągle klikałem „Przejdź do następnego wywołania funkcji”, a teraz mój ekran to:
Co to za dziwne i tajemnicze skrypty zatytułowane „[VM] (XXXX”) i skąd się one biorą?
debugging
google-chrome-devtools
AllieCat
źródło
źródło
Odpowiedzi:
[VM] (scriptId)
nie ma specjalnego znaczenia. Jest to fikcyjna nazwa, która pomaga nam odróżnić kod, który nie jest bezpośrednio powiązany z nazwą pliku, na przykład kod utworzony przy użyciueval
i znajomych.W przeszłości wszystkie te skrypty były po prostu oznaczone
(program)
.Jeśli jesteś zainteresowany, po prostu spójrz
"[VM]"
na kod źródłowy Chromium , a odkryjesz, że te liczby nie mają znaczącego znaczenia poza narzędziami programistycznymi.aktualizacja 2015-06-25
[VM] (scriptId)
została zmieniona naVMscriptId
jakiś czas temu , a tutaj jest bezpośredni link do wyniku wyszukiwania na wypadek ponownej zmiany wartości.źródło
[VM] (scriptId)
została zmieniona naVMscriptId
jakiś czas temu , ale zachowałem odpowiedź w jej obecnym stanie, aby nie unieważnić pytania. Najnowszy link do wyszukiwania kodów to: cs.chromium.org/%22VM%5C%22%20+%22 (bezpośredni link do wyniku wyszukiwania na wypadek ponownej zmiany wartości: chromium.googlesource.com/chromium/blink/+/… )Za każdym razem, gdy ładujesz zawartość HTML przez AJAX, a ta treść zawiera
<script>
tagi, skrypt zostanie oceniony za pomocą funkcji eval () i rozpoznany w widoku Źródła Chrome jako nowy plik zaczynający się od „VM”. Zawsze możesz przejść do zakładki Sieć, znaleźć żądanie AJAX i wyświetlić całą odpowiedź HTML, w tym swój skrypt.źródło
src=/test.js
użyję tagu skryptu z, a następnie spowoduję błąd, który prowadzi do pliku test.js, plik traceback zawiera poprawną nazwę pliku, ale później ślady stosu zawierają magię maszyny wirtualnej. Uniemożliwia to pobranie kodu źródłowego [z tego samego źródła] dla plików w stacktrace więcej niż jeden raz i nie możesz ich buforować, ponieważ nie wiesz, który plik jest który w przyszłych stacktrace. Zostało to naprawione w narzędziach deweloperskich, ale nie w aplikacjach internetowych.Podczas korzystania z eval kod javascript jest wrzucany do maszyn wirtualnych Chrome Debugger. Aby wyświetlić js utworzony za pomocą eval w Chrome Debugger Sources, ustaw ten atrybut na końcu (dzięki Splaktar) js:
Czy możliwe jest debugowanie dynamicznego ładowania JavaScript przez jakiś debugger, taki jak WebKit, FireBug lub IE8 Developer Tool?
źródło
Using //@ to indicate sourceURL pragmas is deprecated. Use //# instead
Jeśli chcesz debugować programowo wstrzyknięte pliki JS w chrome, możesz użyć
debugger;
instrukcji, jest to szybsze niż znalezienie skryptu, a także szybsze niż generowanie pliku z sourceurl .Działa jak punkt przerwania i automatycznie wskazuje twój kod na karcie źródła chrome, gdziekolwiek używasz
debugger;
instrukcji.Zwróć uwagę, że źródłem skryptu jest plik VMXXX.
źródło
debugger;
stwierdzenia może zdemistyfikować, skąd pochodzą tajemnicze „dziwne i tajemnicze skrypty zatytułowane„ [VM] (XXXX ”), jeśli sobie tego życzy.Odkryłem, że maszyna wirtualna jest generowana z niektórych rozszerzeń Chrome - wstawiają one CSS / JS na stronę, a Chrome używa plików VM do jej uruchomienia.
źródło
Podczas debugowania źródła okna podrzędnego (iframe), które jest następnie usuwane, plik źródłowy otrzyma również prefiks maszyny wirtualnej i żółte tło.
źródło
Napotkałem ten sam problem. Problem polega na tym, że kod mojej aplikacji został przypadkowo uznany za czarne skrzynki. Kiedy próbowałem wejść do kodu, ciągle otwierał te
VMXXXX
karty.Po usunięciu ustawienia czarnej skrzynki dla pliku js mojej aplikacji mogłem pomyślnie przejść przez kod.
źródło
aby temu zapobiec
A potem czarna skrzynka
^.*blackbox-this.js$
To samo dotyczy setInterval / setTimeout, gdy otrzyma ciąg znaków (ale i tak jest to zła praktyka, prawda?;))
Czy to Ci pasuje?
źródło
Miałem ten sam problem, gdy debugowałem moją aplikację kątową. Widzenie zbyt wielu skryptów maszyn wirtualnych, których nie można było umieścić w czarnej skrzynce, trwało naprawdę długo. Do debugowania wolę raczej przeglądarkę Mozilla / IE.
źródło