2011-01-12 37 views
61

Firebug có khả năng ghi lại các cuộc gọi đến một tên hàm cụ thể. Tôi đang tìm một lỗi mà đôi khi dừng 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ì vậy, làm thế nào để tôi có được một danh sách của tất cả các cuộc gọi chức năng cho toàn bộ chương trình, hoặc một số loại dấu vết stack để thực hiện toàn bộ chương trình?In nhật ký chức năng/theo dõi ngăn xếp cho toàn bộ chương trình bằng cách sử dụng firebug

Trả lời

149

Firefox providesconsole.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 thử một cái gì đó như thế này:

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

+1 console.trace() – chim

+0

đây là genious :) – iamawebgeek

+0

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

2

Thử lần lượt từng bước một hoặc một hàm để xác định nơi nó dừ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ích các câu lệnh ghi nhật ký thông qua mã của bạn.

+1

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

+0

Chương trình là rất lớn, vì vậy tôi đang tìm kiếm một cách để so sánh các bản ghi chức năng cho khi chương trình chạy chính xác so với khi chương trình không hoạt động. – amccormack

+0

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

10

Khi tôi cần một vết đống tôi làm những điều sau đây, 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')); 
    } 
}; 

Moderator của note: Các mã trong câu trả lời này dường như cũng xuất hiện trong this post from Eric Wenderlin's blog. Tác giả của câu trả lời này tuyên bố nó là mã riêng của mình, mặc dù, được viết trước khi bài đăng trên blog được liên kết tại đâ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 cuộc gọi console.trace() mà bạn có thể thực hiện trong Firebug để thực hiện điều này. – amccormack

+0

Điều này thật tuyệt vời. Firebug có vấn đề với các tệp được rút gọn, tập lệnh này thực hiện điều đó! – pstadler

+0

FWIW @ andrew-barber, tác giả của câu trả lời không bao giờ được tuyên bố là của riêng mình. Chỉ cần không thuộc tính. Chỉnh sửa của bạn phải là nhận xét. – Ascherer

2

tôi thực hiện điều này mà không firebug. Thử nghiệm ở cả chrome và firefox:

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

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

Các vấn đề liên quan