मुख्य > सामान्य प्रश्न > जिट डिबगिंग को सक्षम करना - समस्याओं का समाधान

जिट डिबगिंग को सक्षम करना - समस्याओं का समाधान

JIT डिबगिंग का क्या अर्थ है?

सही समय परडिबगिंगएक ऐसी सुविधा है जो विजुअल स्टूडियो को लॉन्च करती हैडिबगरस्वचालित रूप से जब कोई प्रोग्राम, Visual Studio के बाहर चल रहा है, एक घातक त्रुटि का सामना करता है। सही समय परडिबगिंगऑपरेटिंग सिस्टम द्वारा एप्लिकेशन को समाप्त करने से पहले आपको त्रुटि की जांच करने की अनुमति देता है।

पिछले लेख में, हमने जांच की कि जावास्क्रिप्टकोर, वेबकिट का जावास्क्रिप्ट इंजन, स्मृति में वस्तुओं और मूल्यों को कैसे संग्रहीत करता है।

इस लेख में मैं JIT, जस्ट-इन-टाइम कंपाइलर के बारे में कुछ और जानना चाहूंगा। यह ब्राउज़र शोषण श्रृंखला एसएसडी सिक्योर डिस्क्लोजर द्वारा समर्थित है। अधिक जानकारी के लिए, विवरण देखें सीधे शब्दों में कहें, जस्ट-इन-टाइम कंपाइलर जावास्क्रिप्ट वर्चुअल मशीन द्वारा निष्पादित जावास्क्रिप्ट बाइटकोड को देशी मशीन कोड में संकलित करता है।

कोड संकलित करेगा। लेकिन जावास्क्रिप्टकोर में जेआईटी थोड़ा अधिक निफ्टी है। तो हम इसके बारे में कैसे सीख सकते हैं? वेबकिट ब्लॉग पर इस आलेख जैसे कुछ आधिकारिक वेबकिट संसाधनों की जांच के लिए लिनुस से एक अच्छी युक्ति मिली।

जावास्क्रिप्टकोर सीएसआई: ए क्रैश साइट इन्वेस्टिगेशन स्टोरी। आज मैं इनमें से कुछ उपकरणों का वर्णन करने जा रहा हूं जिनका उपयोग वेबकिट इंजीनियर यह बताते हुए करते हैं कि हमने जेएससी वर्चुअल मशीन (वीएम) में एक वास्तविक बग का निदान कैसे किया। यह वेबकिट में योगदान करने में रुचि रखने वाले लोगों के लिए एक ब्लॉग है, और लेखक कारण खोजने के लिए क्रैश को डीबग करने के तरीके पर बहुत मूल्यवान अंतर्दृष्टि साझा करता है।

और ठीक यही हम सुरक्षा शोधकर्ताओं के रूप में जानना चाहते हैं। उदाहरण के लिए, यह बताता है कि वेबकिट का एक एड्रेस सैनिटाइज़र बिल्ड कैसे बनाया जाए ताकि संभावित त्रुटियों जैसे कि हीप ओवरफ्लो या उपयोग के बाद की समस्याओं का पता लगाया जा सके, जो अक्सर सामान्य कार्यक्रमों के साथ तुरंत क्रैश नहीं होती हैं। लेकिन हम अभी JIT सामग्री में रुचि रखते हैं।

और आगे लेख में हम निम्नलिखित पाते हैं। JSC निष्पादन इंजन के कई स्तरों के साथ आता है। आपने इसके बारे में यहाँ पढ़ा होगा, यह FTL JIT का परिचय देने वाला एक लेख है।

4 स्तर हैं: टीयर 1: एलएलआईएनटी दुभाषिया टियर 2: बेसलाइन जेआईटी कंपाइलर टियर 3: डीएफजी जेआईटी और टियर 4: एफटीएल जेआईटीएस सो टियर 1 नियमित दुभाषिया है। यह मूल जावास्क्रिप्ट वर्चुअल मशीन है। हम स्रोत फ़ाइल LowLevelInterpreter.cpp पर एक त्वरित नज़र डाल सकते हैं, जिसमें दुभाषिया लूप होता है।

तो यह सिर्फ जावास्क्रिप्ट बाइटकोड के माध्यम से जाता है और फिर प्रत्येक कथन को निष्पादित करता है। तो ... यदि किसी फ़ंक्शन को अक्सर कॉल किया जाता है, तो वह 'हॉट' हो सकता है।

रियलटेक वर्चुअल सराउंड

यह एक ऐसा शब्द है जो बताता है कि बहुत कुछ चल रहा है। और फिर जावास्क्रिप्टकोर पहले चरण के साथ समारोह को जेआईटी करने का निर्णय ले सकता है। बुनियादी जेआईटी।

और संबंधित JIT.cpp फ़ाइल में हम फिर से कुछ अतिरिक्त जानकारी प्राप्त कर सकते हैं। यदि LLInt को पता चलता है कि लूप में बेसलाइन JIT में OSR प्रविष्टि है, तो इसे बाइटकोड ऑफ़सेट पास कर दिया जाता है जिसके साथ इसे हमारे संकलन को शुरू करते समय निष्पादित किया गया था।

हमें बस उस बाइटकोड ऑफसेट से पहुंचने वाली हर चीज के लिए कोड संकलित करने की आवश्यकता है। ओएसआर, ऑन स्टैक रिप्लेसमेंट, मूल रूप से एक प्रकार का जेआईटी है जो आपको फ्लाई पर संकलित कोड पर स्विच करने की अनुमति देता है। यह अभी भी बाइटकोड के साथ बहुत संगत है, इसलिए बोलने के लिए, क्योंकि अभी तक कोई और अनुकूलन नहीं हुआ है।

'वेबकिट FTL JIT का परिचय:' से हम यह भी पढ़ते हैं: किसी फ़ंक्शन का पहला निष्पादन हमेशा दुभाषिया परत में शुरू होता है। एक बार फ़ंक्शन में एक स्टेटमेंट को 100 से अधिक बार निष्पादित किया जाता है या फ़ंक्शन को 6 बार से अधिक (जो भी पहले आता है) कहा जाता है, निष्पादन को बेसलाइन जेआईटी द्वारा संकलित कोड पर पुनर्निर्देशित किया जाता है जो दुभाषियों के कुछ ओवरहेड को समाप्त करता है, लेकिन वहाँ है गंभीर संकलक अनुकूलन की कमी। जैसे ही किसी निर्देश को बेसलाइन कोड में 1000 से अधिक बार निष्पादित किया जाता है या बेसलाइन फ़ंक्शन को 66 से अधिक बार कहा जाता है, हम निष्पादन को वापस DFG JIT पर निर्देशित करते हैं। DFG का अर्थ डेटा फ़्लो ग्राफ़ है, जो इसके बारे में थोड़ा बताता है यह कदम किस बारे में है।

लेख में एक अच्छी तस्वीर भी शामिल है जो DFG पाइपलाइन का वर्णन करती है। DFG बायटेकोड को DFG-CPS फॉर्मेट में बदलना शुरू कर देता है। CPS का मतलब कंटीन्यूएशन-पासिंग स्टाइल है, जिसका अर्थ है कि आपका कोड रिटर्न का उपयोग नहीं करता है, बल्कि जारी रहता है और अगले फ़ंक्शन पर चला जाता है।

यदि आपने कभी एक NodeJS एक्सप्रेस विकास किया है, तो आप इसे चर और अस्थायी लोगों के बीच अगले () फ़ंक्शन प्रवाह संबंधों की तरह सोच सकते हैं। प्रोफाइलिंग जानकारी का उपयोग अनुमान के प्रकार का अनुमान लगाने के लिए किया जाता है, और उन अनुमानों का उपयोग न्यूनतम प्रकार के परीक्षणों को पेश करने के लिए किया जाता है। पारंपरिक संकलक अनुकूलन का पालन करें।

संकलक सीधे डेटा प्रवाह ग्राफ से मशीन कोड उत्पन्न करता है, इसलिए यह वह जगह है जहां चीजें दिलचस्प होती हैं। JIT संकलक प्रकार का अनुमान लगाता है, और यदि JIT का मानना ​​है कि प्रकार नहीं बदल रहे हैं, तो JIT कुछ जाँचों को हटाने का निर्णय ले सकता है। कौन सा निश्चित रूप से कोड को तेज कर सकता है यदि यह एक फ़ंक्शन है जिसे कहा जाता है लेकिन यह सब नहीं है।

DFG JIT के बाद अभी भी JIT है। FTL - प्रकाश से भी तेज। जब इस जानवर को पेश किया गया था, तो उसने जाने-माने कंपाइलर बैकएंड एलएलवीएम का इस्तेमाल अधिक विशिष्ट कंपाइलर ऑप्टिमाइज़ेशन को लागू करने के लिए किया था। एफटीएल जेआईटी को जावास्क्रिप्ट में आक्रामक सी-जैसे ऑप्टिमाइज़ेशन लाने के लिए विकसित किया गया था।

कुछ बिंदु पर, LLVM को B3 द्वारा बदल दिया गया था, लेकिन विचार वही है। और यह जेआईटी कंपाइलर कोड के बारे में और भी अधिक धारणा बना सकता है। लेकिन आइए उस पर थोड़ा ध्यान दें, जो कि फिर से है जहां दुर्घटना की जांच पर लेख उत्कृष्ट है।

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

या जब भी कोई JIT ऑप्टिमाइज़ेशन करता है तो हम रिपोर्ट कर सकते हैं और प्रिंट कर सकते हैं। तो एलएलडीबी में मैंने सब कुछ चालू करने के लिए पर्यावरण चर सेट किया और फिर जेएससी को पुनरारंभ किया, इससे पहले से ही कुछ जेआईटी ऑप्टिमाइज़ेशन डीबग प्रिंट हो गए हैं। यदि आप फ़ंक्शन नामों को देखते हैं जो कि झटकेदार हैं, तो ऐसा लगता है कि charAt, abs, आदि जैसी चीज़ों को पहले ही बदल दिया गया है।

लेकिन अब हम अपना स्वयं का जेआईटी फ़ंक्शन, ईओवरफ़्लो फ़ंक्शन बनाना चाहते हैं, जो एक पैरामीटर के रूप में एक साधारण संख्या लेता है, फिर एक परिणाम चर तैयार करता है और i = 0 से n तक लूप करता है और इसे परिणाम में जोड़ता है। गरम '। हम इस फ़ंक्शन को कॉल करने वाले एक साधारण लूप के साथ ऐसा कर सकते हैं।

आइए सिर्फ चार संस्करणों से शुरू करें। यह कुछ आउटपुट दिखाता है, लेकिन वह नहीं जो हम चाहते हैं। यहां तक ​​​​कि इसे 10 बार लूप में निष्पादित करने से भी कुछ नहीं होता है।

लेकिन फ़ंक्शन को 100 बार निष्पादित करने से बेसलाइन JIT ट्रिगर होगा। यहां एक संकलित असेंबली कोड है जो जावास्क्रिप्ट फ़ंक्शन के बराबर है। आइए एक और अधिक आक्रामक JIT को ट्रिगर करने का प्रयास करें। चलो लूप बढ़ाते हैं।

और बूम डीएफजी जित...

और अब चलो पूरी तरह से पागल हो जाओ, लूप को समायोजित करें। एफटीएल जित। बूम, बहुत अधिक आउटपुट है, लेकिन ईमानदार होने के लिए, इसका कोई मतलब नहीं है।

लेकिन सबसे महत्वपूर्ण बात यह है कि हमने गहराई से खुदाई करने के लिए विभिन्न डिबगिंग विधियों और ट्रिक्स के बारे में सीखा। अब आप JIT कंपाइलर के बारे में थोड़ा और जान गए हैं। पिछले लेख से आप यह भी जानते हैं कि जावास्क्रिप्ट ऑब्जेक्ट्स, एरेज़ और वैल्यू को मेमोरी में कैसे दर्शाया जाता है।

अब निम्नलिखित विचार पर विचार करें। यदि जेआईटी कंपाइलर कोड में प्रकारों का अनुमान लगाता है और मानता है और चेक हटा देता है, उदाहरण के लिए, उन्हें बस एक निश्चित मेमोरी ऑफ़सेट से ले जाता है, तो क्या इसका दुरुपयोग किया जा सकता है? बस काल्पनिक रूप से कहें, जेआईटी कोड डबल्स की एक जावास्क्रिप्ट सरणी की अपेक्षा करता है और सीधे मूल्यों पर प्रतिक्रिया करता है। जेआईटी कंपाइलर तब सभी चेक को ऑप्टिमाइज़ करता है, लेकिन फिर आपको किसी ऑब्जेक्ट के साथ ऐरे में एंट्री को बदलने का एक तरीका मिल जाएगा।

अब इस सरणी में एक पॉइंटर के रूप में एक ऑब्जेक्ट रखा जाएगा। तो अगर jied कोड में कोई चेक नहीं है और इस सरणी की पहली प्रविष्टि देता है, उदाहरण के लिए, यह उस पॉइंटर को डबल के रूप में वापस कर देगा, है ना? यह बहुत बुरा होगा, और 'यह वास्तव में विशिष्ट ब्राउज़र भेद्यता पैटर्न में से एक है और हम इसे जल्द ही कार्रवाई में देखेंगे। लेकिन जेआईटी ऐसी चीजों को रोकने की कोशिश कैसे करती है? खैर, यह पता चला है कि डेवलपर्स हर फ़ंक्शन को मॉडल करने की कोशिश कर रहे हैं जो कि मान्यताओं को प्रभावित करता है। जेआईटी कंपाइलर है।

तो अगर ऐसा कुछ है जो इस सरणी के लेआउट को बदल सकता है, उदाहरण के लिए यदि कोई ऑब्जेक्ट डबल सरणी में रखा गया है, तो ऐसे फ़ंक्शन को खतरनाक के रूप में चिह्नित किया जाना चाहिए। मैं आपको इस ZDI लेख के बारे में एक संक्षिप्त अंश बताता हूँ। 'अपने अनुमानों को उलटना: जिट तुलनाओं के लिए एक गाइड' पढ़ें।

यहां वे लिखते हैं: यह कहने का तरीका है कि भविष्य के अनुकूलन को रोकने के लिए एक ऑपरेशन संभावित रूप से खतरनाक है, क्लोबरवर्ल्ड नामक एक फ़ंक्शन को कॉल करना है, जो अन्य बातों के अलावा, ग्राफ के भीतर सभी सरणियों के प्रकारों के बारे में सभी धारणाओं को तोड़ता है। तो जावास्क्रिप्ट इंजन किसी भी चीज को चिह्नित करने का प्रयास करता है जो क्लॉबरवर्ल्ड को कॉल करके संभावित दुष्प्रभाव हो सकता है। साइड इफेक्ट वे चीजें हो सकती हैं जिनके बारे में हम सोच रहे थे जैसे किसी मूल्य के प्रकार को बदलना और कुछ और उस बदलाव की उम्मीद नहीं कर रहा था।

तो यहाँ क्लोबरवर्ल्ड फ़ंक्शन है, जिसे DFG-JIT भाग में लागू किया गया है। यह क्लॉबरस्ट्रक्चर को कॉल करता है, जो सेटस्ट्रक्चरक्लोबरस्टेट को स्ट्रक्चर्स पर सेट करता है, अरेक्लोबर्ड बहुत सावधानी से चीजें हैं, उदाहरण के लिए, किसी ऑब्जेक्ट की संरचना बदलती है। मान लीजिए कि जेआईटी किसी वस्तु पर .x संपत्ति तक पहुंच का अनुकूलन करता है, और अचानक आप इसे हटा देते हैं, यह चिह्नित करने की आवश्यकता है कि संरचना बदल गई है ताकि जेआईटी कोड को त्याग दिया जा सके, अन्यथा जब आप इस जिटर का पुन: उपयोग करेंगे तो आपको स्मृति भ्रष्टाचार मिलेगा समारोह।

लेकिन अब इतना ही काफी है। अगले लेख में हम लिनुस के कारनामे की ओर बढ़ते हैं, जो इस तरह के मामले का दुरुपयोग करता है।

जब जेआईटी डिबगिंग सक्षम होती है तो जेआईटी को कोई भी हैंडल न किया गया अपवाद भेजा जाएगा?

सेवासक्षमसही समय पर (JIT)डिबगिंग, द. इस एप्लिकेशन या कंप्यूटर के लिए कॉन्फ़िग फ़ाइल (मशीन। कॉन्फ़िग) में होना चाहिएजित डिबगिंगसिस्टम में निर्धारित मूल्य।जब JIT डिबगिंग सक्षम है,कोई भी हैंडल न किया गया अपवाद JIT डीबगर को भेजा जाएगाइस संवाद बॉक्स द्वारा नियंत्रित किए जाने के बजाय कंप्यूटर पर पंजीकृत है।'

मैं जेआईटी डिबगिंग को कैसे अक्षम करूं?

Windows नियंत्रण कक्ष > नेटवर्क और इंटरनेट > इंटरनेट विकल्प में, चुनेंअक्षमलिपिडिबगिंग(इंटरनेट एक्सप्लोरर) औरअक्षमलिपिडिबगिंग(अन्य)।23 मई 2018

मैं कैसे ठीक करूं कोई पंजीकृत जेआईटी डीबगर निर्दिष्ट नहीं किया गया था?

कोई पंजीकृत JIT डिबगर निर्दिष्ट नहीं किया गया था. संलग्न करते समय प्रक्रिया प्रतीक्षा करने के लिए पुनः प्रयास करें पर क्लिक करेंडिबगरमैन्युअल रूप से। रद्द करने के लिए रद्द करें पर क्लिक करेंJITडिबग अनुरोध।10 मई 2018

Microsoft.NET के लिए 'JIT डिबगिंग' कैसे सक्षम करें?

'आपके एप्लिकेशन में हैंडल न किया गया अपवाद हुआ है... सिस्टम निर्दिष्ट फ़ाइल नहीं ढूँढ सकता...जस्ट इन टाइम (JIT) डिबगिंग को सक्षम करने के लिए, इस एप्लिकेशन या कंप्यूटर (मशीन.कॉन्फ़िग) के लिए .config फ़ाइल में होना चाहिए jitDebugging मान system.windows.forms अनुभाग में सेट किया गया है। सक्षम की गई डिबगिंग के साथ ऐप्लिकेशन संकलित किया जाना चाहिए।

क्या कोई जस्ट इन टाइम (JIT) डिबगिंग डायलॉग बॉक्स है?

इस डायलॉग बॉक्स के बजाय जस्ट-इन-टाइम (JIT) डिबगिंग। System.UnauthorizedAccessException: 'C:Program Files (x86)BotBoyprefs.xml' पथ तक पहुंच अस्वीकृत है। jitDebugging मान system.windows.forms अनुभाग में सेट किया गया है। सक्षम। इस संवाद बॉक्स द्वारा नियंत्रित किए जाने के बजाय। यह धागा बंद है।

userinit.exe खराब छवि

केवल समय डिबगिंग में सक्षम या अक्षम कैसे करें?

जस्ट-इन-टाइम डिबगिंग को सक्षम या अक्षम करने के लिए: 1 टूल्स या डीबग मेनू पर, विकल्प > डिबगिंग > सही समय पर। 2 इस प्रकार के कोड बॉक्स के लिए जस्ट-इन-टाइम डिबगिंग सक्षम करें बॉक्स में, उस कोड के प्रकार का चयन करें जिसे आप डीबग करने के लिए जस्ट-इन-टाइम डिबगिंग चाहते हैं: प्रबंधित, मूल, और/या स्क्रिप्ट। 3 ठीक चुनें. और देखें...

मैं जेआईटी में इस समस्या को कैसे ठीक करूं?

मैं इस समस्या को कैसे हल करूं? इस डायलॉग बॉक्स के बजाय जस्ट-इन-टाइम (JIT) डिबगिंग। System.UnauthorizedAccessException: 'C:Program Files (x86)BotBoyprefs.xml' पथ तक पहुंच अस्वीकृत है। jitDebugging मान system.windows.forms अनुभाग में सेट किया गया है। सक्षम। इस संवाद बॉक्स द्वारा नियंत्रित किए जाने के बजाय। यह धागा बंद है।

इस श्रेणी में अन्य प्रश्न

शटडाउन exe 00 - कैसे ठीक करें

मैं MSVCP100 DLL के लापता होने को कैसे ठीक करूं? Msvcp100 को कैसे ठीक करें। dll त्रुटियाँ Microsoft Visual C++ 2010 सर्विस पैक 1 पुनर्वितरण योग्य पैकेज MFC सुरक्षा अद्यतन डाउनलोड करें और उसे चलाएँ। कोई भी उपलब्ध विंडोज अपडेट इंस्टॉल करें। msvcp100 को पुनर्स्थापित करें। अपने पूरे सिस्टम का वायरस/मैलवेयर स्कैन चलाएँ। हाल के सिस्टम परिवर्तनों को पूर्ववत करने के लिए सिस्टम पुनर्स्थापना का उपयोग करें।

लूमिया 950 मुद्दे - कैसे हल करें

क्या LogMeIn बचाव सहायता सुरक्षित है? LogMeIn बचाव सुरक्षित और सुरक्षित है। ग्राहक और तकनीशियन के बीच सभी संचार एसएसएल-एन्क्रिप्टेड हैं। ... महत्वपूर्ण: एप्लेट एक छोटा प्रोग्राम है जो आपके कंप्यूटर पर चलना चाहिए ताकि तकनीशियन आपकी मदद कर सके। सत्र के अंत में एप्लेट स्वचालित रूप से आपके पीसी या मैक से हटा दिया जाता है। 1 फरवरी। 2021

विस्टा बेतरतीब ढंग से जम जाता है - आप कैसे हल करते हैं

मैं मिले 000 फ़ोल्डर को कैसे ठीक करूं? chk डेटा अपने पिछले संस्करण को पुनर्स्थापित कर रहा है। अपनी फ़ाइलों की बैकअप प्रतिलिपि प्राप्त करने के लिए बाहरी ड्राइव का उपयोग करें। विंडोज फाइल एक्सप्लोरर खोलें और उस फ़ोल्डर का चयन करें जिसमें खोई हुई फाइलें होती थीं। उस पर राइट-क्लिक करें। संदर्भ मेनू से, पिछले संस्करण को पुनर्स्थापित करें विकल्प चुनें। पुनर्स्थापना और FOUND की फ़ाइलें क्लिक करें।