क्या कोई स्ट्रिंग को निकालने का तरीका जानता है ताकि यदि यह (या एक फ़ंक्शन जो परिभाषित करता है) एक त्रुटि उत्पन्न करता है, तो स्टैक ट्रेस में दिखाए गए लाइन और कॉलम नंबर अग्रिम में निर्दिष्ट राशि से ऑफसेट हो जाएंगे? वैकल्पिक रूप से, मान लीजिए कि मैं एक लंबी स्रोत स्ट्रिंग को टुकड़ों में तोड़ना चाहता हूं और उन्हें अलग-अलग मूल्यांकन करना चाहता हूं, लेकिन फिर भी स्टैक निशान प्राप्त करें जो दिखते हैं कि पूरे स्ट्रिंग का मूल्यांकन एक ही समय में किया गया था। खाली लाइनों और कॉलम का उपयोग करने के अलावा, इस प्रभाव को प्राप्त करने का कोई तरीका है? (मुझे ब्राउज़र-आधारित समाधान की आवश्यकता है, अधिमानतः क्रॉस-ब्राउजर, लेकिन मैं कम से कम एक प्रमुख ब्राउज़रों पर काम करने वाली किसी चीज़ के लिए व्यवस्थित कर सकता हूं।)लाइन और कॉलम ऑफ़सेट के साथ जावास्क्रिप्ट का इवल स्ट्रिंग?
उत्तर
अब तक का सबसे अच्छा समाधान मैंने पाया है कि प्रत्येक स्ट्रिंग के लिए एक स्रोत URL निर्देश को पूर्ववत करने से पहले, इसे स्टैक ट्रेस में एक अद्वितीय फ़ाइल नाम के रूप में एक मार्कर प्रदान करना है। स्टैक निशान को तब पार्स किया जाता है (पार्सर घटक स्टैकट्रैज का उपयोग करके) और मार्कर से जुड़े लाइन ऑफ़सेट को देखकर सही किया जाता है।
var evalCounter = 0;
var lineCounter = 0;
var lineOffsetTable = {};
function myEval(code) {
lineOffsetTable[evalCounter] = lineCounter;
lineCounter += countLines(code);
return eval("//# sourceURL=" + (evalCounter++) + "\n" + code);
}
window.onerror = function(errorMsg, url, lineNumber, column, e) {
var stackFrames = ErrorStackParser.parse(e);
logStackTrace(stackFrames.map(function(f) {
if(f.fileName in lineOffsetTable)
f.lineNumber += lineOffsetTable[f.fileName];
return f;
}));
};
दुर्भाग्यवश, यह इस समय केवल फ़ायरफ़ॉक्स में काम करता है। क्रोम त्रुटि ऑब्जेक्ट को आतंक कॉलबैक में पास करने से इंकार कर देता है (एक समस्या जो केवल eval'ed कोड के साथ होती है, अजीब रूप से पर्याप्त) और IE SourceURL निर्देश को अनदेखा करता है।
मुझे नहीं लगता कि यह संभव है क्योंकि अंतर्निहित तंत्र माना जाता है कि काम वास्तव में deprecated है। सुरक्षा कारणों से ब्राउज़र अब त्रुटि ऑब्जेक्ट को जावास्क्रिप्ट पर पास नहीं करते हैं।
हालांकि, चूंकि आप एक कस्टम प्रोग्रामिंग भाषा के साथ काम कर रहे हैं जो जावास्क्रिप्ट में संकलित हो जाता है, तो आप जानते हैं कि परिणामी स्क्रिप्ट की संरचना क्या होगी। आप परिणामी जावास्क्रिप्ट में कथन काउंटर भी पेश कर सकते हैं, ताकि आप हमेशा यह जान सकें कि आखिरी चीज़ क्या निष्पादित की गई थी।
var __column=0;
var __line=0;
function(1); __column+=12;
function(2); /*__column+=12;*/ __line++; __column=0;
function(3); /*__column+=12;*/ __line++; __column=0;
कहाँ 12 "function(n);".length
है .Of बेशक, जिसके परिणामस्वरूप कोड बदसूरत है, लेकिन आप एक डिबग ध्वज या कुछ और के साथ इस व्यवहार को सक्षम कर सकते हैं: कुछ की तरह: के रूप में
function(1); function(2);
function(3);
अनुवाद किया जा सकता।
त्रुटि ऑब्जेक्ट प्राप्त करना संभव है, लेकिन यह वास्तव में मदद नहीं करता है जब प्रदान की गई लाइन/कॉलम जोड़े अद्वितीय नहीं होते हैं। (और वे नहीं हैं, क्योंकि मैं अलग-अलग कोड के कई हिस्सों को अलग करता हूं।) मुझे जो दिलचस्पी है वह किसी भी तरह से जेएस इंजन को एक उपयुक्त स्टैक ट्रेस उत्पन्न करने के लिए कह रहा है। उदाहरण के लिए, इसके वीएम मॉड्यूल का उपयोग करके नोडजेएस में यह संभव है, और मैं ब्राउज़र पर ऐसा करने का एक तरीका ढूंढ रहा हूं। – user3026691
प्रस्तावित समाधान के लिए, अंतिम स्थान जहां निष्पादन हुआ था, विशेष रूप से उपयोगी नहीं है, इसलिए जहां भी कोई फ़ंक्शन दर्ज किया गया/वापस लौटाया जाता है, तो मुझे उनमें से एक ढेर बनाए रखना होगा। मुझे अस्थायी चर का उपयोग करके एक (बी (सी)) या यहां तक कि एक + बी + सी जैसी चीजों को भी फ़्लैट करना होगा। यह हर ऑपरेशन के लिए बहुत सारे बॉयलरप्लेट है, जो मेरे मुख्य उपयोग मामले (गेम विकास) के लिए अवांछनीय है। भले ही मैं विकास प्रक्रिया के दौरान प्रदर्शन हिट के साथ रख सकूं, फिर भी मैं इस सुविधा को तैनात उत्पाद में बंद कर दूंगा, इसलिए उपयोगकर्ताओं के साथ होने वाली किसी भी त्रुटि को डीबग करना मुश्किल होगा। – user3026691
क्यों एक जेएस फ़ाइल में eval और डंप में इस्तेमाल स्ट्रिंग नहीं मिलता है ... – IMTheNachoMan
- 1. एएसपी: लिंकबटन और इवल
- 2. PHP चेतावनी: अवैध स्ट्रिंग ऑफ़सेट
- 3. ट्विटर इवल और स्कैला नोटबुक
- 4. ऑफ़सेट
- 5. एफ # इवल
- 6. वैकल्पिक ईविल इवल - रिलेशनल ऑपरेटर
- 7. कॉमा और लाइन डिलीमीटर के साथ टोकननाइज़िंग स्ट्रिंग कैसे करें
- 8. पांडा नए कॉलम नाम के साथ स्ट्रिंग
- 9. जावास्क्रिप्ट के साथ एक डाटाग्रिड कॉलम छुपाएं?
- 10. ऑफ़सेट
- 11. जावास्क्रिप्ट मल्टी-लाइन स्ट्रिंग और अप्रत्याशित टोकन ILLEGAL
- 12. पृष्ठ संख्या और ऑफ़सेट
- 13. ऑफ़सेट
- 14. फायरबग और ऑफ़सेट गणना
- 15. ऑफ़सेट
- 16. पोस्टग्रेज़ में सीमा और ऑफ़सेट के साथ अद्यतन तालिका
- 17. स्ट्रिंग फ़ील्ड लंबाई सीमा और लाइन ब्रेक
- 18. ऑफ़सेट
- 19. ऑफ़सेट/पुश
- 20. जावास्क्रिप्ट स्ट्रिंग में '-' के साथ '-' को बदलें
- 21. एएसपी.Net: पैसे अभिव्यक्तियों के लिए इवल प्रारूप
- 22. मैं इस अवैध स्ट्रिंग ऑफ़सेट को कैसे सही करूं?
- 23. जावास्क्रिप्ट स्ट्रिंग
- 24. लाइन-ऊंचाई आधार रेखा को ऑफ़सेट कैसे करें?
- 25. सटीक ऑफ़सेट
- 26. Eval के साथ OnClientClick ईवेंट के साथ जावास्क्रिप्ट फ़ंक्शन को कैसे बाध्य करें?
- 27. जावास्क्रिप्ट स्ट्रिंग प्रकार और स्ट्रिंग ऑब्जेक्ट के बीच अंतर?
- 28. जावास्क्रिप्ट एक नई लाइन
- 29. जावास्क्रिप्ट स्ट्रिंग और अक्षर के लिए ++ के साथ अलग-अलग त्रुटियों का उत्पादन क्यों करता है?
- 30. जावास्क्रिप्ट में नई लाइन द्वारा स्ट्रिंग से सरणी कैसे बनाएं?
शायद स्रोतमैप जाने का रास्ता हैं, लेकिन मुझे नहीं पता कि वे 'eval' के साथ काम करते हैं या नहीं। – Bergi
मुझे लगता है कि एक स्रोत द्वारा एक स्रोतमैप उत्पन्न किया जाना चाहिए जो कि एक ही स्ट्रिंग में मूल्यांकन करने के लिए भाग को जोड़ता है, लेकिन मुझे विशेष रूप से अलग-अलग हिस्सों का मूल्यांकन करने की आवश्यकता होती है, क्योंकि एक निश्चित खंड में परिभाषित कार्यों का उपयोग उत्पन्न करने की प्रक्रिया में किया जा सकता है बाद में भाग – user3026691
आप ऐसा क्यों करना चाहते हैं? –