Làm thế nào để nhận kết quả của console.trace () dưới dạng chuỗi trong javascript với chrome hoặc firefox?


98

console.trace()xuất kết quả của nó trên bảng điều khiển.
Tôi muốn lấy 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 hàm và tôi cũng không thể lấy tên của chúng callee.caller.name.


1
điều này không làm việc trong PhantomJS :(
ekkis

Câu trả lời:


103

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, getStackTracesẽ ở trên ngăn xếp khi nó được bắt. Đối số thứ hai ở đó loại trừ getStackTraceviệc được đưa vào dấu vết ngăn xếp.


18
Cảm ơn vì thông tin của bạn. Điều đó hoạt động trong chrome nhưng không hoạt động trong firefox. Vì vậy, tôi đã tìm kiếm lại và tìm thấy 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().stackhoạt động trên cả hai trình duyệt và nó cung cấp cho tôi đủ thông tin để gỡ lỗi.
js_

Kết quả chính xác giống như câu trả lời của @Konstantin Smolyanin. Kết quả là cùng một số chi tiết hạn chế.
Codebeat

Đây không phải là câu trả lời được chấp nhận. Ngăn xếp bạn nhận được ở đây được "cắt giảm" chỉ chứa một "phần trên cùng", trong khi console.trace () sẽ hiển thị toàn bộ ngăn xếp. Xem ví dụ về độ sâu ngăn xếp 30 tại đây: stackoverflow.com/questions/62768598/…
mathheadinclouds

34

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

2
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 lấy dấu vết ngăn xếp mà không có ngoại lệ.
js_

8
Thế còn(new Error).stack
JasonSmith

Điều này sẽ tạo ra một ngoại lệ trên a.debug () - đó là một cách đắt tiền để lấy ngăn xếp, nhưng sẽ hiệu quả.
fijiaaron

Cách tiếp cận này cũng hữu ích khi cố gắng lấy dấu vết từ một số mã chỉ có thể chạy trên, ví dụ như PhantomJS hoặc tương tự vì bất kỳ lý do gì.
waxspin

18

Đ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.


12

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();

Tôi sẽ xem github.com/stacktracejs/stacktrace.js khi việc triển khai đã thay đổi để hỗ trợ các hứa hẹn của ES6.
Erez Cohen

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

9

Đâ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

5

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).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.