【问题标题】:Web page triggering EXC_BAD_ACCESS / KERN_INVALID_ADDRESS crash in Safari网页在 Safari 中触发 EXC_BAD_ACCESS / KERN_INVALID_ADDRESS 崩溃
【发布时间】:2015-04-11 00:24:15
【问题描述】:

我有一个 Web 应用程序在 Safari 中触发了一个似乎是 iOS8 错误的问题,我正在寻找有关导致它的原因以及如何解决它的线索。

该错误的特点是在用户在 Safari 中浏览了足够长的时间后,页面顶部会出现“此网页出现问题,因此已重新加载”。看起来有什么东西在幕后崩溃了,而 Safari 只是在优雅地恢复方面做得非常好。阅读崩溃日志发现:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000000
Triggered by Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   JavaScriptCore                  0x2d4291d4 0x2d24a000 + 1962452
1   JavaScriptCore                  0x2d50e166 0x2d24a000 + 2900326
2   JavaScriptCore                  0x2d2bc88c 0x2d24a000 + 469132
...

研究表明,CSS 文件中的 translate3dkeyframe 实例可能是罪魁祸首。虽然摆脱它们似乎使错误不太可能再次发生,但错误仍然存​​在。同样,减小与最有可能触发错误的页面关联的(非常、非常大的)CSS 文件的大小似乎有所帮助,但并不能让它消失。

我的公司处理了一堆针对移动优化的面向商务的网络应用程序,而这似乎是唯一一个与此错误发生冲突的应用程序;我不知道是什么让这个特殊的应用程序如此愤怒的小雪花,但我想弄清楚并纠正它。是否有人对可能触发错误的原因以及我们如何解决它有任何想法?

【问题讨论】:

  • 我只能告诉你,你在 Safari 中触发了分段错误。您的崩溃日志表明它可能是 JavaScript 导致的。如果没有触发它的代码,就不可能弄清楚是什么导致它崩溃,但这绝对是 Safari 中的一个错误。
  • @AlexanderO'Mara:老实说,这是一次钓鱼探险。我们拥有的 Javascript 数量相当可观,我还没有找到任何线索表明它的任何特定部分可能是罪魁祸首。如果我能得到一些关于可能导致它的提示(是否有任何与 Javascript 相关的内存泄漏,Safari 非常容易受到影响?),这将大大有助于我确定真正导致它的原因。跨度>
  • ... 假设它实际上是 JavaScript,而不是 CSS 设置的某种独特组合,它们以某种方式组合形成一个试图下载 Cthulhu 的可怕咒语,在这种情况下,Apple 团队是因优雅地处理这种情况而受到表扬。我正在认真地进行比我更喜欢的盲目猜测。不过,是的,那些“JavaScriptCore”引用似乎确实暗示了 JavaScript。
  • 这似乎不太可能是导致 SegFault 的内存泄漏,但我认为这是可能的。如果可以,请尝试分析内存使用情况。 This question offers some advice.
  • @BlairHippo 您能否详细说明“研究表明 CSS 文件中的 translate3d 和关键帧实例可能是罪魁祸首”?任何指示此等的链接?我在我们的应用程序中遇到了同样的问题,该问题一直崩溃(使用开发人员工具,令人沮丧)Safari 出现此错误。

标签: javascript css safari ios8 mobile-safari


【解决方案1】:

我遇到了与描述相同的问题。在我的情况下,当控制少数 DOM 元素(即 element.style.width...)的应用程序的一部分完成时发生崩溃。完成后,这些元素被有意地从 DOM 中删除。在那之后发生了崩溃,没有任何 JS 错误。通过尝试和错误,我隔离了哪些代码部分对此负责,在我的情况下,评论所有 element.style.* 行解决了问题 - 应用程序不再崩溃。只有移动 Safari(iOS 7 和 8)存在此问题,其他浏览器运行良好。

猜测可能是垃圾回收发生了一些奇怪的事情,并且与 JS 控制的 DOM 元素有关。

【讨论】:

    【解决方案2】:

    我在 iOS 8.1.3 上的 safari 遇到了同样的问题。

    实际上浏览器有点疯狂。我的应用程序中有一个加载更多按钮,用于加载接下来的 20 条记录。有时,当您打开页面并单击链接时,Safari 会崩溃并显示“此网页出现问题,因此已重新加载”消息。

    崩溃并重新加载后,每次都会崩溃。但是当它工作时,它也很稳定。

    最终通过将加载的记录数限制为 10 来解决问题,因此它可能需要对内存使用做一些事情。

    在许多其他地方也遇到过这个问题,比如图片上传或只是通过 ajax 加载一些数据。

    实际上更有趣的是,它从未发生在实际使用 webview 组件的 iOS 上的 chrome 中。

    不确定它是否对您有帮助,但它不仅对您的应用程序有帮助,因此除非苹果采取行动并发布稳定的浏览器,否则我们只能尝试解决其中的一些限制。

    【讨论】:

      【解决方案3】:

      查看适用的 JavaScript 和 CSS 行以了解可能的语法违规。一个好的 IDE 编辑器应该突出潜在的问题以减轻这项工作。还要查看为格式错误的页面生成的 HTML 页面源代码。页面格式问题可能会导致某些浏览器出现不稳定的行为,但不会对其他浏览器显示任何问题。

      另一个可以尝试的诊断程序是禁用或注释掉 JavaScript 代码和/或 CSS 行的不同部分,以尝试找出问题所在。尽可能取出大的部分,以获得不会产生错误的功能页面。然后,启用或取消注释行,直到错误返回。重复此过程,直到问题区域已被隔离以进行纠正。

      还可以考虑更改 CSS 定义在“非常非常大”的 CSS 文件中的顺序。这可能会在页面上产生不同的行为,可以纠正问题或帮助显示问题的原因。

      【讨论】:

      • 是否有任何 JavaScript 或 CSS 错误不会记录到控制台?因为我们在那里没有看到任何可疑的东西。如果不使网站无法运行,删除大块 CSS 或 JavaScript 是很困难的。虽然我想我可以进去尝试通过手术去除任何我能做到的东西,看看这个错误是归结为一些表现绒毛还是核心功能。尽管如此,我还是厌倦了盲目地挥霍,并且希望至少对我正在寻找的东西有一个理论。
      • 我的建议假定 iOS8 和 Safari 不是导致错误的原因,或者如果是,则没有可用的修复程序,因此必须找到涉及更新 CSS、JavaScript 等的解决方法。假设可能不正确。搜索可能解决您的特定问题的 iOS8 和/或 Safari 更新可能是值得的。还可以使用非 Safari 浏览器进行测试,以查看此问题是否与 Safari 相关。其他浏览器可以提供对此问题的洞察。
      • 另外,添加“alert”方法来调试你的 JavaScript 代码。这也可以帮助隔离问题的原因。至少它会让你知道在问题产生之前哪些行被成功执行。
      • 老实说,这不是我希望从该网站获得的见解。但是让赏金代表白白浪费似乎是一种耻辱,我非常感谢您提供帮助的努力,所以来吧。
      猜你喜欢
      • 2017-04-02
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2014-07-13
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多