IE8上多帧JS的完全调用

Ros*_*avS 8 javascript internet-explorer exception-handling javascript-engine

当Internet Explorer 8上的JavaScript发生异常时,我需要获得完整的调用堆栈.函数调用可能发生在数量很大的帧之间.

调用堆栈以将日志发送给开发人员.我不能使用调试器,因为最终用户不必处理这个问题.

JavaScripts的当前解决方案提供了它可以生成callstack(http://eriwen.com/javascript/js-stack-trace/).它基于arguments.callee.caller.但是如果从当前帧外部调用函数,则调用者返回零(未定义).因此获得的callstack是不完整的.

在这种情况下,我可以获取从中调用函数的框架的名称吗?

基于活动脚本技术的解决方案提供了ScriptEngine类型的对象:IHTMLDocument :: get_Script(IDispatch**p)

但是将对象"script"转换为IActiveScript接口失败.

*我可以从IE8中获取用于给定上下文ScriptEngine的链接,以提取构建callstack所需的信息吗?

kir*_*oid 2

我找到了一些方法,可能有用。它利用了回调的思想。

在每一帧定义下一个简单函数:

function getCaller() { return arguments.callee.caller; }
Run Code Online (Sandbox Code Playgroud)

下一个函数仅适用于顶框:

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";
}
Run Code Online (Sandbox Code Playgroud)

windows 应该是包含所有窗口对象(即框架)的顶部框架的数组。用法:

window.top.populateStack.call(window, arguments.callee);
Run Code Online (Sandbox Code Playgroud)

我花了几个小时试图恢复调用函数的确切顺序,但没有找到解决方案。该代码中仅提供部分顺序(函数在框架内正确排序)。

如果您有多个具有不同版本代码的服务器,那么您可以添加一个代码,该代码将分析函数体并通过该代码获取有关调用顺序的更多信息。

希望这可以帮助 :-)