firebugを使用してプログラム全体の関数ログ/スタックトレースを出力する


94

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

回答:


218

Firefoxは console.trace() 、コールスタックを出力するのに非常に便利な機能を提供します。ChromeIE 11でも利用できます。

または、次のようなものを試してください:

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

2
スタックの長さを増やす方法はありますか?それはとても役に立ちます。
Ravi Teja 2017

console1 console.warn( '[WARN] CALL STACK:'、new Error()。stack);
user1742529 2018

13

スタックトレースが必要なときは、次のようにします。おそらく、そこからインスピレーションを得ることができます。

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

モデレーターのメモ:この回答のコードは、Eric Wenderlinのブログのこの投稿にも記載されているようです。この回答の作成者は、ここにリンクされているブログ投稿の前に作成された独自のコードであると主張しています。誠意を込めて、投稿へのリンクとこのメモを追加しました。


2
Firebugでこれを実行できるconsole.trace()呼び出しがあります。
amccormack 2011年

これは素晴らしいです。Firebugは縮小ファイルに問題があります。このスクリプトはそれを実行します!
pstadler 2013年

1
FWIW @ andrew-barber、回答の作者は自分の主張を主張していません。ただ属性していませんでした。あなたの編集はコメントであるべきです。
Ascherer 2015

7

私はこれをファイアバグなしで達成しました。chromeとfirefoxの両方でテスト済み:

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

プログラムがそれをコンソールに出力したら、小さな矢印をクリックして、呼び出しスタックを展開できます。


2

一度に1行または1つの関数をステップ実行して、正しく機能しなくなった箇所を特定します。または、適切な推測を行い、ログステートメントをコードに分散させます。


2
この。console.log('something')関数にステートメントのロードを確実に追加して、呼び出されている(呼び出されていない)ステートメントを確認してください
Gareth

1
プログラムは巨大なので、プログラムが正しく実行された場合と実行されなかった場合の関数ログを比較する方法を探しています。
amccormack 2011年

1
これは便利だと思います。大きなコードベースの所有権を取得するために介入しています。すべての関数呼び出しの実行トレースを生成できるものは、コードのフロー/形状を理解し、デッドコードを検出するのに役立ちます。
マシューニコルズ

1

これを試して:

console.trace()

すべてのブラウザでサポートされているかどうかはわかりません。最初に存在するかどうかを確認します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.