8

Internet Explorer 8 の JavaScript で例外が発生した場合、完全なコール スタックを取得する必要があります。関数呼び出しは、数が多いフレーム間で発生する可能性があります。

開発者にログを送信するために必要なコール スタック。エンド ユーザーがこの問題に対処する必要がないため、デバッガを使用できません。

コールスタックを生成できる JavaScript の現在のソリューション ( http://eriwen.com/javascript/js-stack-trace/ )。これは、arguments.callee.caller に基づいています。ただし、関数が現在のフレームの外から呼び出された場合、呼び出し元はゼロ ( undefined ) を返します。したがって、取得されたコールスタックは不完全です。

この場合、関数が呼び出されたフレームの名前を取得できますか?

Active Scripts Technology に基づくソリューションは、タイプ ScriptEngine のオブジェクトを提供します: IHTMLDocument:: get_Script (IDispatch ** p)

しかし、オブジェクト「スクリプト」をインターフェイス IActiveScript にキャストすると失敗します。

*コールスタックを構築するために必要な情報を抽出するために、特定のコンテキスト ScriptEngine に使用されるリンクを IE8 から取得できますか?

4

1 に答える 1

2

役に立つかもしれないいくつかの方法を見つけました。コールバックの考え方を利用しています。

フレームごとに次の単純な関数を定義します。

function getCaller() { return arguments.callee.caller; }

トップフレームのみの次の関数:

function populateStack(fn) {
    var perFrames = [];
    for (var i = 0; i < windows.length; i++) {
        var win = windows[i];
        var func = (win == this) ? fn : win.getCaller();
        var localStack = [];
        while (func) {
            localStack.push(getFuncName(func));
            func = func.caller;
        }
        perFrames.push(getWinName(win) + ": " + localStack.join(", "));
    }
    alert(perFrames.join("\n"));
}

function getWinName(win) {
    var m = win.location.toString().match(/^.*\/(.*)$/);
    return m[1];
}

function getFuncName(func) {
    var m = func.toString().match(/^function\s*(\w*)\(/);
    return m[1] || "anonymous";
}

windows は、すべてのウィンドウ オブジェクト (つまり、フレーム) を含むトップ フレームの配列である必要があります。使用法:

window.top.populateStack.call(window, arguments.callee);

関数が呼び出された正確な順序を復元しようとして数時間を費やしましたが、解決策は見つかりませんでした。そのコードでは、半順序 (関数がフレーム内で正しくソートされる) のみが使用可能です。

コードのバージョンが異なる複数のサーバーがある場合は、コードを追加して、関数本体を分析し、それを通じて呼び出し順序に関する詳細情報を取得できます。

お役に立てれば :-)

于 2011-02-06T10:47:34.950 に答える