Chrome Development Tool: file [VM] da JavaScript


139

Ho aggiunto un punto di interruzione nel mio file javascript (jaydata.js) e stavo premendo "Passa alla prossima chiamata di funzione". Quando arrivò a una linea che era:

},

un altro file intitolato "[VM] (8312)" è apparso. Continuavo a fare clic su "Passa alla prossima chiamata di funzione" e ora il mio schermo è:

inserisci qui la descrizione dell'immagine

Quali sono questi strani e misteriosi script intitolati "[VM] (XXXX" e da dove provengono?


1
Questi file VM compaiono anche quando si modificano file che eseguono il debug contemporaneamente. Chrome perde la sincronizzazione e quando viene inserito un punto di interruzione nel file, il codice verrà interrotto in un'altra posizione nel file in memoria da qualche parte. ad esempio test.html consentirà un punto di interruzione, ma quando Chrome si ferma lo fa su VM99: test.html in un'altra posizione. La soluzione è chiudere Chrome rinominare i file, ad esempio test2.html, e ricominciare. (La cancellazione della cronologia, della cache, ecc. Non funziona e Chrome continuerà a caricare VM99: test.html se lo provi.
QuentinUK

Risposte:


112

[VM] (scriptId)non ha un significato speciale. È un nome fittizio che ci aiuta a distinguere il codice che non è direttamente legato al nome di un file, come il codice creato usando evale gli amici.

In passato, tutti questi script erano appena etichettati (program).

Se sei interessato, cerca "[VM]"nel codice sorgente di Chromium , scoprirai che questi numeri non hanno un significato significativo al di fuori degli strumenti di sviluppo.

aggiornamento 25/06/2015

[VM] (scriptId)è stato rinominato VMscriptId tempo fa ed ecco il link diretto al risultato della ricerca nel caso in cui il valore cambi di nuovo.


1
Chrome avrebbe colpito il file [VM] invece del file js live? Se è così, perché?
Matt,

@Matt Cosa intendi con "Hit il file [VM] invece del file js live"?
Rob W

@RobW disregard; il mio browser stava memorizzando nella cache il file js (nonostante abbia aggiornato il mio cache buster).
Matt,

1
[VM] (scriptId)è stato rinominato VMscriptId qualche tempo fa , ma ho mantenuto la risposta nel suo stato attuale per non invalidare la domanda. L'ultimo collegamento di ricerca di codice è: cs.chromium.org/%22VM%5C%22%20+%22 (collegamento diretto al risultato della ricerca nel caso in cui il valore cambi di nuovo: chromium.googlesource.com/chromium/blink/+/… )
Rob W,

Di recente ho riscontrato questo problema senza alcuna valutazione: sembra essere correlato all'uso di iFrames. La mia prova per questo è che quando imposto un breakpoint sul codice in un iFrame, ottengo il problema [VM], ma quando apro l'iFrame nella sua finestra, vengo colpito il breakpoint proprio bene. Sicuramente se questo si qualifica come uno degli "amici" di eval come descritto nella risposta.
Pericolo

42

Ogni volta che carichi contenuto HTML tramite AJAX e tale contenuto contiene <script>tag, lo script verrà valutato utilizzando eval () e riconosciuto dalla vista Sorgenti di Chrome come un nuovo file che inizia con "VM". Puoi sempre andare alla scheda Rete, trovare la richiesta AJAX e visualizzare la risposta HTML nella sua interezza, incluso lo script.


3
Questo fa schifo per il debug però. Se uso un tag di script con src=/test.jsquindi causa un errore che risale a test.js, il traceback contiene il nome file corretto, ma in seguito, stacktraces contiene la magia della VM. Ciò rende impossibile ottenere il codice sorgente [dalla stessa origine] per i file nello stacktrace più di una volta e non è possibile memorizzarli nella cache, poiché non si conosce quale file è quale nelle future stackstace. Questo problema è stato risolto in Dev Tools, ma non in webapps.
Carl Smith,

Questo è probabilmente il motivo più comune che accade nelle moderne applicazioni Web e un altro buon esempio del perché dovremmo separare il codice dal contenuto.
alexw

37

Quando si utilizza eval, il javascript viene inserito nelle macchine virtuali di debugger di Chrome. Per visualizzare js creato con eval in Sorgenti debugger di Chrome, imposta questo attributo alla fine (grazie a Splaktar) di js:

//@ sourceURL=dynamicScript.js

È possibile eseguire il debug del caricamento dinamico JavaScript da alcuni debugger come WebKit, FireBug o IE8 Developer Tool?


9
La sintassi è cambiata, ora è: // # sourceURL = dynamicScript.js
ThiagoPonte,

1
Dovrebbe anche essere alla fine di JavaScript, non all'inizio.
Splaktar,

Ho cercato qualcosa del genere. Grazie
David Kierans,

Grazie! È così utile!
Eve juan,

4
Sugli strumenti di debug di Firefox, diceUsing //@ to indicate sourceURL pragmas is deprecated. Use //# instead
Nighto

6

Se desideri eseguire il debug dei file JS iniettati a livello di programmazione in Chrome, puoi utilizzare l' debugger;istruzione, questo è più veloce della ricerca della posizione dello script e anche più veloce della generazione di un file con sourceurl .

Funziona come un punto di interruzione e individua automaticamente il tuo codice nella scheda sorgente di Chrome ovunque tu usi l' debugger;istruzione.

Debugger;

Si noti che l'origine dello script è un file VMXXX.


Questo non sembra rispondere alla domanda.
Grant Miller,

Mio male, mi sono lasciato andare dalle altre risposte a questa domanda.
Rodrirokr,

1
Super! Questo è esattamente quello che stavo cercando. Non è necessario scoprire in quale VM il tuo codice è stato inserito dal motore JS.
Oleg Bolden,

qual è la connessione tra questa risposta e la domanda?
Ravindra Thorat,

Con l' debugger;affermazione può demistificare da dove provengono le misteriose "strane e misteriose sceneggiature intitolate" [VM] (XXXX "" se lo desidera.
Rodrirokr,

4

Ho scoperto che la VM viene generata da alcune estensioni di Chrome: inseriscono CSS / JS nella pagina e Chrome utilizza i file VM per eseguirla.


0

Quando esegui il debug di una sorgente della finestra figlio (iframe) che viene successivamente scaricata, il tuo file sorgente otterrà anche il prefisso VM e lo sfondo giallo.


0

Ho riscontrato lo stesso problema. Il problema è che il codice della mia app è stato considerato casualmente blackbox. Quando ho provato ad entrare nel codice, ha continuato ad aprire queste VMXXXXschede.

Dopo aver rimosso l'impostazione della blackbox per il file js della mia app, ho potuto scorrere con successo il mio codice.


0

per evitare questo

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

E poi blackbox ^.*blackbox-this.js$

Lo stesso vale per setInterval / setTimeout quando ottiene una stringa (ma è comunque una cattiva pratica, giusto?;))

Funziona per te?


-1

Ho avuto lo stesso problema durante il debug della mia applicazione angolare. Vedere troppi script di macchine virtuali che non potevano essere inseriti nella blackbox impiegava davvero molto tempo per eseguire il debug. Ho preferito scegliere mozilla / IE explorer per eseguire il debug.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.