कंसोल का परिणाम कैसे प्राप्त करें। () क्रोम या फायरफॉक्स के साथ जावास्क्रिप्ट में स्ट्रिंग के रूप में?


99

console.trace()कंसोल पर इसके परिणाम को आउटपुट करता है।
मैं परिणाम को स्ट्रिंग के रूप में प्राप्त करना चाहता हूं और उन्हें एक फ़ाइल में सहेजना चाहता हूं।

मैं कार्यों के लिए नामों को परिभाषित नहीं करता हूं और मैं उनके नाम भी नहीं प्राप्त कर सकता हूं callee.caller.name


1
यह फैंटम जेएस में काम नहीं करता है :(
ईकेकिस

जवाबों:


103

मैं फ़ायरफ़ॉक्स के बारे में निश्चित नहीं हूं, लेकिन v8 / chrome में आप एरर कंस्ट्रक्टर नामक एक विधि का उपयोग कर सकते हैं captureStackTrace। ( अधिक जानकारी यहां )

तो यह पाने के लिए एक हैक करने का तरीका होगा:

var getStackTrace = function() {
  var obj = {};
  Error.captureStackTrace(obj, getStackTrace);
  return obj.stack;
};

console.log(getStackTrace());

आम तौर पर, getStackTraceजब यह कब्जा कर लिया जाता है तो स्टैक पर होगा। वहाँ दूसरा तर्क getStackTraceस्टैक ट्रेस में शामिल होने से बाहर रखता है।


18
आपकी जानकारी के लिए धन्यवाद। कि क्रोम में काम किया, लेकिन फ़ायरफ़ॉक्स में नहीं किया। इसलिए मैंने फिर खोजा और पाया Error().stack। यद्यपि ऑब्जेक्ट और फ़ंक्शन नाम फ़ायरफ़ॉक्स में खो गए हैं और ऑब्जेक्ट नाम क्रोम (उसी के रूप में Error.captureStackTrace) में खो गया है , Error().stackदोनों ब्राउज़र काम करता है और यह मुझे डीबग करने के लिए पर्याप्त जानकारी देता है।
js_

@Konstantin Smolyanin के उत्तर के समान परिणाम प्राप्त करें। परिणामस्वरूप सीमित विवरण।
1:27 पर कोडबीट

यह स्वीकृत उत्तर नहीं होना चाहिए। यहां आपको जो स्टैक मिलता है, वह "कट" होता है, जिसमें केवल "टॉप पार्ट" होता है, जबकि कंसोल.ट्रेस () पूरा स्टैक दिखाएगा। स्टैक गहराई 30 के साथ एक उदाहरण देखें: stackoverflow.com/questions/62768598/…
mathheadinclouds

34

Error.stack वह है जो आपको चाहिए। यह क्रोम और फ़ायरफ़ॉक्स में काम करता है। उदाहरण के लिए

try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}

Chrome में देंगे:

TypeError: Object #<Object> has no method 'debug'
    at eval at <anonymous> (unknown source)
    at eval (native)
    at Object._evaluateOn (unknown source)
    at Object._evaluateAndWrap (unknown source)
    at Object.evaluate (unknown source)

और फ़ायरफ़ॉक्स में:

@http://www.google.com.ua/:87 _firebugInjectedEvaluate("with(_FirebugCommandLine){try { var a = {}; a.debug() } catch(ex) {console.log(ex.stack)}\n};")
@http://www.google.com.ua/:87 _firebugEvalEvent([object Event])
@http://www.google.com.ua/:67

2
आपके उत्तर के लिए धन्यवाद। लेकिन वह तभी काम करता है जब अपवाद हुआ हो। मुझे बिना किसी अपवाद के स्टैक ट्रेस प्राप्त करने की आवश्यकता है।
js_

8
के बारे में क्या(new Error).stack
जेसनस्मिथ

यह a.debug () पर एक अपवाद फेंकना चाहिए - यह स्टैक प्राप्त करने का एक महंगा तरीका है, लेकिन काम करना चाहिए।
फिजियारोन

यह दृष्टिकोण भी काम में आता है जब कुछ कोड से ट्रेस प्राप्त करने की कोशिश की जाती है जो केवल पर चल सकते हैं, जैसे कि PhantomJS या जो भी कारण हो।
मोमस्पिन

18

यह आधुनिक क्रोम, फ़ायरफ़ॉक्स, ओपेरा और 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 नहीं) द्वारा उपयोग किया जाता है।

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


12

स्टेक्ट्रेस.जेएस नामक एक पुस्तकालय है जो आपको क्रॉस ब्राउज़र स्टैक के निशान देता है। आप इसे स्क्रिप्ट सहित और किसी भी बिंदु पर कॉल करके उपयोग कर सकते हैं:

var trace = printStackTrace();

मैं github.com/stacktracejs/stacktrace.js को देखूंगा क्योंकि कार्यान्वयन ES6 वादों का समर्थन करने के लिए बदल गया है।
एरेज़ कोहेन

ध्यान दें कि अभी के लिए इसका उपयोग किया जाना चाहिए: github.com/stacktracejs/stacktrace.js/tree/stable?files=1 (नया संस्करण अभी तक जारी नहीं किया गया है)
Erez Cohen

10

यह कॉन्स्टेंटिन के उत्कृष्ट कोड में केवल एक मामूली वृद्धि है। यह फेंकने-पकड़ने के खर्च पर थोड़ा कटौती करता है और त्रुटि स्टैक को तुरंत हटा देता है:

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

मैं आमतौर पर स्टैक ट्रेस का एक विशिष्ट स्तर (मेरे कस्टम लकड़हारा के लिए) चाहता हूं ताकि कॉल करते समय यह भी संभव हो:

getStackTrace()[2]; // get stack trace info 2 levels-deep

6

आपको केवल जरूरत है var stack = new Error().stack। यह @sgouros उत्तर का सरलीकृत संस्करण है।

function foo() {
  bar();
}
function bar() {
  baz();
}
function baz() {
  console.log(new Error().stack);
}

foo();

शायद हर ब्राउज़र (क्रोम में काम करता है) में काम नहीं करेगा।

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