【问题标题】:While debugging javascript, is there a way to alert current call stack?在调试 javascript 时,有没有办法提醒当前调用堆栈?
【发布时间】:2010-01-13 21:07:24
【问题描述】:

对于简单的 javascript 调试,我将使用警报来显示变量值等。有没有办法在 javascript 中获取当前调用堆栈以便能够在警报中显示它?

谢谢。

【问题讨论】:

  • 这是用于调试还是生产?我不确定是否有任何标准方法可以在所有浏览器中执行此操作,但可能有一些仅适用于某些浏览器的有用功能......
  • 这只是用于调试目的。

标签: javascript debugging


【解决方案1】:

在基于 Gecko 的浏览器中又快又脏:

new Error().stack

您也可以使用 Function.prototype.caller 手动拖曳一些堆栈:

var thisFunction = arguments.callee;
var caller = thisFunction.caller;
var callerCaller = caller.caller;
// ...and eventually, assuming no recursion:
var bottomCaller = ...;
assert(bottomCaller.caller === null);

.caller 技巧的一个(可能很大)警告是它不处理递归——.caller 从堆栈顶部向下查找以找到堆栈中函数的第一个实例,然后返回它的直接调用者,因此您可以在不小心的情况下无限循环查找调用者。

caller 的另一个警告是,如果您的任何代码使用 ECMAScript 5 的严格模式,则严格模式函数(或本身从严格模式函数调用的函数)的 caller 属性是一种所谓的“毒丸”,在访问时会抛出TypeError。 “绑定”函数(由 ES5 的 Function.prototype.bind 方法创建的函数)的 caller 属性也是毒丸。这些限制破坏了通用的堆栈遍历算法,尽管人们可以想象使用特定的方法来解决这个问题(也许是入口和出口注释函数)。

请注意,像这样的堆栈遍历在生产代码中并不是一个好主意(作为调试的快速技巧,它很好);目前,在 Mozilla 的 JS 引擎中,如后一个示例所示,在堆栈中向上走有点昂贵,它可能会将您从机器代码中抛出并返回到解释代码中。此外,stack-walk 为 O(n2),如果您倾向于拥有复杂、深的堆栈,这可能很重要。

【讨论】:

  • 谢谢,这就是我要找的东西。
  • 这个答案今天仍然有用吗?
  • Stack-walking 不像以前那么昂贵,但它仍然会在一定程度上损害性能。在最近的 ECMAScript 版本中,毒丸属性函数的一些更精细的细节发生了变化,但总体主旨基本相同。我认为,除了这两点之外,评论仍然具有根本意义。
【解决方案2】:

您可以使用console.trace()

它不显示alert(),而是在调试器控制台上打印stacktrace

【讨论】:

  • 正是我想要的。如果您想在页面加载时转储调用堆栈,这将特别有用。
  • 您现在也可以在 Chrome 中使用它了
【解决方案3】:

如果您使用的是 Firefox,请使用像 Firebug 这样的调试器。 Chrome 和 Opera 有内置调试器。还有 Developers Tools 用于 Internet Explorer。

【讨论】:

  • 谢谢,我知道这些选项,但我想知道是否有办法在不使用调试器的情况下做到这一点。
  • IMO 调试 javascript 最简单快捷的方法是使用调试器。
  • 使用调试器没问题,而且通常很方便,我只是在寻找一种在正确情况下查找调用堆栈的方法。
【解决方案4】:

调试 Javascript 的最佳方法是使用 Firebug,它包含一个完整的 Javascript 调试器。

如果您在 IE 中进行调试,则可以使用 Visual Web Developer Express(或任何其他版本的 Visual Studio)。
如果您正在调试 IE8,则可以使用其内置的开发人员工具,其中包括一个调试器。

可以在Javascript中获取调用堆栈;见here

【讨论】:

    【解决方案5】:

    你看过萤火虫 - 和一个断点。如果只是为了调试,那么这可能就足够了。

    还有——你可以看看Here

    【讨论】:

      【解决方案6】:

      这将为您提供所有调用堆栈 对我有好处。

      var y = 'arguments.callee.caller';
          while (eval(y) != undefined) {
              stak += eval(y + '.toString()');
              y = y + '.caller';
          }
          alert(stak);
      

      【讨论】:

        【解决方案7】:

        对于 nodejs 调试,在 Visual Studio Code 中,从 v.1.14.2 开始,它是 View->Debug (Ctrl+Shift+D)

        【讨论】:

          猜你喜欢
          • 2013-12-19
          • 1970-01-01
          • 1970-01-01
          • 2012-06-18
          • 2019-10-14
          • 1970-01-01
          • 2012-09-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多