当 Internet Explorer 8 上的 JavaScript 发生异常时,我需要获取完整的调用堆栈。函数调用可能发生在数量较大的帧之间。
将日志发送给开发人员所需的调用堆栈。
我无法使用调试器,因为最终用户不必处理这个问题。
当前的 JavaScript 解决方案提供了它可以生成调用堆栈(http://eriwen.com/javascript/js-stack-trace/)。它基于arguments.callee.caller。但如果该函数是从当前帧外部调用的,则调用者返回零(未定义)。因此获得的callstack是不完整的。
在这种情况下,我可以获得调用该函数的框架的名称吗?
基于活动脚本技术的解决方案给出了 ScriptEngine 类型的对象:
IHTMLDocument::get_Script(IDispatch ** p)
但是将对象“script”转换到接口 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);
我花了几个小时试图恢复调用函数的确切顺序,但没有找到解决方案。该代码中仅提供部分顺序(函数在框架内正确排序)。
如果您有多个具有不同版本代码的服务器,那么您可以添加一段代码,该代码将分析函数体并通过该代码获取有关调用顺序的更多信息。
希望这可以帮助 :-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)