फायरबग का उपयोग करके पूरे प्रोग्राम के लिए प्रिंट फ़ंक्शन लॉग / स्टैक ट्रेस


94

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

जवाबों:


218

फ़ायरफ़ॉक्स प्रदान करता है console.trace() जो कॉल स्टैक को प्रिंट करने के लिए बहुत आसान है। यह क्रोम और IE 11 में भी उपलब्ध है ।

वैकल्पिक रूप से कुछ इस तरह का प्रयास करें:

function print_call_stack() {
  var stack = new Error().stack;
  console.log("PRINTING CALL STACK");
  console.log( stack );
}

2
क्या स्टैक की लंबाई बढ़ाने का एक तरीका है? यह बहुत मददगार होगा।
रवि तेजा

✚1 कंसोल.वरन ('[वॉर्न] कॉल स्टैक:', नई त्रुटि (); स्टैक);
user1742529

13

जब मुझे स्टैक ट्रेस की आवश्यकता होती है, तो मैं निम्नलिखित कार्य करता हूं, हो सकता है कि आप इससे कुछ प्रेरणा ले सकें:

function logStackTrace(levels) {
    var callstack = [];
    var isCallstackPopulated = false;
    try {
        i.dont.exist += 0; //doesn't exist- that's the point
    } catch (e) {
        if (e.stack) { //Firefox / chrome
            var lines = e.stack.split('\n');
            for (var i = 0, len = lines.length; i < len; i++) {
                    callstack.push(lines[i]);
            }
            //Remove call to logStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
        else if (window.opera && e.message) { //Opera
            var lines = e.message.split('\n');
            for (var i = 0, len = lines.length; i < len; i++) {
                if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
                    var entry = lines[i];
                    //Append next line also since it has the file info
                    if (lines[i + 1]) {
                        entry += " at " + lines[i + 1];
                        i++;
                    }
                    callstack.push(entry);
                }
            }
            //Remove call to logStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
    }
    if (!isCallstackPopulated) { //IE and Safari
        var currentFunction = arguments.callee.caller;
        while (currentFunction) {
            var fn = currentFunction.toString();
            var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
            callstack.push(fname);
            currentFunction = currentFunction.caller;
        }
    }
    if (levels) {
        console.log(callstack.slice(0, levels).join('\n'));
    }
    else {
        console.log(callstack.join('\n'));
    }
};

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


2
कंसोलब्रेस () कॉल है जो आप फायरबग में कर सकते हैं जो ऐसा करता है।
amccormack

ये जबरदस्त है। फायरबग को मिनीफाइ किए गए फाइलों से परेशानी है, यह स्क्रिप्ट करता है!
पस्टेलर

1
FWIW @ andrew-barber, उत्तर के लेखक ने कभी भी अपना दावा नहीं किया। बस विशेषता नहीं थी। आपका संपादन एक टिप्पणी होना चाहिए।
आसकर

7

मैंने बिना फायरबग के इसे पूरा किया। क्रोम और फ़ायरफ़ॉक्स दोनों में परीक्षण किया गया:

console.error("I'm debugging this code.");

एक बार जब आपका प्रोग्राम कंसोल पर प्रिंट हो जाता है, तो आप कॉल स्टैक का विस्तार करने के लिए उस पर थोड़ा तीर क्लिक कर सकते हैं।


2

यह निर्धारित करने के लिए कि यह सही ढंग से काम करना बंद कर देता है, एक समय में अपने कोड एक लाइन या एक फ़ंक्शन के माध्यम से कदम रखने की कोशिश करें। या अपने कोड के माध्यम से कुछ उचित अनुमान और तितर बितर लॉगिंग बयान करें।


2
यह। निश्चित रूप console.log('something')से अपने कार्यों के लिए बयानों का एक लोड जोड़ें जो यह देखने के लिए हैं कि (और नहीं हैं) कहा जा रहा है
गैरेथ

1
कार्यक्रम बहुत बड़ा है, इसलिए मैं फ़ंक्शन लॉग की तुलना करने के तरीके की तलाश कर रहा हूं जब प्रोग्राम सही तरीके से चला गया जब यह नहीं था।
रात १२:१२

1
मुझे लगता है कि यह उपयोगी होगा। मैं एक बड़े कोड बेस का स्वामित्व लेने के लिए कदम रख रहा हूं और ऐसा कुछ जो सभी फ़ंक्शन कॉल का रनिंग ट्रेस उत्पन्न कर सकता है, निश्चित रूप से कोड के प्रवाह / आकार की भावना प्राप्त करने और मृत कोड का पता लगाने में मदद करेगा।
मैथ्यू निकोल्स

1

इसे इस्तेमाल करे:

console.trace()

मुझे नहीं पता कि यह सभी ब्राउज़रों पर समर्थित है, इसलिए मैं जांच करूंगा कि क्या यह पहले मौजूद है।

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