2011-07-16 18 views
67

console.trace() xuất kết quả của nó trên bảng điều khiển.
Tôi muốn nhận kết quả dưới dạng chuỗi và lưu chúng vào một tệp.

Tôi không xác định tên cho các chức năng và tôi cũng không thể lấy tên của chúng với callee.caller.name.
Làm cách nào để có được kết quả của console.trace() dưới dạng chuỗi trong javascript bằng chrome hoặc firefox?

+1

điều này không hoạt động trong PhantomJS: ( – ekkis

Trả lời

71

Tôi không chắc chắn về firefox, nhưng trong v8/chrome, bạn có thể sử dụng phương thức trên hàm dựng Lỗi có tên là captureStackTrace. (More info here)

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ẽ là trên stack khi nó bị bắt. Đối số thứ hai không bao gồm getStackTrace không được bao gồm trong theo dõi ngăn xếp.

+15

Cảm ơn thông tin của bạn. Điều đó đã làm việc trong chrome nhưng không trong firefox. Vì vậy, tôi đã tìm kiếm lại và tìm thấy 'Error(). Stack'. trong firefox và tên đối tượng bị mất trong chrome (giống như 'Error.captureStackTrace'),' Error(). stack' hoạt động cả hai trình duyệt và nó cung cấp cho tôi đủ thông tin để gỡ lỗi. –

26

Lỗi.stack là những gì 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 trong 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 
+1

Cảm ơn câu trả lời của bạn. Nhưng điều đó chỉ hoạt động khi ngoại lệ xảy ra. Tôi cần phải nhận được dấu vết ngăn xếp mà không có ngoại lệ. –

+7

Điều gì về '(lỗi mới) .stack' – JasonSmith

+0

Điều này sẽ ném một ngoại lệ trên a.debug() - đó là một cách tốn kém để có được ngăn xếp, nhưng nên hoạt động. – fijiaaron

13

Có một thư viện gọi stacktrace.js cung cấp cho bạn qua trình duyệt đống dấu vết. Bạn có thể sử dụng nó chỉ đơn giản bằng cách bao gồm kịch bản và gọi tại bất kỳ điểm:

var trace = printStackTrace(); 
+0

Tôi sẽ xem https://github.com/stacktracejs/stacktrace.js khi triển khai đã thay đổi để hỗ trợ các lời hứa ES6. –

+0

Lưu ý rằng bây giờ điều này nên được sử dụng: https://github.com/stacktracejs/stacktrace.js/tree/stable?files=1 (phiên bản mới chưa được phát hành) –

10

này sẽ cung cấp một stack trace (như mảng của chuỗi) cho hiện đại Chrome, Firefox, Opera và 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); 
} 

Cách sử dụng:

console.log(getStackTrace().join('\n')); 

Nó không bao gồm ngăn xếp cuộc gọi của chính nó cũng như tiêu đề "Lỗi" được Chrome và Firefox sử dụng (nhưng không phải IE).

Nó không nên 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 thêm giải pháp phổ quát, hãy xem stacktrace.js. Danh sách các trình duyệt được hỗ trợ của nó thực sự ấn tượng nhưng đối với tôi, nó rất lớn cho nhiệm vụ nhỏ mà 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.

+0

Đơn giản, và nó chỉ hoạt động. Cảm ơn. –

5

Đây chỉ là một cải tiến nhỏ đối với mã tuyệt vời của Konstantin. Nó cắt một chút về các chi phí của ném bắt và chỉ instantiates Lỗi 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); 
} 

Tôi thường muốn có một mức độ cụ thể của stack trace (ví logger tùy chỉnh của tôi) vì vậy đây cũng có thể khi gọi:

getStackTrace()[2]; // get stack trace info 2 levels-deep 
Các vấn đề liên quan