【问题标题】:Is there a way to get the timestamp of each call from a callstack?有没有办法从调用堆栈中获取每个调用的时间戳?
【发布时间】:2019-10-14 19:50:19
【问题描述】:

我想在抛出异常时使用函数调用的调用堆栈来获得准确的时间。 我知道从调用堆栈中我可以为每个调用获取它的名称及其调用者名称 + 行 + 文件。但是是否有可能知道每个被调用函数的时间戳?


    function callA() {
        callB();
    }

    function callB() {
        callC();
    }

    function callC() {
        throw new Error('Boom');
    }

chrome 控制台打印的是:

Uncaught Error: Boom
    at callC (<anonymous>:13:8)
    at callB (<anonymous>:8:2)
    at callA (<anonymous>:3:2)
    at <anonymous>:1:1

我想在我的 js 代码中使用的内容类似于:

Uncaught Error: Boom
    at callC (<anonymous>:13:8) timestamp : 1559117311448 
    at callB (<anonymous>:8:2) timestamp : 1559117311449
    at callA (<anonymous>:3:2) timestamp : 1559117311449
    at <anonymous>:1:1

【问题讨论】:

    标签: javascript stack-trace callstack


    【解决方案1】:

    Math.floor(Date.now() / 1000) 表示从 1970 年 1 月 1 日开始的秒数。或精确的持续时间类型(从开始到结束)performance.now()

    function callA() {
      console.log(performance.now());
      callB();
      console.log(performance.now());
    }
    
    function callB() {
      let t0 = performance.now();
      callC();
      let t1 = performance.now();
      console.log(`Start: ${t0} End: ${t1}`);
    }
    
    function callC() {
      throw new Error('Boom');
      console.log(Math.floor(Date.now() / 1000))
    }

    【讨论】:

    • 您好,zer00ne,感谢您的分享。但我想避免这种解决方案。我想使用调用堆栈的原因是这个对象链接到调用本身(这里是 callC 在示例中)。与在 Javascript 中一样,我无法识别执行线程,如果在多次调用 callA 时堆栈中有一些异步调用怎么办?
    • 您可以将await/asyncfor...of 循环一起使用。将数组中的每个函数和 setTimeout 的时间推入另一个数组。与await同步调出每个函数。
    猜你喜欢
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    相关资源
    最近更新 更多