2011-01-12 10 views
61

Firebugには、特定の関数名への呼び出しを記録する機能があります。私はときどきレンダリングからページを停止するバグを探していますが、エラーや警告は発生しません。バグは約半分にしか現れません。では、プログラム全体のすべての関数呼び出しのリスト、またはプログラム全体の実行のための何らかの種類のスタックトレースを取得するにはどうすればよいですか?firebugを使用するプログラム全体のログ/スタックトレース

答えて

149

Firefox providesconsole.trace()これは、コールスタックを印刷するのに非常に便利です。それはChromeIE 11でも利用可能です。私は放火犯せずにこれを達成

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

+1 console.trace() – chim

+0

これは気楽です:) – iamawebgeek

+0

スタックの長さを増やす方法はありますか?それは非常に役に立ちます。 –

2

一度に1行または1つの機能を実行して、正常に動作しなくなる場所を確認してください。あるいは、合理的な推測を行い、コードを通してロギングステートメントを散らすこともできます。私は次の操作を行い、スタックトレースが必要な場合

+1

これです。間違いなくあなたの関数に 'console.log( 'something')'ステートメントのロードを追加して呼び出されているかどうかを確認してください。 – Gareth

+0

プログラムは膨大なので、関数ログを比較する方法を探していますプログラムが正常に実行されたときと実行されなかったときの両方を示します。 – amccormack

+0

これは役に立ちそうです。私は大きなコードベースの所有権を握るために足を踏み入れており、すべての関数呼び出しの実行トレースを生成できるものは、コードの流れ/形の感覚を得てデッドコードを検出するのに役立ちます。 –

10

は、多分あなたはそれからいくつかのインスピレーションを描くことができます:

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')); 
    } 
}; 

司会者注:この答えのコードも this post from Eric Wenderlin's blogに表示されているようです。この回答の著者は、ここにリンクされたブログ記事の前に書かれた自分のコードとしてそれを主張しています。誠実な目的のために、私はポストとこのノートへのリンクを追加しました。

+2

これを行うFirebugでconsole.trace()を呼び出すことができます。 – amccormack

+0

これは素晴らしいです。 Firebugは、ファイルのサイズを小さくしても問題はありません。このスクリプトはそれを行います。 – pstadler

+0

FWIW @ andrew-barber、彼自身が主張した答えの著者。ちょっと気にしなかった。あなたの編集はコメントでなければなりません。 – Ascherer

2

また、このような何かを試してみてください。 ChromeとFirefoxの両方でテスト:

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

プログラムはコンソールに、あなたはコールスタックを展開することに小さな矢印をクリックすることができることを印刷したら。

関連する問題