มากกว่า 10 บรรทัดในข้อผิดพลาดสแต็ก node.js?


97

มีวิธีรับมากกว่า 10 บรรทัดในข้อผิดพลาดสแต็ก node.js หรือไม่?

function a() { dieInHell(); }
function b() { a(); }
function c() { b(); }
function d() { c(); }
function e() { d(); }
function f() { e(); }
function g() { f(); }
function h() { g(); }
function i() { h(); }
function j() { i(); }
function k() { j(); }
function l() { k(); }
function m() { l(); }
function n() { m(); }
function o() { n(); }
function p() { o(); }
function q() { p(); }

try {
    q();
}
catch(e) {
    console.log(e.stack);
}

การแสดง:

$ node debug.js 
ReferenceError: dieInHell is not defined
    at a (/Users/julien/tmp/debug.js:2:5)
    at b (/Users/julien/tmp/debug.js:6:5)
    at c (/Users/julien/tmp/debug.js:10:5)
    at d (/Users/julien/tmp/debug.js:14:5)
    at e (/Users/julien/tmp/debug.js:18:5)
    at f (/Users/julien/tmp/debug.js:22:5)
    at g (/Users/julien/tmp/debug.js:26:5)
    at h (/Users/julien/tmp/debug.js:30:5)
    at i (/Users/julien/tmp/debug.js:34:5)
    at j (/Users/julien/tmp/debug.js:38:5)

มีวิธีรับมากกว่า 10 สายหรือไม่?


การดีบักที่ดีขึ้นเป็นสิ่งสำคัญสำหรับ Node.JS เวอร์ชันอนาคต
BRampersad

ฉันรับความคิดเห็นของคุณว่ายังทำไม่ได้ใช่ไหม
Julien Genestoux

ไม่ แต่การดีบักที่ดีกว่าอยู่ในรายการสำหรับ. 6 :)
BRampersad

คำตอบ:


145

ทางออกที่ง่ายที่สุดคือการเริ่มต้นรหัสของคุณด้วยสิ่งต่อไปนี้:

Error.stackTraceLimit = Infinity;

หากคุณต้องการดูการติดตามสแต็กที่ครอบคลุมมากกว่าการเรียก setTimeout / setInterval https://github.com/mattinsler/longjohn ที่ซับซ้อนยิ่งขึ้นจะเป็นวิธีที่จะไป


2
Error.stackTraceLimit ไม่ได้ทำเพื่อฉันเมื่อฉันพยายามครั้งล่าสุด
BT

โปรดทราบว่าแพคเกจบางคนอาจจะมีการเปลี่ยนแปลง stackTraceLimitนอกจากนี้ยังส่งผลต่อสิ่งที่คุณได้รับError.stackจากสิ่งที่ฉันเห็นเท่านั้น ดีบักเกอร์ในตัวจะแสดงสแต็กเต็มเสมอ ( btคำสั่ง)
x-yuri

และเห็นได้ชัดว่าการติดตามสแต็กไม่เป็นไปตามการดำเนินการแบบ async กล่าวอีกนัยหนึ่งในการเรียกกลับของการโทรแบบอะซิงโครนัสสแต็กของคุณเริ่มต้นจากศูนย์ (โดยทั่วไปจะว่างเปล่า)
x-yuri

ทีมงาน @ x-yuri Node.js กำลังดำเนินการแก้ไข ( github.com/nodejs/node/issues/11865 ) มิฉะนั้นสแต็กเต็มจะปรากฏในโปรแกรมดีบักเกอร์ Chrome เมื่อคุณเรียกใช้ Node Applicaiton ด้วย--inspectหรือ--inpect-brkคำสั่ง
Mariusz Nowak

โอ้สิ่งนี้ทำให้ฉันเป็นบ้า ขอบคุณสำหรับข้อมูลนี้!
Kris Oye

66

คุณสามารถส่งผ่านขีด จำกัด การติดตามสแต็กเป็นพารามิเตอร์บรรทัดคำสั่งไปที่node:

node --stack-trace-limit=1000 debug.js // ค่าเริ่มต้น 10

BTW, อีกสิ่งหนึ่งที่เสียงน่าจะเกิดขึ้น แต่เพียงการสูญเสียไม่กี่ชั่วโมงของเวลาของฉันสำหรับการดีบักเป็นขนาดสแต็ค (ที่เริ่มต้นที่ 492 KB) คุณอาจมีข้อผิดพลาดที่ไม่เป็นข้อมูลหากสแต็กหมด ( RangeErrorโดยไม่มีข้อมูลเพิ่มเติม) คุณสามารถเพิ่มขนาดสแต็กด้วย :

node --stack-size=1024 debug.js // ค่าเริ่มต้น 492

ในโลกของห่วงโซ่การโทรกลับไปยังการโทรกลับเพื่อโทรกลับในความเป็นจริงมันง่ายมากที่จะเกินขนาดสแต็กสำหรับขนาดอินพุตที่ใหญ่หากโปรแกรมไม่ได้เขียนไว้ในใจ

หากต้องการดูตัวเลือกที่เกี่ยวข้องกับสแต็กทั้งหมด:

node --v8-options | grep -B0 -A1 stack


3
--stack-trace-limit ยังคงทำงานอยู่ที่ 0.10.22 ขอบคุณ!
Riplexus

3
ในฐานะของ Node.js V8.0.0 คุณยังสามารถตั้งค่านี้ในตัวแปรสภาพแวดล้อมเช่นNODE_OPTIONS NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-scriptมีประโยชน์หากคุณไม่ได้เรียกใช้nodeโดยตรง
Bluu


-1

นอกจากนี้คุณสามารถใช้ดีบักเกอร์ในตัวซึ่งจะเปิดดีบักเกอร์เครื่องมือพัฒนาของ Google Chrome ที่คุ้นเคย หยุดเมื่อเกิดข้อผิดพลาดใด ๆ และคุณสามารถเรียกดูสแต็กทั้งหมดได้ เพียงแค่เรียกใช้:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.