ক্রোম বা ফায়ারফক্সের সাথে জাভাস্ক্রিপ্টে স্ট্রিং হিসাবে কনসোল.ট্রেস () এর ফলাফল কীভাবে পাবেন?


100

console.trace()কনসোল এ তার ফলাফল আউটপুট।
আমি ফলাফলগুলি স্ট্রিং হিসাবে পেতে এবং সেগুলিকে একটি ফাইলে সংরক্ষণ করতে চাই।

আমি ফাংশনগুলির জন্য নামগুলি সংজ্ঞায়িত করি না এবং আমি তাদের নামগুলিও পেতে পারি না callee.caller.name


4
এটি ফ্যান্টমজেএস-এ কাজ করে না :(
একিস

উত্তর:


104

আমি ফায়ারফক্স সম্পর্কে নিশ্চিত নই, তবে ভি 8 / ক্রোমে আপনি ত্রুটি নির্মাণকারীকে কল করা একটি পদ্ধতি ব্যবহার করতে পারেন 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_

@ কনস্টান্টিন স্মোলিয়ানিনের উত্তর হিসাবে একই ফলাফলটি ঠিক করুন। ফলস্বরূপ একই সীমিত বিবরণ।
কোডবিট

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। আপনি যে স্ট্যাকটি এখানে পাবেন সেটি কেবল "শীর্ষ অংশ" সমেত "কাটা ডাউন", যখন কনসোল.ট্রেস () সম্পূর্ণ স্ট্যাকটি দেখায়। : স্ট্যাক গভীরতা 30 এখানে একটি উদাহরণ দেখুন stackoverflow.com/questions/62768598/...
mathheadinclouds

35

ত্রুটি.স্ট্যাক আপনার যা প্রয়োজন। এটি ক্রোম এবং ফায়ারফক্সে কাজ করে। উদাহরণ স্বরূপ

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

ক্রোমে দেবে:

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

4
আপনার উত্তরের জন্য ধন্যবাদ. তবে ব্যতিক্রম ঘটলেই তা কাজ করে। আমার ব্যতিক্রম ছাড়াই স্ট্যাক ট্রেস পাওয়া দরকার।
js_

10
কী সম্পর্কে(new Error).stack
জেসনস্মিথ

এটি a.debug () এ একটি ব্যতিক্রম ছুঁড়ে ফেলা উচিত - এটি স্ট্যাক পাওয়ার জন্য একটি ব্যয়বহুল উপায়, তবে কাজ করা উচিত।
ফিজিয়ারাওন

কেবলমাত্র চলতে পারে এমন কোনও কোড থেকে কোনও ট্রেস নেওয়ার চেষ্টা করার সময় এই পদ্ধতির ব্যবহারও কার্যকর হয়, উদাহরণস্বরূপ ফ্যান্টমজেএস বা যে কোনও কারণেই এর মতো।
ওয়াক্সস্পিন

20

এটি আধুনিক ক্রোম, ফায়ারফক্স, অপেরা এবং আই 10 + এর জন্য স্ট্যাক ট্রেস (স্ট্রিংগুলির অ্যারে হিসাবে) দেবে

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'));

এটি স্ট্যাক থেকে নিজস্ব কলের পাশাপাশি শিরোনাম "ত্রুটি" বাদ দেয় যা ক্রোম এবং ফায়ারফক্স (তবে আইআই নয়) ব্যবহার করে।

এটি পুরানো ব্রাউজারগুলিতে ক্রাশ হওয়া উচিত নয় তবে খালি অ্যারেটি ফিরতে হবে। আপনার যদি আরও সার্বজনীন সমাধানের প্রয়োজন হয় তবে stacktrace.js এ দেখুন । সমর্থিত ব্রাউজারগুলির এর তালিকাটি সত্যই চিত্তাকর্ষক তবে আমার মনে মনে এটি ছোট কাজটির জন্য এটি খুব বড়: 37Kb সমস্ত নির্ভরতা সহ মিনিফাইড পাঠ্য।


12

Stacktrace.js নামে একটি লাইব্রেরি রয়েছে যা আপনাকে ব্রাউজারের স্ট্যাকের চিহ্নগুলি দেয়। আপনি সহজেই স্ক্রিপ্টটি অন্তর্ভুক্ত করে এবং যেকোন সময় কল করে এটি ব্যবহার করতে পারেন:

var trace = printStackTrace();

আমি github.com/stacktracejs/stacktrace.js দেখতে যাব কারণ ES6 প্রতিশ্রুতি সমর্থন করার জন্য বাস্তবায়ন পরিবর্তিত হয়েছে।
এরেজ কোহেন

মনে রাখবেন যে আপাতত এটি ব্যবহার করা উচিত: github.com/stacktracejs/stacktrace.js/tree/stable?files=1 (নতুন সংস্করণটি এখনও প্রকাশিত হয়নি)
এরেজ কোহেন

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। এটি @ এসগোউরস উত্তরের সরলিকৃত সংস্করণ।

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

foo();

সম্ভবত প্রতিটি ব্রাউজারে (ক্রোমে কাজ করে) কাজ করবে না।


0

আমি নোডজেএস-তে জাভাস্ক্রিপ্টের স্ট্রিং ভেরিয়েবল হিসাবে স্ট্যাক ট্রেস পাওয়ার চেষ্টা করছিলাম এবং এই টিউটোরিয়ালটি আমাকে সহায়তা করেছিল। এটি আপনার দৃশ্যে কাজ করবে পাশাপাশি স্ট্যাক ট্রেস এর চেয়ে ত্রুটি অবজেক্টের মাধ্যমে মুদ্রণ করা হবে console.trace()

স্ট্যাক ট্রেস মুদ্রণের জন্য কোড:

function add(x, y) {
    console.log(new Error().stack);
    return x+y;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.