2016-04-04 9 views
7

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

+0

शायद स्रोतमैप जाने का रास्ता हैं, लेकिन मुझे नहीं पता कि वे 'eval' के साथ काम करते हैं या नहीं। – Bergi

+0

मुझे लगता है कि एक स्रोत द्वारा एक स्रोतमैप उत्पन्न किया जाना चाहिए जो कि एक ही स्ट्रिंग में मूल्यांकन करने के लिए भाग को जोड़ता है, लेकिन मुझे विशेष रूप से अलग-अलग हिस्सों का मूल्यांकन करने की आवश्यकता होती है, क्योंकि एक निश्चित खंड में परिभाषित कार्यों का उपयोग उत्पन्न करने की प्रक्रिया में किया जा सकता है बाद में भाग – user3026691

+0

आप ऐसा क्यों करना चाहते हैं? –

उत्तर

0

अब तक का सबसे अच्छा समाधान मैंने पाया है कि प्रत्येक स्ट्रिंग के लिए एक स्रोत 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 निर्देश को अनदेखा करता है।

0

मुझे नहीं लगता कि यह संभव है क्योंकि अंतर्निहित तंत्र माना जाता है कि काम वास्तव में 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); 

अनुवाद किया जा सकता।

+0

त्रुटि ऑब्जेक्ट प्राप्त करना संभव है, लेकिन यह वास्तव में मदद नहीं करता है जब प्रदान की गई लाइन/कॉलम जोड़े अद्वितीय नहीं होते हैं। (और वे नहीं हैं, क्योंकि मैं अलग-अलग कोड के कई हिस्सों को अलग करता हूं।) मुझे जो दिलचस्पी है वह किसी भी तरह से जेएस इंजन को एक उपयुक्त स्टैक ट्रेस उत्पन्न करने के लिए कह रहा है। उदाहरण के लिए, इसके वीएम मॉड्यूल का उपयोग करके नोडजेएस में यह संभव है, और मैं ब्राउज़र पर ऐसा करने का एक तरीका ढूंढ रहा हूं। – user3026691

+0

प्रस्तावित समाधान के लिए, अंतिम स्थान जहां निष्पादन हुआ था, विशेष रूप से उपयोगी नहीं है, इसलिए जहां भी कोई फ़ंक्शन दर्ज किया गया/वापस लौटाया जाता है, तो मुझे उनमें से एक ढेर बनाए रखना होगा। मुझे अस्थायी चर का उपयोग करके एक (बी (सी)) या यहां तक ​​कि एक + बी + सी जैसी चीजों को भी फ़्लैट करना होगा। यह हर ऑपरेशन के लिए बहुत सारे बॉयलरप्लेट है, जो मेरे मुख्य उपयोग मामले (गेम विकास) के लिए अवांछनीय है। भले ही मैं विकास प्रक्रिया के दौरान प्रदर्शन हिट के साथ रख सकूं, फिर भी मैं इस सुविधा को तैनात उत्पाद में बंद कर दूंगा, इसलिए उपयोगकर्ताओं के साथ होने वाली किसी भी त्रुटि को डीबग करना मुश्किल होगा। – user3026691

+0

क्यों एक जेएस फ़ाइल में eval और डंप में इस्तेमाल स्ट्रिंग नहीं मिलता है ... – IMTheNachoMan

संबंधित मुद्दे