Outil de développement Chrome: fichier [VM] de javascript

139

J'ai ajouté un point d'arrêt dans mon fichier javascript (jaydata.js) et j'appuyais sur "Passer à l'appel de fonction suivant". Quand il est arrivé à une ligne qui était:

},

un autre fichier intitulé "[VM] (8312)" est apparu. J'ai continué à cliquer sur "Passer à l'appel de fonction suivant" et maintenant mon écran est:

entrez la description de l'image ici

Quels sont ces scripts étranges et mystérieux intitulés "[VM] (XXXX" et d'où viennent-ils?

AllieCat
la source
1
Ces fichiers VM apparaissent également lorsque vous modifiez des fichiers en cours de débogage en même temps. Chrome perd la synchronisation et lorsqu'un point d'arrêt est placé sur le fichier, il arrêtera le code à une autre position dans le fichier en mémoire quelque part. par exemple, test.html autorisera un point d'arrêt, mais lorsque Chrome s'arrête, il le fera à VM99: test.html à une autre position. La solution est de fermer Chrome, de renommer les fichiers, par exemple test2.html, et de recommencer. (La suppression de l'historique, du cache, etc. ne fonctionne pas et Chrome continuera à charger le VM99: test.html si vous essayez cela.
QuentinUK

Réponses:

112

[VM] (scriptId)n'a pas de signification particulière. C'est un nom factice pour nous aider à distinguer le code qui n'est pas directement lié à un nom de fichier, tel que le code créé avec evaland friends.

Dans le passé, tous ces scripts étaient simplement étiquetés (program).

Si vous êtes intéressé, il suffit de chercher "[VM]"dans le code source de Chromium , vous découvrirez que ces chiffres n'ont aucune signification significative en dehors des outils de développement.

mise à jour 25/06/2015

[VM] (scriptId)a été renommé il y a VMscriptId quelque temps , et voici le lien direct vers le résultat de la recherche au cas où la valeur changerait à nouveau.

Rob W
la source
1
Chrome frapperait-il le fichier [VM] au lieu du fichier js en direct? Si oui, pourquoi?
Matt
@Matt Que voulez-vous dire par "Hit le fichier [VM] au lieu du fichier js en direct"?
Rob W
@RobW ne tient pas compte; mon navigateur mettait en cache le fichier js (malgré la mise à jour de mon cache buster).
Matt
1
[VM] (scriptId)a été renommé il y a VMscriptId quelque temps , mais j'ai conservé la réponse dans son état actuel pour ne pas invalider la question. Le dernier lien de recherche de codes est: cs.chromium.org/%22VM%5C%22%20+%22 (lien direct vers le résultat de la recherche au cas où la valeur changerait à nouveau: chromium.googlesource.com/chromium/blink/+/… )
Rob W
J'ai récemment rencontré ce problème sans aucune évaluation - il semble être lié à l'utilisation d'iFrames. Ma preuve en est que lorsque je place un point d'arrêt sur le code dans un iFrame, j'obtiens le problème [VM], mais lorsque j'ouvre l'iFrame dans sa propre fenêtre, j'obtiens très bien le point d'arrêt. Assurez-vous simplement que cela correspond à l'un des «amis» d'eval, comme décrit dans la réponse.
Danger
42

Chaque fois que vous chargez du contenu HTML via AJAX et que ce contenu contient des <script>balises, le script sera évalué à l'aide de eval () et reconnu par la vue Sources de Chrome comme un nouveau fichier commençant par «VM». Vous pouvez toujours accéder à l'onglet Réseau, trouver la requête AJAX et afficher la réponse HTML dans son intégralité, y compris votre script.

Sam Kauffman
la source
3
Cela craint cependant pour le débogage. Si j'utilise une balise de script avec src=/test.jspuis provoque une erreur qui remonte à test.js, le traceback contient le nom de fichier correct, mais par la suite, les stacktraces contiennent la magie de la VM. Cela rend impossible d'obtenir le code source [de la même origine] pour les fichiers dans le stacktrace plus d'une fois, et vous ne pouvez pas les mettre en cache, car vous ne savez pas quel fichier est lequel dans les futures stacktraces. Ce problème est résolu dans les outils de développement, mais pas dans les applications Web.
Carl Smith
C'est probablement la raison la plus courante pour laquelle cela se produit dans les applications Web modernes, et un autre bon exemple de la raison pour laquelle nous devrions séparer le code du contenu.
alexw le
37

Lorsque vous utilisez eval, le javascript est jeté dans les VM du débogueur Chrome. Afin de voir les js créés avec eval sous Chrome Debugger Sources, définissez cet attribut à la fin (merci Splaktar) des js:

//@ sourceURL=dynamicScript.js

Est-il possible de déboguer le chargement dynamique de JavaScript par un débogueur comme WebKit, FireBug ou IE8 Developer Tool?

Souiller
la source
9
La syntaxe a changé, maintenant c'est: // # sourceURL = dynamicScript.js
ThiagoPonte
1
Il devrait également être à la fin du JavaScript, pas au début.
Splaktar
Je cherchais quelque chose comme ça. Merci
David Kierans
Je vous remercie! C'est tellement utile!
Eve juan
4
Sur les outils de débogage de Firefox, il est ditUsing //@ to indicate sourceURL pragmas is deprecated. Use //# instead
Nighto
6

Si vous souhaitez déboguer des fichiers JS injectés par programme dans Chrome, vous pouvez utiliser l' debugger;instruction, c'est plus rapide que de trouver où se trouve votre script et aussi plus rapide que de générer un fichier avec sourceurl .

Il fonctionne comme un point d'arrêt et identifie automatiquement votre code dans l'onglet source de chrome partout où vous utilisez l' debugger;instruction.

Débogueur;

Notez que la source du script est un fichier VMXXX.

Rodrirokr
la source
Cela ne semble pas répondre à la question.
Grant Miller
Mon mauvais, je me laisse aller par les autres réponses à cette question.
Rodrirokr
1
Super! C'est exactement ce que je cherchais. Inutile de savoir dans quelle VM votre code a été inséré par le moteur JS.
Oleg Bolden
quel est le lien entre cette réponse et la question?
Ravindra Thorat
Avec cette debugger;déclaration, il peut démystifier d'où viennent les mystérieux 'scripts étranges et mystérieux intitulés "[VM] (XXXX" "s'il le souhaite.
Rodrirokr
4

J'ai trouvé que la VM était générée à partir de certaines extensions Chrome - elles insèrent CSS / JS dans la page et Chrome utilise les fichiers de la VM pour l'exécuter.

Piliers
la source
0

Lorsque vous déboguez une source de fenêtre enfant (iframe) qui est ensuite déchargée, votre fichier source recevra également le préfixe VM et l'arrière-plan jaune.

JosdeHa
la source
0

J'ai rencontré le même problème. Le problème est que le code de mon application a été considéré comme une boîte noire par accident. Lorsque j'ai essayé d'entrer dans le code, il a continué à ouvrir ces VMXXXXonglets.

Après avoir supprimé le paramètre de boîte noire pour le fichier js de mon application, j'ai pu parcourir mon code avec succès.

Justin Noel
la source
0

pour éviter cela

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

Et puis boîte noire ^.*blackbox-this.js$

Idem pour setInterval / setTimeout quand il obtient une chaîne (mais c'est quand même une mauvaise pratique, non?;))

Est-ce que ça marche pour toi?

RahmanRezaee
la source
-1

J'ai eu le même problème lorsque je déboguais mon application angulaire. Voir trop de scripts de VM qui ne pouvaient pas être mis en boîte noire prenait beaucoup de temps à déboguer. J'ai plutôt choisi mozilla / IE explorer pour déboguer.

Sameeksha Kumari
la source