In bản ghi chức năng / dấu vết ngăn xếp cho toàn bộ chương trình bằng cách sử dụng firebug


94

Firebug có khả năng ghi nhật ký các cuộc gọi đến một tên hàm cụ thể. Tôi đang tìm một lỗi đôi khi ngăn một trang hiển thị nhưng không gây ra bất kỳ lỗi hoặc cảnh báo nào. Lỗi chỉ xuất hiện khoảng một nửa thời gian. Vậy làm cách nào để tôi có được danh sách tất cả các lệnh gọi hàm cho toàn bộ chương trình hoặc một số loại dấu vết ngăn xếp để thực thi toàn bộ chương trình?

Câu trả lời:


218

Firefox cung cấp console.trace() rất tiện dụng để in ngăn xếp cuộc gọi. Nó cũng có sẵn trong ChromeIE 11 .

Ngoài ra, hãy thử một cái gì đó như sau:

function print_call_stack() {
  var stack = new Error().stack;
  console.log("PRINTING CALL STACK");
  console.log( stack );
}

2
Có cách nào để tăng chiều dài của ngăn xếp? Điều đó sẽ rất hữu ích.
Ravi Teja

✚1 console.warn ('[WARN] CALL STACK:', new Error (). Stack);
user1742529,

13

Khi tôi cần theo dõi ngăn xếp, tôi làm như sau, có thể bạn có thể rút ra một số cảm hứng từ nó:

function logStackTrace(levels) {
    var callstack = [];
    var isCallstackPopulated = false;
    try {
        i.dont.exist += 0; //doesn't exist- that's the point
    } catch (e) {
        if (e.stack) { //Firefox / chrome
            var lines = e.stack.split('\n');
            for (var i = 0, len = lines.length; i < len; i++) {
                    callstack.push(lines[i]);
            }
            //Remove call to logStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
        else if (window.opera && e.message) { //Opera
            var lines = e.message.split('\n');
            for (var i = 0, len = lines.length; i < len; i++) {
                if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
                    var entry = lines[i];
                    //Append next line also since it has the file info
                    if (lines[i + 1]) {
                        entry += " at " + lines[i + 1];
                        i++;
                    }
                    callstack.push(entry);
                }
            }
            //Remove call to logStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
    }
    if (!isCallstackPopulated) { //IE and Safari
        var currentFunction = arguments.callee.caller;
        while (currentFunction) {
            var fn = currentFunction.toString();
            var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
            callstack.push(fname);
            currentFunction = currentFunction.caller;
        }
    }
    if (levels) {
        console.log(callstack.slice(0, levels).join('\n'));
    }
    else {
        console.log(callstack.join('\n'));
    }
};

Lưu ý của người điều hành : Mã trong câu trả lời này dường như cũng xuất hiện trong bài đăng này từ blog của Eric Wenderlin . Tuy nhiên, tác giả của câu trả lời này tuyên bố nó là mã của riêng mình, được viết trước bài đăng trên blog được liên kết ở đây. Chỉ vì mục đích thiện chí, tôi đã thêm liên kết vào bài đăng và ghi chú này.


2
Có một lệnh gọi console.trace () mà bạn có thể thực hiện trong Firebug để thực hiện điều này.
amccormack

Điều này là tuyệt vời. Firebug gặp sự cố với các tệp được rút gọn, tập lệnh này giải quyết được điều đó!
pstadler

1
FWIW @ andrew-barber, tác giả của câu trả lời chưa bao giờ tự nhận là của mình. Chỉ là không thuộc tính. Chỉnh sửa của bạn nên là một bình luận.
Ascherer

7

Tôi đã hoàn thành điều này mà không cần firebug. Đã thử nghiệm trong cả chrome và firefox:

console.error("I'm debugging this code.");

Sau khi chương trình của bạn in nó ra bảng điều khiển, bạn có thể nhấp vào mũi tên nhỏ vào nó để mở rộng ngăn xếp cuộc gọi.


2

Hãy thử lướt qua mã của bạn một dòng hoặc một chức năng tại một thời điểm để xác định vị trí nó ngừng hoạt động chính xác. Hoặc thực hiện một số phỏng đoán hợp lý và phân tán các báo cáo ghi nhật ký thông qua mã của bạn.


2
Điều này. Chắc chắn thêm một tải trọng của console.log('something')báo cáo đến các chức năng của bạn để xem mà những người (và không) được gọi là
Gareth

1
Chương trình rất lớn, vì vậy tôi đang tìm cách so sánh nhật ký chức năng để biết khi nào chương trình chạy chính xác và khi nào thì không.
amccormack

1
Tôi đồng ý rằng điều này sẽ hữu ích. Tôi đang bước vào để nắm quyền sở hữu một cơ sở mã lớn và thứ gì đó có thể tạo ra một dấu vết đang chạy của tất cả các lệnh gọi hàm chắc chắn sẽ giúp hiểu được luồng / hình dạng của mã và phát hiện mã chết.
Matthew Nichols

1

Thử cái này:

console.trace()

Tôi không biết liệu nó có được hỗ trợ trên tất cả các trình duyệt hay không, vì vậy trước tiên tôi sẽ kiểm tra xem nó có tồn tại hay không.

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.