console.trace()
แสดงผลลัพธ์บนคอนโซล
ฉันต้องการได้ผลลัพธ์เป็นสตริงและบันทึกลงในไฟล์ ฉันไม่ได้กำหนดชื่อฟังก์ชั่นและฉันยังไม่สามารถได้รับชื่อของพวกเขาด้วย
callee.caller.name
console.trace()
แสดงผลลัพธ์บนคอนโซล
ฉันต้องการได้ผลลัพธ์เป็นสตริงและบันทึกลงในไฟล์ ฉันไม่ได้กำหนดชื่อฟังก์ชั่นและฉันยังไม่สามารถได้รับชื่อของพวกเขาด้วย
callee.caller.name
คำตอบ:
ผมไม่แน่ใจว่าเกี่ยวกับ Firefox แต่ใน v8 / captureStackTrace
โครเมี่ยมคุณสามารถใช้วิธีในตัวสร้างข้อผิดพลาดที่เรียกว่า ( ข้อมูลเพิ่มเติมที่นี่ )
ดังนั้นวิธีที่แฮ็กจะได้รับคือ:
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
console.log(getStackTrace());
โดยปกติgetStackTrace
จะอยู่ในสแต็กเมื่อถูกจับภาพ อาร์กิวเมนต์ที่สองไม่รวมgetStackTrace
จากการรวมอยู่ในการติดตามสแต็ก
Error().stack
ดังนั้นฉันค้นหาอีกครั้งและพบว่า แม้ว่าชื่ออ็อบเจ็กต์และฟังก์ชันจะหายไปใน firefox และชื่ออ็อบเจ็กต์จะหายไปใน chrome (เช่นเดียวกับError.captureStackTrace
) ใช้Error().stack
งานได้ทั้งเบราว์เซอร์และให้ข้อมูลเพียงพอในการดีบัก
Error.stack คือสิ่งที่คุณต้องการ ใช้งานได้ใน Chrome และ Firefox ตัวอย่างเช่น
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)
และใน Firefox:
@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
(new Error).stack
สิ่งนี้จะให้การติดตามสแต็ก (เป็นอาร์เรย์ของสตริง) สำหรับ Chrome, Firefox, Opera และ 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'));
โดยไม่รวมการเรียกของตัวเองรวมทั้งชื่อ "ข้อผิดพลาด" ที่ Chrome และ Firefox ใช้ (แต่ไม่ใช่ IE)
ไม่ควรขัดข้องกับเบราว์เซอร์รุ่นเก่า แต่เพียงส่งคืนอาร์เรย์ว่าง หากคุณต้องการดูการแก้ปัญหาสากลมากขึ้นในstacktrace.js รายการเบราว์เซอร์ที่รองรับนั้นน่าประทับใจมาก แต่ในความคิดของฉันมันใหญ่มากสำหรับงานเล็ก ๆ ที่มีไว้สำหรับ: ข้อความย่อขนาด 37Kb รวมถึงการอ้างอิงทั้งหมด
มีไลบรารีที่เรียกว่าstacktrace.jsที่ให้คุณข้ามสแต็กเทรซของเบราว์เซอร์ คุณสามารถใช้งานได้ง่ายๆโดยรวมสคริปต์และโทรเมื่อใดก็ได้:
var trace = printStackTrace();
นี่เป็นเพียงการปรับปรุงเล็กน้อยสำหรับรหัสที่ยอดเยี่ยมของ Konstantin มันลดค่าใช้จ่ายเล็กน้อยในการจับโยนและเพียงแค่อินสแตนซ์ Error stack:
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
var stack = new Error().stack
คุณต้องการเพียง นี่คือคำตอบ @sgouros เวอร์ชันที่เรียบง่าย
function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}
foo();
อาจจะไม่ทำงานในทุกเบราว์เซอร์ (ทำงานใน Chrome)
ฉันพยายามรับ Stack Trace เป็นตัวแปรสตริงใน JavaScript บน NodeJS และบทช่วยสอนนี้ช่วยฉันได้ console.trace()
นี้จะทำงานในสถานการณ์ของคุณเช่นกันยกเว้นสแต็คร่องรอยถูกพิมพ์ผ่านทางวัตถุข้อผิดพลาดมากกว่า
รหัสเพื่อพิมพ์การติดตามสแต็ก:
function add(x, y) {
console.log(new Error().stack);
return x+y;
}