Chrome Geliştirme Aracı: JavaScript'ten [VM] dosyası


139

Javascript dosyama bir kesme noktası ekledim (jaydata.js) ve "Sonraki işlev çağrısına adım at" düğmesine basıyordu. Aşağıdaki gibi bir çizgiye ulaştığında:

},

"[VM] (8312)" başlıklı başka bir dosya çıktı. "Bir sonraki işlev çağrısına git" i tıklamaya devam ettim ve şimdi ekranım:

resim açıklamasını buraya girin

"[VM] (XXXX" başlıklı bu garip ve gizemli senaryolar nedir ve nereden geliyorlar?


1
Bu VM dosyaları, aynı anda hata ayıklayan dosyaları düzenlerken de görüntülenir. Chrome senkronizasyonu kaybeder ve dosyaya bir kesme noktası yerleştirildiğinde, bellekteki dosyadaki başka bir konumdaki kodu durur. örneğin test.html bir kesme noktasına izin verir, ancak Chrome durduğunda bunu VM99: test.html'de başka bir konumda yapar. Çözüm, Chrome'u kapatmak için dosyaları yeniden adlandırın, örneğin test2.html ve yeniden başlayın. (Geçmişi, önbelleği vb. Silmek işe yaramaz ve bunu denerseniz Chrome VM99: test.html dosyasını yüklemeye devam eder.
QuentinUK

Yanıtlar:


112

[VM] (scriptId)özel bir anlamı yok. Bir dosya adına doğrudan bağlı olmayan kodu (örneğin, oluşturulan kod evalve arkadaşlar gibi) ayırt etmemize yardımcı olacak sahte bir addır .

Geçmişte, tüm bu senaryolar sadece etiketlenmişti (program).

Eğer ilgilenen ediyorsanız, sadece bakmak "[VM]"Krom kaynak kodunda , bu sayılar geliştirici araçları dışında anlamlı bir anlamı olduğunu keşfedeceksiniz.

güncelleme 2015-06-25

[VM] (scriptId)VMscriptId bir süre önce yeniden adlandırıldı ve işte, değerin tekrar değişmesi durumunda arama sonucuna doğrudan bağlantı .


1
Chrome, canlı js dosyası yerine [VM] dosyasına çarpar mı? Öyleyse neden?
Matt

@Matt "Canlı js dosyası yerine [VM] dosyasına vur" ile ne demek istiyorsun?
Rob W

@RobW dikkate almayın; tarayıcım (önbellek bozucu güncellenmiş olmasına rağmen) js dosyasını önbelleğe alıyordu.
Matt

1
[VM] (scriptId)VMscriptId bir süre önce yeniden adlandırıldı , ancak soruyu geçersiz kılmamak için cevabını mevcut durumunda tuttum. En son kod arama bağlantısı : cs.chromium.org/%22VM%5C%22%20+%22 (değerin tekrar değişmesi durumunda arama sonucuna doğrudan bağlantı: chromium.googlesource.com/chromium/blink/+/… )
Rob W

Kısa bir süre önce herhangi bir değerlendirme yapmadan bu sorunla karşılaştım - iFrames kullanımı ile ilgili gibi görünüyor. Bunun için kanıtım, bir iFrame'deki kod üzerinde bir kesme noktası belirlediğimde, [VM] problemini alıyorum, ancak iFrame'i kendi penceresinde açtığımda, kesme noktasına iyice çarpıyorum. Bunun, evalün "arkadaşlarından" biri olarak cevap olarak tanımlanıp nitelendirilmediğinden emin olun.
Tehlike

42

HTML içeriğini AJAX üzerinden yüklediğinizde ve bu içerik <script>etiket içeriyorsa , komut dosyası eval () kullanılarak değerlendirilir ve Chrome'un Kaynaklar görünümü tarafından 'VM' ile başlayan yeni bir dosya olarak tanınır. Her zaman Ağ sekmesine gidebilir, AJAX isteğini bulabilir ve HTML yanıtını komut dosyanız da dahil olmak üzere tam olarak görüntüleyebilirsiniz.


3
Bu hata ayıklama için berbat. Eğer bir komut dosyası etiketini src=/test.jskullanırsam, test.js'ye kadar giden bir hataya neden olursam, geri izleme doğru dosya adını içerir, ancak bundan sonra yığın izleri VM sihrini içerir. Bu, yığın izindeki dosyalar için [aynı kaynaktan) kaynak kodunu bir kereden fazla almayı imkansız hale getirir ve gelecekteki yığınların hangi dosyanın hangisi olduğunu bilmediğiniz için bunları önbelleğe alamazsınız. Bu, Dev Tools'da düzeltildi, ancak webapps'de düzeltilmedi.
Carl Smith

Bu muhtemelen modern web uygulamalarında en yaygın neden ve kodu içerikten ayırmamızın iyi bir örneği.
alexw

37

Eval kullanırken, javascript Chrome Hata Ayıklayıcı VM'lerine atılır. Chrome Hata Ayıklayıcı Kaynakları altında eval ile oluşturulan js görüntülemek için js sonunda bu özelliği (teşekkürler Splaktar) ayarlayın:

//@ sourceURL=dynamicScript.js

Dinamik yükleme JavaScript'inde WebKit, FireBug veya IE8 Geliştirici Aracı gibi bazı hata ayıklayıcılar tarafından hata ayıklamak mümkün müdür?


9
Sözdizimi değişti, şimdi: // # sourceURL = dynamicScript.js
ThiagoPonte

1
Ayrıca JavaScript'in sonunda değil başlangıcında olmalıdır.
Splaktar

Böyle bir şey arıyordum. Teşekkürler
David Kierans

Teşekkür ederim! Çok faydalı!
Eve juan

4
Firefox hata ayıklama araçlarında, diyorUsing //@ to indicate sourceURL pragmas is deprecated. Use //# instead
Nighto

6

Chrome'da programlı olarak enjekte edilen JS dosyalarında hata ayıklamak istiyorsanız, debugger;ifadeyi kullanabilirsiniz , bu komut dosyanızın nerede olduğunu bulmaktan daha hızlıdır ve sourceurl ile bir dosya oluşturmaktan daha hızlıdır .

Bir kesme noktası gibi çalışır ve debugger;ifadeyi kullandığınız her yerde krom kaynağı sekmesinde kodunuzu otomatik olarak saptar .

Debugger;

Komut dosyasının kaynağının bir VMXXX dosyası olduğuna dikkat edin.


Bu soruya cevap vermiyor gibi görünüyor.
Grant Miller

Kötülerim, bu sorunun diğer cevaplarını kendim bıraktım.
Rodrirokr

1
Süper! Tam da aradığım şey buydu. Kodunuzun JS motoru tarafından hangi VM'ye eklendiğini bulmanıza gerek yoktur.
Oleg Bolden

bu cevap ile soru arasındaki bağlantı nedir?
Ravindra Thorat

Açıklama ile, debugger;"[VM] (XXXX" 'başlıklı gizemli' garip ve gizemli senaryoların isterse nereden geldiğini
kavrayabilir

4

VM'nin bazı Chrome uzantılarından oluşturulduğunu gördüm - CSS / JS'yi sayfaya eklediler ve Chrome, çalıştırmak için VM dosyalarını kullanıyor.


0

Daha sonra kaldırılan bir alt pencere (iframe) kaynağında hata ayıkladığınızda, kaynak dosyanız VM önekini ve sarı arka planını da alır.


0

Ben de aynı problemle karşılaştım. Sorun, uygulamamın kodunun yanlışlıkla blackbox olarak kabul edilmesidir. Kod içine adım atmaya çalıştığımda, bu VMXXXXsekmeleri açmaya devam etti .

Uygulamamın js dosyası için kara kutu ayarını kaldırdıktan sonra, kodumu başarıyla geçebilirim.


0

bunu önlemek için

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

Ve sonra kara kutu ^.*blackbox-this.js$

Bir dize aldığında setInterval / setTimeout için aynıdır (ancak yine de kötü bir uygulamadır, değil mi?))

Bu senin için uygun mu?


-1

Açısal uygulamamda hata ayıklarken de aynı sorunu yaşadım. Kara kutuya eklenemeyen çok fazla VM komut dosyası görmek hata ayıklamak için çok uzun sürüyordu. Ben hata ayıklamak için Mozilla / IE explorer seçti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.