Chrome開発ツール:JavaScriptの[VM]ファイル


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)

興味がある場合は、Chromiumのソースコードを調べる"[VM]"だけで、これらの数値が開発者ツール以外では重要な意味を持たないことがわかります。

2015年6月25日更新

[VM] (scriptId)VMscriptId しばらく前に名前が変更されまし。値が再び変更された場合の検索結果へ直接リンクは次のとおりです。


1
Chromeはライブjsファイルではなく[VM]ファイルにヒットしますか?もしそうなら、なぜですか?
Matt

@マット「ライブjsファイルの代わりに[VM]ファイルをヒットする」とはどういう意味ですか?
Rob W

@RobWは無視してください。私のブラウザーはjsファイルをキャッシュしていました(キャッシュバスターを更新したにもかかわらず)。
Matt

1
[VM] (scriptId)VMscriptId しばらく前に名前が変更されましが、質問を無効にしないために、現在の状態で回答を保持しています。最新CodeSearchをリンクは、次のとおりです。cs.chromium.org/%22VM%5C%22%20+%22(直接リンクを値が再び変化した場合の結果を検索する:chromium.googlesource.com/chromium/blink/+/...
Rob W

私は最近evalなしでこの問題に遭遇しました-それはiFrameの使用に関連しているようです。これに関する私の証拠は、iFrameのコードにブレークポイントを設定すると[VM]の問題が発生するのですが、iFrameを独自のウィンドウで開くと、ブレークポイントにうまく到達するということです。これが、回答に記載されているevalの「友達」の1つであるかどうかを確認してください。
危険

42

AJAXを介してHTMLコンテンツをロードし、そのコンテンツに<script>タグが含まれている場合、スクリプトはeval()を使用して評価され、Chromeのソースビューで「VM」で始まる新しいファイルとして認識されます。いつでも[ネットワーク]タブに移動し、AJAXリクエストを見つけて、スクリプトを含むHTML応答全体を表示できます。


3
しかし、これはデバッグには不向きです。でスクリプトタグを使用するとsrc=/test.js、test.jsまでトレースするエラーが発生し、トレースバックには正しいファイル名が含まれますが、その後、スタックトレースにはVMマジックが含まれます。これにより、スタックトレース内のファイルの[同じオリジンから]ソースコードを複数回取得することが不可能になり、将来のスタックトレースでどのファイルがどれであるかわからないため、それらをキャッシュすることはできません。これはDev Toolsでは修正されていますが、webappsでは修正されていません。
カールスミス

これはおそらく、最新のWebアプリケーションで発生する最も一般的な理由であり、コンテンツからコードを分離する必要がある理由のもう1つの良い例です。
alexw

37

evalを使用すると、JavaScriptがChromeデバッガVMにスローされます。Chromeデバッガーのソースの下でevalを使用して作成されたjsを表示するには、jsの最後(Splaktarに感謝)にこの属性を設定します。

//@ sourceURL=dynamicScript.js

WebKit、FireBug、IE8 Developer ToolなどのデバッガーでダイナミックロードJavaScriptをデバッグできますか?


9
構文が変更されました://#sourceURL = dynamicScript.js
ThiagoPonte

1
また、JavaScriptの最初ではなく最後に置く必要があります。
Splaktar 2014

このようなものを探していました。ありがとう
David Kierans 14年

ありがとうございました!とても便利です!
Eve juan 2015

4
Firefoxのデバッグツールでは、それは言うUsing //@ to indicate sourceURL pragmas is deprecated. Use //# instead
Nighto

6

プログラムで注入されたJS debugger;ファイルをChromeでデバッグする場合は、ステートメントを使用できます。これは、スクリプトの場所を見つけるよりも速く、sourceurlでファイルを生成するよりも高速です

これはブレークポイントのように機能し、debugger;ステートメントを使用する場所であればどこでも、自動的にchromeソースタブのコードを特定します。

デバッガ;

スクリプトのソースはVMXXXファイルであることに注意してください。


これは質問に答えていないようです。
Grant Miller、

私の悪い、私はこの質問に対する他の答えに自分を行かせました。
Rodrirokr、2018年

1
素晴らしい!これがまさに私が求めていたものです。JSエンジンによってコードが挿入されたVMを見つける必要はありません。
Oleg Bolden

この答えと質問の関係は何ですか?
Ravindra Thorat

debugger;神秘「『[VM](XXXX』と題し、奇妙で不思議なスクリプトは」彼がそう望む場合から来ているところ声明彼が分かりやすく説明することができます。
Rodrirokr

4

一部のChrome拡張機能からVMが生成されることがわかりました-それらはページに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-this.js$

文字列を取得するときのsetInterval / setTimeoutについても同じです(とにかくそれは悪い習慣ですよね;))

それはあなたのために働きますか?


-1

Angularアプリケーションをデバッグしているときにも同じ問題が発生しました。ブラックボックス化できないVMスクリプトが多すぎると、デバッグに本当に時間がかかりました。私はむしろデバッグするためにmozilla / IEエクスプローラーを選びました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.