Node.js এ স্ট্যাক ট্রেস কীভাবে প্রিন্ট করবেন?


উত্তর:


615

যে কোনও Errorঅবজেক্টের এমন stackসদস্য রয়েছে যা সেটিকে নির্ধারণ করা হয়েছিল এমন জায়গায় আটকে দেয়।

var stack = new Error().stack
console.log( stack )

বা আরও সহজভাবে:

console.trace("Here I am!")

1
বা ঠিক sys.puts(new Error().stack)(সিস্টেম মডিউল যুক্ত করার পরে)
sirhc

5
এখন হিসাবে, sys চিত্রিত হয়। এটি দ্বারা প্রতিস্থাপিত হয় 'util'
পিন্ডতজাহ

12
এছাড়াও দেখানোর জন্য +1 new Error().stack, আপনি কনসোলকে জড়িত করতে চান না এমন ক্ষেত্রে কাজ করে।
ইউজিন বেরেসভস্কি

1
এর একটি সুবিধা traceহ'ল এটি বর্তমান লাইন / প্রসঙ্গটিও দেখায় যা stackহয় না। আমি যদি অনুমান করি যে আপনি নিজেই সেই লাইনটি তৈরি করতে চান তবে তথ্যটি ত্রুটিযুক্ত বস্তুতে রয়েছে।
স্টুডিজেক

130
কনসোল.লগ (err.stack) এবং কনসোল.ট্রেস () আপনাকে একই ফলাফল দেয় না। যেখানে err.stack আপনাকে নিজেই ত্রুটিযুক্ত বস্তুর জন্য স্ট্যাক ট্রেস দেয় (আমরা সকলেই সাধারণত ব্যতিক্রমগুলি যেভাবে চিন্তা করি সেভাবে কাজ করে), কনসোল.ট্রেস () কনসোল.ট্রেস () বলা হচ্ছে এমন স্থানে কল স্ট্যাকটি মুদ্রণ করবে। সুতরাং যদি আপনি কোডের কিছু গভীর স্তর দ্বারা কিছু ত্রুটি ছুঁড়ে মারেন তবে কনসোল.ট্রেস () স্ট্যাক ট্রেসে সেই গভীর স্তর কোডটি ধারণ করবে না কারণ সেই কোডটি এখন আর স্ট্যাকের মধ্যে নেই is যাইহোক, কনসোল.লগ (err.stack) ততক্ষণ গভীর স্তরগুলিকে ধারণ করবে যতক্ষণ না এটি ত্রুটিযুক্ত বস্তু ছুঁড়ে দেয়।
d512

200

11
উপরের মন্তব্যটি সম্পর্কে নিশ্চিত হওয়া নিশ্চিত করুনconsole.trace()
কিউস - মণিকা

5
ডিফল্টরূপে এটি কেবলমাত্র 10 টি ফ্রেম দেখায়, আপনি এটি বাড়ানোর জন্য কমান্ড-লাইন আর্গুমেন্টটি ব্যবহার করতে পারেন, যেমন--stack_trace_limit=200
মাইকেল

আপনি যদি একটি লগ ফাইল আউটপুট করতে চান?
ইয়া

এটি প্রতিশ্রুতি এবং async / প্রতীক্ষার সাথে কাজ করে বলে মনে হচ্ছে না, তা কি?
bluenote10

96

ইতিমধ্যে উত্তর হিসাবে, আপনি কেবল ট্রেস কমান্ডটি ব্যবহার করতে পারেন :

console.trace("I am here");

তবে, আপনি যদি কোনও ব্যতিক্রমের স্ট্যাক ট্রেস লগ ইন করবেন সে সম্পর্কে অনুসন্ধান করতে এই প্রশ্নটিতে এসে পৌঁছেছেন, তবে আপনি কেবল ব্যতিক্রম অবজেক্টটিতে লগইন করতে পারেন।

try {  
  // if something unexpected
  throw new Error("Something unexpected has occurred.");     

} catch (e) {
  console.error(e);
}

এটি লগ হবে:

ত্রুটি: অপ্রত্যাশিত কিছু ঘটেছে।
    প্রধানত (সি: \ ব্যবহারকারীগণ \ আমার \ নথিগুলি \ মাই অ্যাপ \ অ্যাপ্লিকেশন: 9: 15)
    অবজেক্টে। (সি: \ ব্যবহারকারীগণ \ আমার \ নথিগুলি \ মাই অ্যাপ \ অ্যাপ্লিকেশন: 17: 1)
    মডিউল._কম্পাইল (মডিউল.জেএস: 460: 26)
    অবজেক্ট.মোডুল._ এক্সটেনশন..জেজে (মডিউল.জেএস: 478: 10) )
    মডিউল.এলডে (মডিউল.জেএস: 355: 32)
    ফাংশন.মডিউল.এলডে (মডিউল.জেএস: 310: 12)
    ফাংশন.মোডুল.আরুনমাইন (মডিউল.জেএস: 501: 10)
    এ স্টার্টআপে ( নোড.জেএস) : 129: 16)
    নোড.জেএস: 814: 3 এ


যদি আপনার নোড.জেএস সংস্করণটি 6.০.০ এর চেয়ে বেশি হয় তবে ব্যতিক্রমী অবজেক্টে লগইন করা যথেষ্ট হবে না। এই ক্ষেত্রে, এটি কেবল মুদ্রণ করবে:

[ত্রুটি: অপ্রত্যাশিত কিছু ঘটেছে]

নোড সংস্করণ <6 console.error(e.stack)এর console.error(e)জন্য, বর্তমান নোড সংস্করণটির মতো ত্রুটি বার্তা এবং সম্পূর্ণ স্ট্যাক প্রিন্ট করার পরিবর্তে ব্যবহার করুন ।


দ্রষ্টব্য: যদি ব্যতিক্রমটি স্ট্রিংয়ের মতো তৈরি করা হয় throw "myException"তবে স্ট্যাকের ট্রেস এবং লগিং e.stackফলন অপরিশোধিত পুনরুদ্ধার করা সম্ভব নয় ।

নিরাপদ থাকতে, আপনি ব্যবহার করতে পারেন

console.error(e.stack || e);

এবং এটি পুরানো এবং নতুন নোড.জেএস সংস্করণগুলির জন্য কাজ করবে।


না console.error(e)প্রিন্ট সবকিছু মধ্যে eঅবজেক্ট সহ e.stack?
drmrbrewer

1
@ ডিআরএমব্রুভেয়ার, এটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ। দেখে মনে হচ্ছে নোড সংস্করণ 4.x এবং 7.x (সম্ভবত কোনও ভি 8 পরিবর্তন) এর মধ্যে আচরণ পরিবর্তন হয়েছে। আমি আমার উত্তর আপডেট করেছি।
জ্যানন

1
@drmrbrewer নিশ্চিত করেছে যে এই আচরণটি 6.0.0 সংস্করণে পরিবর্তিত হয়েছে
জ্যানন

2
দুঃখিত, আমি সবেমাত্র গুরুত্বপূর্ণ কিছু আবিষ্কার করেছি। সম্পর্কিত পোস্টের বিরুদ্ধে আমার মন্তব্য দেখুন: stackoverflow.com/questions/42528677/… । দেখে মনে হচ্ছে ত্রুটিটি নিজেরাই লগ করা প্রকৃতপক্ষে ত্রুটির সম্পূর্ণ বিষয়বস্তু প্রদর্শন করে তবে এটি অন্য পাঠ্যের সাহায্যে (স্ট্রিংয়ের মতো) যুক্ত করে দেওয়ার চেষ্টা করলে কেবলমাত্র সংক্ষিপ্ত বার্তার অংশটি ব্যবহার করা হবে। এটি সমস্ত উপলব্ধি দিয়ে আরও অনেক কিছু বোঝায়।
ড্রামরব্রোয়েয়ার

1
আপনি আমার দিন বাঁচান)
অ্যালেক্স

39

Errorআরও পঠনযোগ্য উপায়ে কনসোলে স্ট্যাকট্রেস প্রিন্ট করতে :

console.log(ex, ex.stack.split("\n"));

উদাহরণ ফলাফল:

[Error] [ 'Error',
  '    at repl:1:7',
  '    at REPLServer.self.eval (repl.js:110:21)',
  '    at Interface.<anonymous> (repl.js:239:12)',
  '    at Interface.EventEmitter.emit (events.js:95:17)',
  '    at Interface._onLine (readline.js:202:10)',
  '    at Interface._line (readline.js:531:8)',
  '    at Interface._ttyWrite (readline.js:760:14)',
  '    at ReadStream.onkeypress (readline.js:99:10)',
  '    at ReadStream.EventEmitter.emit (events.js:98:17)',
  '    at emitKey (readline.js:1095:12)' ]

9

সহজেই উপলব্ধ নোড মডিউলটির সাহায্যে নোডের বাইরে পূর্ণ দৈর্ঘ্যের স্ট্যাকের চিহ্ন পাওয়া সম্ভব (সামান্য পারফরম্যান্স পেনাল্টি হলেও): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack -traces-জন্য-নোড-JS


4
লিঙ্কটি মারা গেছে তবে কেউ এখানে সংরক্ষণাগারভুক্ত কপিটি ব্যবহার করতে পারে বা লাইব্রেরিটি পরীক্ষা করতে পারে ।
কোডব্লিং

5

ব্যবহার করে দেখুন Error.captureStackTrace (targetObject [constructorOpt])

const myObj = {};
function c() {
  // pass
}

function b() {
    Error.captureStackTrace(myObj)
    c()
} 

function a() {
    b()
}

a()

console.log(myObj.stack)

ফাংশন aএবং bত্রুটি স্ট্যাক এবং ক্যাপচার করা হয় myObj


2
আপনি যদি কোনও stackসম্পত্তি পেতে একটি ত্রুটি চান , আপনাকে নোড> = 6: এ কল করতে হবে Error.captureStackTrace(error)
সিজেবার্থ

মনে রাখবেন যে আপনি যদি ফ্রেমটিকে Error.captureStackTraceস্ট্যাক ট্রেসটিতে প্রদর্শিত না করতে চান তবে আপনি এটি constructorOptআরগ হিসাবে পাস করে বাদ দিতে পারেন ।
উল্লৌরি

3

আমি জানি যে নোডেজগুলিতে সম্পূর্ণ স্ট্যাক ট্রেস মুদ্রণ করা সম্ভব নয়, আপনি কেবল "আংশিক" স্ট্যাক ট্রেস মুদ্রণ করতে পারেন, আপনি কোডটি কোথা থেকে এসেছেন তা দেখতে পাচ্ছেন না, কেবল যেখানে ব্যতিক্রম ঘটে। রায়ান ডাহল এই ইউটিউব ভিডিওতে এটি ব্যাখ্যা করেছেন। সুনির্দিষ্ট হওয়ার জন্য 56 মিনিটে http://youtu.be/jo_B4LTHi3I । আশাকরি এটা সাহায্য করবে


2
সত্য, তবে @ টিম্বড্রেউর উত্তর "সংশোধন" এর মডিউলটি
বোগদান ডি

3

@ আইস্যাকের উত্তরটি সঠিক, তবে আপনার যদি আরও নির্দিষ্ট বা ক্লিনার ত্রুটির স্ট্যাকের প্রয়োজন হয় তবে আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

function getCleanerStack() {
   var err = new Error();
   Error.captureStackTrace(err, getStack);

   return err.stack;
}

এই ফাংশনটি সরাসরি নোডজেএস-console.traceফাংশন থেকে অনুপ্রাণিত হয় ।

উত্স কোড: সাম্প্রতিক সংস্করণ বা পুরানো সংস্করণ


1
এটি কাজ করে না, কেবল বর্তমান লাইন থেকে স্ট্যাক দেখান (এই ত্রুটিটি ঘটেছে এমন লাইন নয়)। err.stackআরও সঠিক উত্তর।
ইয়ান ঝং

2

আপনি যদি কেবল ত্রুটির স্ট্যাক ট্রেস লগ করতে চান (এবং ত্রুটি বার্তা নয়) নোড 6 এবং তারপরে স্বয়ংক্রিয়ভাবে স্ট্যাক ট্রেসের ভিতরে ত্রুটির নাম এবং বার্তা অন্তর্ভুক্ত রয়েছে, যা আপনি কিছু কাস্টম ত্রুটি পরিচালনা করতে চাইলে কিছুটা বিরক্তিকর:

console.log(error.stack.replace(error.message, ''))

এই কর্মচক্রটি কেবল ত্রুটির নাম এবং স্ট্যাক ট্রেস লগইন করবে (যাতে আপনি উদাহরণস্বরূপ ত্রুটি বার্তাটি ফর্ম্যাট করতে পারেন এবং আপনার কোডের অন্য কোথাও কীভাবে চান তা প্রদর্শন করতে পারেন)।

উপরের উদাহরণটি কেবল স্ট্যাক ট্রেস অনুসরণ করে ত্রুটির নাম মুদ্রণ করবে, উদাহরণস্বরূপ:

Error: 
    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)

পরিবর্তে:

Error: Error: Command failed: sh ./commands/getBranchCommitCount.sh HEAD
git: 'rev-lists' is not a git command. See 'git --help'.

Did you mean this?
        rev-list

    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)

1

যদি কেউ এখনও আমার মতো এটির সন্ধান করে তবে সেখানে একটি মডিউল রয়েছে যা আমরা "স্ট্যাক-ট্রেস" নামে অভিহিত করতে পারি। এটি সত্যিই জনপ্রিয়। এনপিএম লিংক

তারপরে ট্রেস দিয়ে হাঁটুন।

  var stackTrace = require('stack-trace');
  .
  .
  .
  var trace = stackTrace.get();
  trace.map(function (item){ 
    console.log(new Date().toUTCString() + ' : ' +  item.toString() );  
  });

অথবা কেবলমাত্র ট্রেস মুদ্রণ করুন:

var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.