Chrome विकास उपकरण: जावास्क्रिप्ट से [VM] फ़ाइल


139

मैंने अपनी जावास्क्रिप्ट फ़ाइल (jaydata.js) में एक ब्रेकपॉइंट जोड़ा और "अगले कार्यक्रम कॉल पर कदम" दबा रहा था। जब यह एक लाइन के लिए मिला:

},

"[VM] (8312)" शीर्षक वाली एक अन्य फ़ाइल पॉप अप हुई। मैं "अगले फंक्शन कॉल के लिए स्टेप ओवर" पर क्लिक करता रहा और अब मेरी स्क्रीन है:

यहां छवि विवरण दर्ज करें

"[वीएम] (एक्सएक्सएक्सएक्स") शीर्षक वाली ये अजीब और रहस्यमय स्क्रिप्ट क्या हैं और वे कहां से आती हैं?


1
जब आप एक ही समय में डीबगिंग फ़ाइलों को संपादित कर रहे हैं, तो ये VM फ़ाइलें भी दिखाई देती हैं। Chrome सिंक को खो देता है और जब फ़ाइल पर एक ब्रेकपॉइंट लगाया जाता है तो यह कहीं न कहीं मेमोरी में फ़ाइल में किसी अन्य स्थान पर कोड को रोक देगा। उदा। test.html एक विराम बिंदु की अनुमति देगा, लेकिन जब Chrome इसे रोकता है तो VM99 पर ऐसा होता है: test.html किसी अन्य स्थान पर। Chrome को फ़ाइलों का नाम बदलना बंद करना है, जैसे test2.html, और फिर से शुरू करें। (इतिहास साफ़ करने, कैश आदि काम नहीं करता है और यदि आप कोशिश करते हैं तो Chrome VM99: test.html लोड करता रहेगा।
QuentinUK

जवाबों:


112

[VM] (scriptId)कोई विशेष अर्थ नहीं है। यह एक डमी नाम है जो हमें कोड को भेद करने में मदद करता है जो सीधे फ़ाइल नाम से बंधा नहीं होता है, जैसे कि कोड का उपयोग करके बनाया गया evalऔर मित्र।

अतीत में, इन सभी लिपियों को केवल लेबल किया गया था (program)

आप रुचि रखते हैं, तो बस को देखने के "[VM]"क्रोमियम के स्रोत कोड में , आपको लगता है कि इन नंबरों डेवलपर उपकरण के बाहर कोई महत्वपूर्ण अर्थ है की खोज करेंगे।

अद्यतन 2015-06-25

[VM] (scriptId)VMscriptId कुछ समय पहले नाम बदल दिया गया था , और मूल्य फिर से बदलने की स्थिति में खोज परिणाम के लिए सीधा लिंक यहां दिया गया है ।


1
क्या Chrome, लाइव js फ़ाइल के बजाय [VM] फ़ाइल को हिट करेगा? यदि हां, तो क्यों?
मैट

@ मैट "लाइव जेएस फ़ाइल के बजाय [[वीएम] फ़ाइल को मारो" फ़ाइल का क्या मतलब है?
रॉब डब्ल्यू

@ रॉबर्ड अवहेलना; मेरा ब्राउज़र js फ़ाइल को कैश कर रहा था (मेरे कैश बस्टर को अपडेट करने के बावजूद)।
मैट

1
[VM] (scriptId)VMscriptId कुछ समय पहले नाम बदल दिया गया था , लेकिन मैंने प्रश्न को अमान्य नहीं करने के लिए इसकी वर्तमान स्थिति में उत्तर रखा है। नवीनतम कोड खोज लिंक है: cs.chromium.org/%22VM%5C%22%20+%22 (मामले में फिर से खोज परिणाम के लिए सीधा लिंक मूल्य फिर से बदलता है: क्रोमियम.ओओग्लससोर्स. com / chromium / blink//…… )
रॉब डब्ल्यू

मैंने हाल ही में इस समस्या का सामना बिना किसी निष्कासन के किया - यह आईफ़्रेश के उपयोग से संबंधित प्रतीत होता है। इसके लिए मेरा प्रमाण यह है कि जब मैं iFrame में कोड पर एक ब्रेकपॉइंट सेट करता हूं, तो मुझे [VM] समस्या मिलती है, लेकिन जब मैं अपनी विंडो में iFrame को खोलता हूं, तो मैं ब्रेकप्वाइंट को ठीक से हिट करता हूं। बस यकीन है कि अगर यह उत्तर में वर्णित के रूप में eval के "दोस्तों" में से एक के रूप में अर्हता प्राप्त करता है।
डेंजर

42

जब भी आप AJAX के माध्यम से HTML सामग्री को लोड करते हैं, और उस सामग्री में <script>टैग होते हैं , तो स्क्रिप्ट का मूल्यांकन eval () का उपयोग करके किया जाएगा और क्रोम के स्रोत दृश्य द्वारा 'वीएम' के साथ शुरू होने वाली नई फ़ाइल के रूप में पहचाना जाएगा। आप हमेशा नेटवर्क टैब पर जा सकते हैं, AJAX अनुरोध पा सकते हैं, और अपनी स्क्रिप्ट सहित संपूर्णता में HTML प्रतिक्रिया देख सकते हैं।


3
यह हालांकि डिबगिंग के लिए बेकार है। अगर मैं एक स्क्रिप्ट टैग का उपयोग करता हूं, src=/test.jsतो एक त्रुटि का कारण बनता है जो परीक्षण में वापस आ जाता है। जेएस, ट्रेसबैक में सही फ़ाइल नाम होता है, लेकिन इसके बाद, स्टैकट्रैक में वीएम जादू होता है। इससे स्टैकट्रेस में फ़ाइलों के लिए स्रोत कोड [एक ही मूल से] एक से अधिक बार प्राप्त करना असंभव हो जाता है, और आप उन्हें कैश नहीं कर सकते, क्योंकि आप नहीं जानते कि कौन सी फ़ाइल भविष्य के स्टैकट्रैक्स में है। यह देव टूल्स में तय किया गया है, लेकिन वेबैप्स में नहीं।
कार्ल स्मिथ

यह शायद सबसे आम कारण है जो आधुनिक वेब अनुप्रयोगों में होता है, और एक और अच्छा उदाहरण है कि हमें सामग्री से अलग कोड क्यों चाहिए।
एलेक्स जुं

37

Eval का उपयोग करते समय, जावास्क्रिप्ट को क्रोम डीबगर VMs में फेंक दिया जाता है। Chrome डीबगर स्रोत के तहत eval के साथ बनाए गए js को देखने के लिए, इस विशेषता को js के अंत में सेट करें (धन्यवाद Splaktar):

//@ sourceURL=dynamicScript.js

क्या WebKit, FireBug या IE8 डेवलपर टूल जैसे कुछ डिबगर द्वारा गतिशील लोडिंग जावास्क्रिप्ट को डीबग करना संभव है?


9
सिंटैक्स बदल गया है, अब इसका: // # sourceURL =
डायनामिकस्क्रिप्ट.जेएस

1
यह जावास्क्रिप्ट के अंत में भी होना चाहिए, न कि प्रारंभ में।
Splaktar

कुछ इस तरह देख रहे थे। धन्यवाद
डेविड किरियंस

धन्यवाद! यह बहुत उपयोगी है!
ईव जुआन

4
फ़ायरफ़ॉक्स डिबग टूल पर, यह कहता हैUsing //@ to indicate sourceURL pragmas is deprecated. Use //# instead
नाइटो

6

यदि आप क्रोम में जेएस फाइलों को प्रोग्रामेटिक रूप से इंजेक्ट करना चाहते हैं, तो आप debugger;स्टेटमेंट का उपयोग कर सकते हैं , यह खोजने की तुलना में तेज है कि आपकी स्क्रिप्ट कहां है और सोर्सल के साथ फाइल उत्पन्न करने की तुलना में भी तेज है ।

यह एक ब्रेकपॉइंट और ऑटोमैटिकली पिनपॉइंट की तरह काम करता है जहां आप debugger;स्टेटमेंट का उपयोग करते हुए क्रोम सोर्स टैब में अपने कोड को पिन करते हैं ।

डीबगर;

ध्यान दें कि स्क्रिप्ट का स्रोत VMXXX फ़ाइल है।


यह प्रश्न का उत्तर देने के लिए प्रकट नहीं होता है।
ग्रांट मिलर

मेरा बुरा, मैं अपने आप को इस प्रश्न के अन्य उत्तरों से जाने देता हूं।
रॉड्रिरोक

1
उत्तम! यह वही है जो मैं चाह रहा था। यह जानने की जरूरत नहीं है कि वीएस आपका कोड जेएस इंजन द्वारा किस कोड में डाला गया था।
ओलेग बोल्डेन

इस उत्तर और प्रश्न के बीच क्या संबंध है?
रवींद्र थोरात

इस debugger;कथन के साथ वह रहस्यमयी 'विचित्र और रहस्यमयी लिपियों को "[वीएम] (एक्सएक्सएक्सएक्स") कह सकते हैं, जहां से वह चाहें तो आ सकते हैं।
रोड्रिोकर

4

मैंने पाया कि VM कुछ क्रोम एक्सटेंशन से उत्पन्न होता है - वे पृष्ठ में CSS / JS डालते हैं और क्रोम इसे चलाने के लिए 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$

सेट के लिए समान / सेटटाइमआउट जब इसे एक स्ट्रिंग मिलती है (लेकिन यह वैसे भी एक बुरा अभ्यास है, तो सही?);

क्या ये तुम्हारे लिए कारगर है?


-1

मेरे पास एक ही मुद्दा था जब मैं अपने कोणीय अनुप्रयोग को डीबग कर रहा था। बहुत सारी VM स्क्रिप्ट्स जिन्हें ब्लैकबॉक्स नहीं किया जा सकता था, देखकर वास्तव में डीबग करने में लंबा समय लग रहा था। मैंने डिबग करने के बजाय मोज़िला / IE एक्सप्लोरर चुना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.