Câu trả lời:
Tôi không chắc về firefox, nhưng trong v8 / chrome, bạn có thể sử dụng một phương pháp trên hàm tạo Lỗi được gọi captureStackTrace
. ( Thông tin thêm tại đây )
Vì vậy, một cách hacky để có được nó sẽ là:
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
console.log(getStackTrace());
Thông thường, getStackTrace
sẽ ở trên ngăn xếp khi nó được bắt. Đối số thứ hai ở đó loại trừ getStackTrace
việc được đưa vào dấu vết ngăn xếp.
Error().stack
. Mặc dù tên đối tượng và chức năng bị mất trong firefox và tên đối tượng bị mất trong chrome (giống như Error.captureStackTrace
), Error().stack
hoạt động trên cả hai trình duyệt và nó cung cấp cho tôi đủ thông tin để gỡ lỗi.
Error.stack là thứ bạn cần. Nó hoạt động trong Chrome và Firefox. Ví dụ
try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}
sẽ cung cấp cho 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)
và trong 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
Điều này sẽ cung cấp dấu vết ngăn xếp (dưới dạng mảng chuỗi) cho Chrome, Firefox, Opera và IE10 + hiện đại
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);
}
Sử dụng:
console.log(getStackTrace().join('\n'));
Nó loại trừ khỏi ngăn xếp cuộc gọi riêng của nó cũng như tiêu đề "Lỗi" được sử dụng bởi Chrome và Firefox (nhưng không phải IE).
Nó sẽ không gặp sự cố trên các trình duyệt cũ hơn mà chỉ trả về mảng trống. Nếu bạn cần giải pháp phổ quát hơn, hãy xem stacktrace.js . Danh sách các trình duyệt được hỗ trợ của nó thực sự rất ấn tượng nhưng với tâm trí của tôi, nó rất lớn đối với nhiệm vụ nhỏ đó là nó dành cho: 37Kb văn bản được rút gọn bao gồm tất cả các phụ thuộc.
Có một thư viện gọi là stacktrace.js cung cấp cho bạn các dấu vết ngăn xếp trình duyệt chéo. Bạn có thể sử dụng nó đơn giản bằng cách bao gồm tập lệnh và gọi bất kỳ lúc nào:
var trace = printStackTrace();
Đây chỉ là một cải tiến nhỏ đối với mã tuyệt vời của Konstantin. Nó cắt giảm một chút chi phí ném bắt và chỉ khởi tạo ngăn xếp Lỗi:
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);
}
Tôi thường muốn một mức độ theo dõi ngăn xếp cụ thể (cho trình ghi tùy chỉnh của tôi) vì vậy điều này cũng có thể thực hiện được khi gọi:
getStackTrace()[2]; // get stack trace info 2 levels-deep
bạn chỉ cần var stack = new Error().stack
. đây là phiên bản đơn giản hóa của câu trả lời @sgouros.
function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}
foo();
Có thể sẽ không hoạt động trên mọi trình duyệt (hoạt động trong Chrome).