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

Javascript 谷歌Chrome开发者工具中的自定义堆栈跟踪?,javascript,google-chrome,v8,chromium,Javascript,Google Chrome,V8,Chromium,我希望自定义Google Chrome开发者工具的脚本选项卡中strack trace面板中显示的项目。具体来说,我想过滤掉堆栈跟踪中的项目,并向堆栈跟踪中的一些项目添加更多描述性名称,而不必重命名我的对象和函数 我在发现V8的堆栈跟踪API时出错,但覆盖错误。prepareStackTrace似乎没有任何效果。以下是为我解决问题的代码: <head> <script> Error.prepareStackTrace = function() { retu

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


我在发现V8的堆栈跟踪API时出错,但覆盖错误。prepareStackTrace似乎没有任何效果。

以下是为我解决问题的代码:

<head>
<script>
Error.prepareStackTrace = function()
{
        return "MyStackObject";
}
try {
  throw new Error();
} catch (e) {
  console.log(e.stack);
}
</script>
</head>

Error.prepareStackTrace=函数()
{
返回“MyStackObject”;
}
试一试{
抛出新错误();
}捕获(e){
console.log(e.stack);
}

该页面上的描述显然有点难以理解,下面是如何完成的:

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));
}
最后一帧是全局范围(没有函数名)

实际上,您对prepareStackTrace()的重写会导致error.stack变为从prepareStackTrace()返回的内容。诀窍在于prepareStackTrace()的第二个参数是一个CallSite对象数组——支持getThis()、getFunctionName()等的对象

上面的代码重写了prepareStackTrace(),因此它返回CallSite对象数组(“上面的stack”参数),因此这意味着当您尝试捕获错误时,Error.stack将包含CallSite对象数组,而不是通常的字符串形式的堆栈跟踪。另一种方法是在替换的prepareStackTrace()函数中处理CallSite对象,并以字符串形式返回可选堆栈跟踪


注意CallSite对象非常挑剔。尝试执行frame.toString(),或只是尝试发出警报(frame)(隐式地涉及到toString()),它会崩溃,Chrome的开发工具不会显示错误。

文档已移至此处:

只需将其放在javascript代码的开头,它将格式化一个很好的堆栈跟踪:

Error.prepareStackTrace=函数(错误,堆栈){
var trace='';
var max_width=0;
对于(var i=0;i50?50:typeLength;
functionlength=frame.getFunctionName()!==null?frame.getFunctionName()。长度:“”。长度;
functionlength=functionlength>50?50:functionlength;
如果(类型长度+函数长度>最大宽度)
最大宽度=类型长度+函数长度;
}
对于(var i=0;i
下面是测试代码的示例:

函数A(){B();}
函数B(){C();}
函数C(){抛出新错误('asd');}
试一试{
A();
}catch(e){print(e+'\n'+e.stack);}

如何覆盖它以及在何处覆盖?你会在之后重新启动chrome吗?如何测试您的更改?你在chrome定制的其他方面运气好吗?
trace from catch(): 
[object Object].someObj.someMethod
[object Window].bar
[object Window].foo
[object Window].