【问题标题】:Google Chrome: How to debug random "Maximum call stack size exceeded" errorsGoogle Chrome:如何调试随机“超出最大调用堆栈大小”错误
【发布时间】:2012-07-18 14:58:22
【问题描述】:

在复杂的 JavaScript 应用程序(使用 jQuery 和 Ember)中,JavaScript 偶尔会随机崩溃,无论是在页面加载期间还是在我对页面执行操作时。报错如下(screenshot):

Uncaught RangeError: Maximum call stack size exceeded
  Class.proto
  Class.proto
  ...

...有几页 Class.proto 堆栈跟踪行,但没有任何源/行信息,即使在跟踪的底部也是如此。

我知道这指向无限递归,这可能发生在事件系统中,但对我来说没有明显的起点。

我能够仅在 Chrome Canary (22.0.1209.0) 中重现此内容,而不是 Chrome 稳定版或 Firefox。该应用没有与任何外部服务通信或发出任何 Ajax 请求。

由于它只是偶尔发生,而且没有明显的原因,而且由于没有可用的堆栈跟踪,所以我很难找到原因。

我的问题:我可以做些什么来调试这个问题?

【问题讨论】:

  • 您可能已经考虑过这一点,但由于这只发生在 Canary 版本中,这可能是 Canary 错误吗?您是否尝试过测试版或开发版 chrome 版本以查看问题是否在那里发生?
  • 您可以在分析器中识别出有问题的函数。它必须是最长的一段。
  • 很有可能是 Canary 错误。
  • 启用“异常中断”(此图标developers.google.com/chrome-developer-tools/docs/…
  • @SplitYourInfinity "Pause on exceptions" 对我不起作用(它不会暂停,它只是抛出错误并停止);我使用的是最新版本的 Chrome。

标签: javascript google-chrome


【解决方案1】:

在 Chrome 开发者工具栏中启用“异常中断”。在 Sources 选项卡的工具栏页脚中使用此 图标(有 3 种状态!)

它应该停止你的代码,你可以看到堆栈!

【讨论】:

  • 好主意,谢谢!有趣的是,Chrome 拒绝将其定位到任何源代码行。 “Break on uncaught”实际上并没有在“Uncaught RangeError”上中断,而“break on all”我什至无法重现崩溃。所以这指出了 Chrome 中的一个问题。知情人士告诉我,V8(在 Canary 和 dev 中)中有一个错误导致了这个问题,并且已经有一个修复程序,只是等待发布。因此,我将暂时搁置这个问题并在 Chrome 稳定版上测试我的应用。
  • 我最近在 react-native 打包器中遇到了相当复杂的堆栈溢出崩溃。有帮助的是传递: --stack_trace_limit=32 作为调试器中显示的默认堆栈大小太低:(
  • @Birowsky,这是一个节点参数。 V8 配置选项之一。您可以通过运行node --v8-options 获得完整列表
  • 从 chrome 75(2019 年)开始,“异常中断”不适用于这种特定类型的异常(或者,至少在我的代码中)。这个答案不应再被接受。
  • @IvanCastellanos 感谢您的报告。我的假设是这是开发人员工具中的回归。我与 chromium 团队 (bugs.chromium.org/p/chromium/issues/…) 一起创建了一个错误报告,让我们不要对这个答案投反对票。而是投票给我的票以修复它。谢谢!
猜你喜欢
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
相关资源
最近更新 更多