जब मैं अपवाद छोड़ता हूं तो मुझे एक जावास्क्रिप्ट स्टैक ट्रेस कैसे मिल सकता है?


519

यदि मैं स्वयं एक जावास्क्रिप्ट अपवाद को फेंक देता हूं (उदाहरण के लिए throw "AArrggg"), तो मैं स्टैक ट्रेस (फायरबग में या अन्यथा) कैसे प्राप्त कर सकता हूं? अभी मुझे सिर्फ संदेश मिला है।

संपादित करें : जैसा कि नीचे के कई लोगों ने पोस्ट किया है, जावास्क्रिप्ट अपवाद के लिए स्टैक ट्रेस प्राप्त करना संभव है, लेकिन मैं अपने अपवादों के लिए स्टैक ट्रेस प्राप्त करना चाहता हूं । उदाहरण के लिए:

function foo() {
    bar(2);
}
function bar(n) {
    if (n < 2)
        throw "Oh no! 'n' is too small!"
    bar(n-1);
}

जब fooकहा जाता है, मैं एक स्टैक ट्रेस जो करने के लिए कॉल भी शामिल प्राप्त करना चाहते हैं foo, bar, bar



2008 के बाद से अभी भी बग फायरबग बग ट्रैकर पर खुला है: code.google.com/p/fbug/issues/detail?id=1260 - star!
मिलर मेदिरोस

13
जवाब "नई त्रुटि फेंक ('arrrgh) होना चाहिए;" यह अच्छी तरह से लिखा पृष्ठ देखें: devthought.com/2011/12/22/a-string-is-not-an-error
सुरुचिपूर्ण पासा

1
(2013) अब आप फ़ायरफ़ॉक्स पर फ़ायरबग में स्टैक के निशान प्राप्त कर सकते हैं भले ही यह बस है throw 'arrrgh';, और वे उसी के साथ लगते हैं throw new Error('arrrgh');। क्रोम डीबगर को अभी भी throw new Error('arrrgh');कहा गया है, हालांकि (लेकिन क्रोम अधिक विस्तृत निशान देता है)।
user56reinstatemonica8

26
@ चेतनश्री मैं 'जावास्क्रिप्ट स्टैक ट्रेस' के लिए गया और यह पहला परिणाम था
डेविड सैक्स

जवाबों:


755

2 संपादित करें (2017):

सभी आधुनिक ब्राउज़रों में आप बस कॉल कर सकते हैं: console.trace(); (एमडीएन संदर्भ)

1 संपादित करें (2013):

मूल प्रश्न पर टिप्पणियों में बताया गया एक बेहतर (और सरल) समाधान stack, किसी Errorवस्तु की संपत्ति का उपयोग करना है जैसे:

function stackTrace() {
    var err = new Error();
    return err.stack;
}

यह इस तरह से उत्पादन उत्पन्न करेगा:

DBX.Utils.stackTrace@http://localhost:49573/assets/js/scripts.js:44
DBX.Console.Debug@http://localhost:49573/assets/js/scripts.js:9
.success@http://localhost:49573/:462
x.Callbacks/c@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
x.Callbacks/p.fireWith@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
k@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
.send/r@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6

URL के साथ कॉलिंग फ़ंक्शन का नाम, उसका कॉलिंग फ़ंक्शन, और इसी तरह देना।

मूल (2009):

इस स्निपेट का एक संशोधित संस्करण कुछ हद तक मदद कर सकता है:

function stacktrace() { 
  function st2(f) {
    return !f ? [] : 
        st2(f.caller).concat([f.toString().split('(')[0].substring(9) + '(' + f.arguments.join(',') + ')']);
  }
  return st2(arguments.callee.caller);
}

11
मुझे यकीन नहीं है कि इस पर अधिक मतदान क्यों नहीं हुआ - अन्य जवाबों ने मेरे लिए अच्छा काम नहीं किया। : Btw, यकीन है कि एक सरणी के रूप में इलाज तर्क (अद्यतन यहाँ झलकी के लिए नहीं कर gist.github.com/965603 )
ripper234

1
क्रोम में काम नहीं कर रहा, निलम्बित (): [अपवाद: टाइपError: ऑब्जेक्ट # <ऑब्जेक्ट> का कोई तरीका नहीं है
hetaoblog

3
मूल प्रश्न पर टिप्पणी देखें: आपको कस्टम कोड की आवश्यकता नहीं है, बस "थ्रो न्यू एरर ('एर्रग') का उपयोग करें"
जोशुआ रिचर्डसन

16
IE में त्रुटि.स्टैक अपरिभाषित है, केवल क्रोम और मोज़िला फ़ायरफ़ॉक्स में काम करता है
फिलिप मुनिन

4
ध्यान दें कि callerअब हटा calleeदिया गया है और ईएस 5 सख्त मोड से हटा दिया गया है। यहाँ क्यों stackoverflow.com/questions/103598/…
PhilT

187

ध्यान दें कि क्रोमियम / क्रोम (V8 का उपयोग करने वाले अन्य ब्राउज़र), और फ़ायरफ़ॉक्स में एरर ऑब्जेक्ट्स पर स्टैक प्रॉपर्टी के माध्यम से स्टैकट्रेस प्राप्त करने के लिए एक सुविधाजनक इंटरफ़ेस भी है ।

try {
   // Code throwing an exception
} catch(e) {
  console.log(e.stack);
}

यह आधार अपवादों के साथ-साथ उन लोगों के लिए भी लागू होता है जिन्हें आप स्वयं फेंकते हैं। (माना जाता है कि आप त्रुटि वर्ग का उपयोग करते हैं, जो कि वैसे भी एक अच्छा अभ्यास है)।

V8 प्रलेखन पर विवरण देखें


12
फ़ायरफ़ॉक्स .stackसंपत्ति का भी समर्थन करता है।
kennytm

2
काश मैं 100 बार उत्थान कर पाता! थैंक्यू जॉचलीएन। इसने वास्तव में बहुत मदद की
सफारी

1
तुम भी उपयोग कर सकते हैं console.error(e.stack);तो यह एक डिफ़ॉल्ट अपवाद संदेश की तरह दिखता है
ब्रूनो Peres

80

फ़ायरफ़ॉक्स में ऐसा लगता है कि आपको अपवाद को फेंकने की आवश्यकता नहीं है। यह करने के लिए पर्याप्त है

e = new Error();
console.log(e.stack);

मोबाइल एप्लिकेशन (JQM का उपयोग करके निर्मित) में भी काम करता है।
समिक आर

क्रोमियम में भी काम करता है (वैसे भी संस्करण 43)।
एंडी बेवरली

फ़ायरफ़ॉक्स 59 में यह तब काम नहीं करता है जब इसे कॉल किया जाता है window.onerror, यह केवल onerrorफ़ंक्शन के साथ लगभग खाली स्टैक दिखाता है।
कोड

इससे भी बेहतर, आप कर सकते हैं: console.log(new Error().stack)> : ( : > : (>:
एंड्रयू

25

यदि आपके पास फायरबग है, तो स्क्रिप्ट टैब में सभी त्रुटियों के विकल्प पर ब्रेक है। एक बार जब स्क्रिप्ट आपके ब्रेकपॉइंट पर आ जाती है, तो आप फायरबग की स्टैक विंडो को देख सकते हैं:

स्क्रीनशॉट


5
Hrm, कि काम करने के लिए प्रतीत नहीं होता है। यह मुझे जावास्क्रिप्ट (जैसे अपरिभाषित चर त्रुटियों) द्वारा उठाए गए त्रुटियों पर डिबगर में रोकता है, लेकिन जब मैं अपने स्वयं के अपवादों को फेंकता हूं तो मुझे अभी भी कुछ नहीं मिलता है, लेकिन "अनकैप्ड अपवाद" संदेश।
डेविड वोलेवर

11

मूल प्रश्न पर टिप्पणियों में बताया गया एक अच्छा (और सरल) समाधान stackकिसी Errorवस्तु की संपत्ति का उपयोग करना है:

function stackTrace() {
    var err = new Error();
    return err.stack;
}

यह इस तरह से उत्पादन उत्पन्न करेगा:

DBX.Utils.stackTrace@http://localhost:49573/assets/js/scripts.js:44
DBX.Console.Debug@http://localhost:49573/assets/js/scripts.js:9
.success@http://localhost:49573/:462
x.Callbacks/c@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
x.Callbacks/p.fireWith@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
k@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
.send/r@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6

URL और लाइन नंबर के साथ कॉलिंग फ़ंक्शन का नाम, उसका कॉलिंग फ़ंक्शन, और इसी तरह।

मेरे पास वास्तव में विस्तृत और सुंदर समाधान है जिसे मैंने एक परियोजना के लिए तैयार किया है, जिस पर मैं वर्तमान में काम कर रहा हूं और मैंने इसे सामान्यीकृत करने के लिए थोड़ा सा निकाला और पुन: काम किया है। यह रहा:

(function(context){
    // Only global namespace.
    var Console = {
        //Settings
        settings: {
            debug: {
                alwaysShowURL: false,
                enabled: true,
                showInfo: true
            },
            stackTrace: {
                enabled: true,
                collapsed: true,
                ignoreDebugFuncs: true,
                spacing: false
            }
        }
    };

    // String formatting prototype function.
    if (!String.prototype.format) {
        String.prototype.format = function () {
            var s = this.toString(),
                args = typeof arguments[0],
                args = (("string" == args || "number" == args) ? arguments : arguments[0]);
            if (!arguments.length)
                return s;
            for (arg in args)
                s = s.replace(RegExp("\\{" + arg + "\\}", "gi"), args[arg]);
            return s;
        }
    }

    // String repeating prototype function.
    if (!String.prototype.times) {
        String.prototype.times = function () {
            var s = this.toString(),
                tempStr = "",
                times = arguments[0];
            if (!arguments.length)
                return s;
            for (var i = 0; i < times; i++)
                tempStr += s;
            return tempStr;
        }
    }

    // Commonly used functions
    Console.debug = function () {
        if (Console.settings.debug.enabled) {
            var args = ((typeof arguments !== 'undefined') ? Array.prototype.slice.call(arguments, 0) : []),
                sUA = navigator.userAgent,
                currentBrowser = {
                    firefox: /firefox/gi.test(sUA),
                    webkit: /webkit/gi.test(sUA),
                },
                aLines = Console.stackTrace().split("\n"),
                aCurrentLine,
                iCurrIndex = ((currentBrowser.webkit) ? 3 : 2),
                sCssBlack = "color:black;",
                sCssFormat = "color:{0}; font-weight:bold;",
                sLines = "";

            if (currentBrowser.firefox)
                aCurrentLine = aLines[iCurrIndex].replace(/(.*):/, "$1@").split("@");
            else if (currentBrowser.webkit)
                aCurrentLine = aLines[iCurrIndex].replace("at ", "").replace(")", "").replace(/( \()/gi, "@").replace(/(.*):(\d*):(\d*)/, "$1@$2@$3").split("@");

            // Show info if the setting is true and there's no extra trace (would be kind of pointless).
            if (Console.settings.debug.showInfo && !Console.settings.stackTrace.enabled) {
                var sFunc = aCurrentLine[0].trim(),
                    sURL = aCurrentLine[1].trim(),
                    sURL = ((!Console.settings.debug.alwaysShowURL && context.location.href == sURL) ? "this page" : sURL),
                    sLine = aCurrentLine[2].trim(),
                    sCol;

                if (currentBrowser.webkit)
                    sCol = aCurrentLine[3].trim();

                console.info("%cOn line %c{0}%c{1}%c{2}%c of %c{3}%c inside the %c{4}%c function:".format(sLine, ((currentBrowser.webkit) ? ", column " : ""), ((currentBrowser.webkit) ? sCol : ""), sURL, sFunc),
                             sCssBlack, sCssFormat.format("red"),
                             sCssBlack, sCssFormat.format("purple"),
                             sCssBlack, sCssFormat.format("green"),
                             sCssBlack, sCssFormat.format("blue"),
                             sCssBlack);
            }

            // If the setting permits, get rid of the two obvious debug functions (Console.debug and Console.stackTrace).
            if (Console.settings.stackTrace.ignoreDebugFuncs) {
                // In WebKit (Chrome at least), there's an extra line at the top that says "Error" so adjust for this.
                if (currentBrowser.webkit)
                    aLines.shift();
                aLines.shift();
                aLines.shift();
            }

            sLines = aLines.join(((Console.settings.stackTrace.spacing) ? "\n\n" : "\n")).trim();

            trace = typeof trace !== 'undefined' ? trace : true;
            if (typeof console !== "undefined") {
                for (var arg in args)
                    console.debug(args[arg]);

                if (Console.settings.stackTrace.enabled) {
                    var sCss = "color:red; font-weight: bold;",
                        sTitle = "%c Stack Trace" + " ".times(70);

                    if (Console.settings.stackTrace.collapsed)
                        console.groupCollapsed(sTitle, sCss);
                    else
                        console.group(sTitle, sCss);

                    console.debug("%c" + sLines, "color: #666666; font-style: italic;");

                    console.groupEnd();
                }
            }
        }
    }
    Console.stackTrace = function () {
        var err = new Error();
        return err.stack;
    }

    context.Console = Console;
})(window);

GitHub (वर्तमान में v1.2) पर इसे देखें ! आप इसका उपयोग कर सकते हैं Console.debug("Whatever");और यह, सेटिंग्स के आधार पर Console, आउटपुट प्रिंट और स्टैक ट्रेस (या बस सरल जानकारी / कुछ भी अतिरिक्त नहीं) के आधार पर कर सकता है। यहाँ एक उदाहरण है:

Console.js

Consoleऑब्जेक्ट में सेटिंग्स के साथ चारों ओर खेलना सुनिश्चित करें ! आप ट्रेस की पंक्तियों के बीच रिक्ति जोड़ सकते हैं और इसे पूरी तरह से बंद कर सकते हैं। यहाँ यह Console.traceसेट के साथ है false:

कोई निशान

आप दिखाई गई जानकारी के पहले बिट (सेट ) Console.settings.debug.showInfoको बंद कर सकते हैं falseया डिबगिंग को पूरी तरह से अक्षम कर सकते हैं (सेट Console.settings.debug.enabledपर false) ताकि आपको फिर से डिबग स्टेटमेंट पर टिप्पणी न करनी पड़े! बस उन्हें छोड़ दो और यह कुछ नहीं करेगा।


10

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


आह, धन्यवाद - पहला लिंक ऐसा लगता है जैसे यह कर सकता है (हालांकि पुनरावृत्ति समर्थन की कमी इसे अविश्वसनीय बना सकती है)।
डेविड वोलेवर

हाँ, मैंने पहली नज़र में किसी भी समर्थित पुनरावृत्ति को नहीं देखा था। मुझे यह देखने के लिए उत्सुक होना चाहिए कि क्या इसका कोई अच्छा समाधान है।
मार्क बेज़

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

हेलेरी: दूसरा यहां काम नहीं करेगा क्योंकि, जब मैं अपवाद को पकड़ता हूं, तो यह एक "स्ट्रिंग" (यानी, कोई "e.stack") नहीं है: foo = function () {फेंक "Arg"; } कोशिश {foo (); } catch (e) {/ * टाइपोफ़ e == "स्ट्रिंग" * /} शायद मैं इसे गलत फेंक रहा हूँ? (जावास्क्रिप्ट कैसे बेवकूफ ट्यूटोरियल हैं के बारे में अनिवार्य शेख़ी शुरू ...)
डेविड वोलेवर

किसी वस्तु को फेंकने की कोशिश करें throw { name: 'NameOfException', message: 'He's dead, Jim' }:।
आरोन दिगुल्ला

7

आप उदाहरण के लिए stack( stacktraceओपेरा में) गुणों को एक्सेस कर सकते हैं, Errorभले ही आपने इसे फेंक दिया हो। बात यह है, आपको यह सुनिश्चित करने की ज़रूरत है कि आप उपयोग throw new Error(string)करते हैं ( इसके बजाय नए को मत भूलना throw string

उदाहरण:

try {
    0++;
} catch (e) {
    var myStackTrace = e.stack || e.stacktrace || "";
}

स्टैकट्रेस ओपेरा में काम नहीं करता है। मैं भी इसके बारे में कुछ नहीं मिल सकता है।
NVI

@ एनवी: ऐसा लगता है कि स्टैकट्रेस उपयोगकर्ता द्वारा बनाई गई त्रुटियों पर नहीं है, इसलिए आपको इसके बजाय ऐसा करना चाहिए: {0 ++} कैच (ई) {myStackTrace = e.stack || e.stacktrace}
एली ग्रे


7

यह आधुनिक क्रोम, ओपेरा, फ़ायरफ़ॉक्स और IE10 + के लिए स्टैक ट्रेस (स्ट्रिंग के सरणी के रूप में) देगा

function getStackTrace () {

  var stack;

  try {
    throw new Error('');
  }
  catch (error) {
    stack = error.stack || '';
  }

  stack = stack.split('\n').map(function (line) { return line.trim(); });
  return stack.splice(stack[0] == 'Error' ? 2 : 1);
}

उपयोग:

console.log(getStackTrace().join('\n'));

यह स्टैक से अपने स्वयं के कॉल के साथ-साथ "त्रुटि" शीर्षक से बाहर रखता है जो क्रोम और फ़ायरफ़ॉक्स (लेकिन IE नहीं) द्वारा उपयोग किया जाता है।

यह पुराने ब्राउज़रों पर क्रैश नहीं होना चाहिए, लेकिन बस खाली सरणी लौटाएं। यदि आपको अधिक सार्वभौमिक समाधान की आवश्यकता है तो स्टैक्ट्रेस.जेएस देखें । समर्थित ब्राउज़रों की इसकी सूची वास्तव में प्रभावशाली है, लेकिन मेरे दिमाग में यह उस छोटे से काम के लिए बहुत बड़ी है, जिसका उद्देश्य इसके लिए है: सभी निर्भरता सहित 37 kb का छोटा पाठ।


7

यूजीन के उत्तर के लिए एक अपडेट: stackसंपत्ति को आबाद करने के लिए IE (विशिष्ट संस्करण?) के लिए त्रुटि वस्तु को फेंक दिया जाना चाहिए । निम्न को अपने वर्तमान उदाहरण से बेहतर काम करना चाहिए, और undefinedजब IE में वापस आने से बचना चाहिए ।

function stackTrace() {
  try {
    var err = new Error();
    throw err;
  } catch (err) {
    return err.stack;
  }
}

नोट 1: इस तरह का काम केवल डिबगिंग के समय किया जाना चाहिए, और लाइव होने पर अक्षम होना चाहिए, खासकर अगर अक्सर कहा जाता है। नोट 2: यह सभी ब्राउज़रों में काम नहीं कर सकता है, लेकिन एफएफ और आईई 11 में काम करता है, जो मेरी जरूरतों के हिसाब से ठीक है।


6

फायरबग पर वास्तविक स्टैक ट्रेस प्राप्त करने का एक तरीका एक अपरिभाषित फ़ंक्शन को कॉल करने जैसी वास्तविक त्रुटि बनाना है:

function foo(b){
  if (typeof b !== 'string'){
    // undefined Error type to get the call stack
    throw new ChuckNorrisError("Chuck Norris catches you.");
  }
}

function bar(a){
  foo(a);
}

foo(123);

या स्टैक ट्रेस दिखाता है के बाद से console.error()एक throwबयान के बाद का उपयोग करें console.error()


4

यह पॉलीफ़िल कोड आधुनिक (2017) ब्राउज़र (IE11, Opera, Chrome, FireFox, Yandex) में काम कर रहा है:

printStackTrace: function () {
    var err = new Error();
    var stack = err.stack || /*old opera*/ err.stacktrace || ( /*IE11*/ console.trace ? console.trace() : "no stack info");
    return stack;
}

अन्य उत्तर:

function stackTrace() {
  var err = new Error();
  return err.stack;
}

IE 11 में काम नहीं कर रहा है!

तर्कों का उपयोग करना ।allee.caller - किसी भी ब्राउज़र में सख्त मोड में काम नहीं करना!


3

Google Chrome में (संस्करण 19.0 और उससे आगे), बस एक अपवाद को फेंकना पूरी तरह से काम करता है। उदाहरण के लिए:

/* file: code.js, line numbers shown */

188: function fa() {
189:    console.log('executing fa...');
190:    fb();
191: }
192:
193: function fb() {
194:    console.log('executing fb...');
195:    fc()
196: }
197:
198: function fc() {
199:    console.log('executing fc...');
200:    throw 'error in fc...'
201: }
202:
203: fa();

ब्राउज़र के कंसोल आउटपुट पर स्टैक ट्रेस दिखाएगा:

executing fa...                         code.js:189
executing fb...                         code.js:194
executing fc...                         cdoe.js:199
/* this is your stack trace */
Uncaught error in fc...                 code.js:200
    fc                                  code.js:200
    fb                                  code.js:195
    fa                                  code.js:190
    (anonymous function)                code.js:203

उममीद है कि इससे मदद मिलेगी।


3

समारोह:

function print_call_stack(err) {
    var stack = err.stack;
    console.error(stack);
}

उदाहरण:

     try{
         aaa.bbb;//error throw here
     }
     catch (err){
         print_call_stack(err); 
     }

2
<script type="text/javascript"
src="https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js"></script>
<script type="text/javascript">
    try {
        // error producing code
    } catch(e) {
        var trace = printStackTrace({e: e});
        alert('Error!\n' + 'Message: ' + e.message + '\nStack trace:\n' + trace.join('\n'));
        // do something else with error
    }
</script>

यह स्क्रिप्ट त्रुटि दिखाएगा


2
function stacktrace(){
  return (new Error()).stack.split('\n').reverse().slice(0,-2).reverse().join('\n');
}

2
हालांकि यह कोड इस सवाल का जवाब दे सकता है कि समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है और उत्तर के दीर्घकालिक मूल्य में सुधार करेगा।
डोनाल्ड डक

1

पार्टी के लिए देर से, लेकिन, यहाँ एक और समाधान है, जो ऑटोडेट को तर्क देता है। उपलब्ध है, और नई त्रुटि का उपयोग करता है ()। यदि नहीं तो स्टैक। क्रोम, सफारी और फ़ायरफ़ॉक्स में परीक्षण किया गया।

2 वेरिएंट - stackFN (n) आपको तत्काल कॉलर से n फ़ंक्शन का नाम n देता है, और stackArray () आपको एक सरणी देता है, stackArray () [0] तत्काल कॉलर।

इसे http://jsfiddle.net/qcP9y/6/ पर आज़माएं

// returns the name of the function at caller-N
// stackFN()  = the immediate caller to stackFN
// stackFN(0) = the immediate caller to stackFN
// stackFN(1) = the caller to stackFN's caller
// stackFN(2) = and so on
// eg console.log(stackFN(),JSON.stringify(arguments),"called by",stackFN(1),"returns",retval);
function stackFN(n) {
    var r = n ? n : 0, f = arguments.callee,avail=typeof f === "function",
        s2,s = avail ? false : new Error().stack;
    if (s) {
        var tl=function(x) { s = s.substr(s.indexOf(x) + x.length);},
        tr = function (x) {s = s.substr(0, s.indexOf(x) - x.length);};
        while (r-- >= 0) {
            tl(")");
        }
        tl(" at ");
        tr("(");
        return s;
    } else {
        if (!avail) return null;
        s = "f = arguments.callee"
        while (r>=0) {
            s+=".caller";
            r--;   
        }
        eval(s);
        return f.toString().split("(")[0].trim().split(" ")[1];
    }
}
// same as stackFN() but returns an array so you can work iterate or whatever.
function stackArray() {
    var res=[],f = arguments.callee,avail=typeof f === "function",
        s2,s = avail ? false : new Error().stack;
    if (s) {
        var tl=function(x) { s = s.substr(s.indexOf(x) + x.length);},
        tr = function (x) {s = s.substr(0, s.indexOf(x) - x.length);};
        while (s.indexOf(")")>=0) {
            tl(")");
            s2= ""+s;
            tl(" at ");
            tr("(");
            res.push(s);
            s=""+s2;
        }
    } else {
        if (!avail) return null;
        s = "f = arguments.callee.caller"
        eval(s);
        while (f) {
            res.push(f.toString().split("(")[0].trim().split(" ")[1]);
            s+=".caller";
            eval(s);
        }
    }
    return res;
}


function apple_makes_stuff() {
    var retval = "iPhones";
    var stk = stackArray();

    console.log("function ",stk[0]+"() was called by",stk[1]+"()");
    console.log(stk);
    console.log(stackFN(),JSON.stringify(arguments),"called by",stackFN(1),"returns",retval);
    return retval;
}



function apple_makes (){
    return apple_makes_stuff("really nice stuff");
}

function apple () {
    return apple_makes();
}

   apple();

1

आप इस पुस्तकालय का उपयोग कर सकते हैं http://www.stacktracejs.com/ । यह बहुत अच्छा है

प्रलेखन से

आप IE या सफारी में उपलब्ध स्टैकट्रेस नहीं पाने के लिए अपनी त्रुटि में भी पास कर सकते हैं

<script type="text/javascript" src="https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js"></script>
<script type="text/javascript">
    try {
        // error producing code
    } catch(e) {
        var trace = printStackTrace({e: e});
        alert('Error!\n' + 'Message: ' + e.message + '\nStack trace:\n' + trace.join('\n'));
        // do something else with error
    }
</script>

लिंक किया गया स्रोत https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.jsएक पुराना संस्करण है, सबसे नया स्थिर संस्करण (कोड-स्निपेट से मेल खाता है) यहां है:https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
फ्रेडेरिक लीटनबर्गर

1

यहां एक जवाब है जो आपको अधिकतम प्रदर्शन (IE 6+) और अधिकतम संगतता देता है। आईई 6 के साथ संगत!

    function stacktrace( log_result ) {
    	var trace_result;
    // IE 6 through 9 compatibility
    // this is NOT an all-around solution because
    // the callee property of arguments is depredicated
    /*@cc_on
    	// theese fancy conditinals make this code only run in IE
    	trace_result = (function st2(fTmp) {
    		// credit to Eugene for this part of the code
    		return !fTmp ? [] :
    			st2(fTmp.caller).concat([fTmp.toString().split('(')[0].substring(9) + '(' + fTmp.arguments.join(',') + ')']);
    	})(arguments.callee.caller);
    	if (log_result) // the ancient way to log to the console
    		Debug.write( trace_result );
    	return trace_result;
    @*/
    	console = console || Console;	// just in case
    	if (!(console && console.trace) || !log_result){
    		// for better performance in IE 10
    		var STerror=new Error();
    		var unformated=(STerror.stack || STerror.stacktrace);
    		trace_result = "\u25BC console.trace" + unformated.substring(unformated.indexOf('\n',unformated.indexOf('\n'))); 
    	} else {
    		// IE 11+ and everyone else compatibility
    		trace_result = console.trace();
    	}
    	if (log_result)
    		console.log( trace_result );
    	
    	return trace_result;
    }
// test code
(function testfunc(){
	document.write( "<pre>" + stacktrace( false ) + "</pre>" );
})();


0

IE की तुलना में फ़ायरफ़ॉक्स पर स्टैक ट्रेस प्राप्त करना आसान है, लेकिन मौलिक रूप से यहां वही है जो आप करना चाहते हैं:

एक कोशिश / पकड़ ब्लॉक में "समस्याग्रस्त" कोड का टुकड़ा लपेटें:

try {
    // some code that doesn't work
    var t = null;
    var n = t.not_a_value;
}
    catch(e) {
}

यदि आप "त्रुटि" ऑब्जेक्ट की सामग्री की जांच करेंगे तो इसमें निम्नलिखित फ़ील्ड शामिल हैं:

e.fileName: स्रोत फ़ाइल / पृष्ठ जहाँ समस्या e.lineNumber से आई थी: फ़ाइल / पृष्ठ में पंक्ति संख्या जहाँ समस्या उत्पन्न हुई e.message: किस प्रकार की त्रुटि हुई यह बताने वाला एक सरल संदेश e.name: प्रकार जो त्रुटि हुई, उसके ऊपर के उदाहरण में 'टाइपइर्र' होना चाहिए। उदाहरण: स्टैक ट्रेस में अपवाद शामिल है

मुझे आशा है कि यह आपकी मदद करेगा।


1
गलत। वह अपने स्वयं के अपवादों को पकड़ने की कोशिश कर रहा है। यदि वह "asdfg" फेंकता है, तो उसे स्ट्रिंग ऑब्जेक्ट मिलेगा, अपवाद ऑब्जेक्ट नहीं। वह अंतर्निहित अपवादों को पकड़ने की कोशिश नहीं कर रहा है।
इवान वुज़िका

0

मुझे IE11 के साथ स्मार्टग्वेट में एक अंतहीन पुनरावृत्ति की जांच करनी थी, इसलिए गहराई से जांच करने के लिए, मुझे स्टैक ट्रेस की आवश्यकता थी। समस्या यह थी, कि मैं देव कंसोल का उपयोग करने में असमर्थ था, क्योंकि प्रजनन उस तरह से अधिक कठिन था।
एक जावास्क्रिप्ट विधि में निम्नलिखित का उपयोग करें:

try{ null.toString(); } catch(e) { alert(e.stack); }

चेतावनी (नई त्रुटि ()) स्टैक);
अमीर रईस

0

वाह - मैं 6 साल में एक भी व्यक्ति को यह देखने का सुझाव नहीं देता कि हम यह देखने के लिए पहले देखें कि stackक्या उपयोग करने से पहले उपलब्ध है! एक त्रुटि हैंडलर में आप जो सबसे खराब काम कर सकते हैं, वह यह है कि किसी चीज को कॉल करने के कारण त्रुटि होती है जो मौजूद नहीं है।

जैसा कि दूसरों ने कहा है, जबकि stackज्यादातर उपयोग करने के लिए सुरक्षित है अब यह IE9 या इससे पहले समर्थित नहीं है।

मैं अपनी अप्रत्याशित त्रुटियों को लॉग करता हूं और एक स्टैक ट्रेस बहुत आवश्यक है। अधिकतम समर्थन के लिए मैं पहले यह देखने के लिए जांचता हूं कि क्या Error.prototype.stackमौजूद है और एक फ़ंक्शन है। यदि ऐसा है तो यह उपयोग करने के लिए सुरक्षित है error.stack

        window.onerror = function (message: string, filename?: string, line?: number, 
                                   col?: number, error?: Error)
        {
            // always wrap error handling in a try catch
            try 
            {
                // get the stack trace, and if not supported make our own the best we can
                var msg = (typeof Error.prototype.stack == 'function') ? error.stack : 
                          "NO-STACK " + filename + ' ' + line + ':' + col + ' + message;

                // log errors here or whatever you're planning on doing
                alert(msg);
            }
            catch (err)
            {

            }
        };

संपादित करें: ऐसा प्रतीत होता है कि चूंकि stackएक संपत्ति है और एक विधि नहीं है जिसे आप सुरक्षित रूप से पुराने ब्राउज़रों पर भी कॉल कर सकते हैं। मैं अभी भी उलझन में हूं क्योंकि मुझे पूरा यकीन था कि चेकिंग Error.prototypeमेरे लिए पहले काम कर चुकी है और अब ऐसा नहीं है - इसलिए मुझे यकीन नहीं है कि क्या चल रहा है।


0

console.error(e.stack)फ़ायरफ़ॉक्स का उपयोग केवल लॉग में स्टैकट्रेस दिखाता है, क्रोम भी संदेश दिखाता है। यदि संदेश में महत्वपूर्ण जानकारी है तो यह एक बुरा आश्चर्य हो सकता है। हमेशा दोनों को लॉग इन करें।


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