javascript - IE8 上多帧 JS 的完整调用堆栈

标签 javascript internet-explorer exception-handling javascript-engine

我需要在 Internet Explorer 8 上的 JavaScript 发生异常时获取完整的调用堆栈。函数调用可能发生在帧数较大的帧之间。

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

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

在这种情况下,我能否获得调用该函数的框架的名称?

基于Active Scripts Technology的解决方案给出了一个ScriptEngine类型的对象: IHTMLDocument::get_Script (IDispatch ** p)

但是将对象“脚本”转换为接口(interface) IActiveScript 失败。

*我能否从 IE8 中获取用于给定上下文 ScriptEngine 的链接,以提取必要的信息来构建调用堆栈?

最佳答案

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

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

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

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

如果你有多个不同版本代码的服务器,那么你可以添加一段代码,它会分析函数体,并通过它获得更多关于调用顺序的信息。

希望,这会有所帮助:-)

关于javascript - IE8 上多帧 JS 的完整调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4545699/

相关文章:

scala - 如何将引发异常的函数转换为返回Either的函数?

javascript - 切换不适用于显示适用的同一元素

javascript - 无法暂停 React 音频

css - 右键单击更改 anchor 链接颜色

css - Drupal Colorbox 模块和 IE

PHP - 将一个额外的参数(变量)传递给 set_exception_handler

javascript - 使用 Javascript 或 jQuery 清理所见即所得编辑器的 HTML 输出

javascript - 将 html Canvas 对齐到网页的绝对顶部

html - 强制 IE10 中的 HTML 页面使用 IE Quirks 模式

php自定义异常