Google Chrome 开发者工具中的自定义堆栈跟踪?

2024-03-24

我希望自定义 Google Chrome 开发人员工具“脚本”选项卡中 strack 跟踪面板中显示的项目。具体来说,我想过滤掉堆栈跟踪中的项目,并向堆栈跟踪中的某些项目添加更多描述性名称,而不必重命名我的对象和函数。

我在以下位置找到了 V8 的 Stack Trace API:http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi但重写 Error.prepareStackTrace 似乎没有任何效果。


该页面上的描述肯定有点难以理解,具体方法如下:

Error.prepareStackTrace = function(error, stack) {
    return stack;
};

var someObj = {
    someMethod : function () { 
        crash();
    }
}
function bar(barArg) { someObj.someMethod(); };
function foo(fooArg) { bar("barArgString"); };

function getTrace(e) {
    var stack = e.stack;
    var trace = "";

    for (var i = 0; i < stack.length; i++) {
        var frame = stack[i],
            func = frame.getFunction();

        trace += "\r" + frame.getThis() + "." + frame.getFunctionName();
    }
    return trace;
}

try {
    foo("fooArgString");
} catch (e) {
    alert("trace from catch(): " + getTrace(e));
}

这将显示:

trace from catch(): 
[object Object].someObj.someMethod
[object Window].bar
[object Window].foo
[object Window].

最后一帧是全局范围(没有函数名称)。

本质上,您对prepareStackTrace()的重写会导致error.stack成为您从prepareStackTrace()返回的任何内容。诀窍是,prepareStackTrace() 的第二个参数是 CallSite 对象的数组 - 支持 getThis()、getFunctionName() 等的对象。

上面的代码覆盖了prepareStackTrace(),以便它返回CallSite对象的数组(上面的“stack”参数),所以这意味着当你尝试..catch一个错误时,Error.stack将包含CallSite对象的数组而不是字符串形式的通常堆栈跟踪。另一种方法是在替换的prepareStackTrace() 函数中处理CallSite 对象,并将替代堆栈跟踪作为字符串返回。

请注意,CallSite 对象确实非常挑剔。尝试执行frame.toString(),或者只是尝试alert(frame)(隐式地涉及toString()),它会崩溃,并且Chrome的开发人员工具不会显示任何错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Chrome 开发者工具中的自定义堆栈跟踪? 的相关文章