【问题标题】:Possible causes of memory error内存错误的可能原因
【发布时间】:2017-08-25 22:58:54
【问题描述】:

我遇到了内存问题。我收到一条错误消息“线程 1:EXC_BAD_ACCESS(code=1,address=...) 该错误难以捉摸,显然与时间有关。在我的 iPad mini 上,崩溃之间的平均间隔通常约为 3 分钟,在我的 iPhone SE 上平均为 10 分钟,而在模拟器上它已经运行了 20 小时而没有崩溃。

我没有成功使用僵尸探测器。 (见下文我的经验。)所以我试图用细齿梳检查我的代码,看看是什么导致了崩溃。哪些问题可能导致分配错误?

我的应用是多线程的。它从麦克风获取声音,对其进行处理,并使用处理后的结果不断更新显示。它是用 Swift 3 编写的,所以我没有做任何显式的 malloc 或 frees。

我正在寻找代码中可能导致错误的地方。我最接近的两件事是弱引用和不安全指针。是否有任何其他常见的编程错误可能会绊倒我?

(僵尸探测器没用。Apple Instruments 用户指南说:“对于 iOS 应用程序,请使用带有 iOS 模拟器的僵尸模板,而不是物理设备。”我忽略了警告并在我的 iPad 上进行了尝试mini,我不能让它崩溃。一切都以大约 1/10 的速度运行,当我暂停录制时,我的 OSX 机器也变得迟缓,一次显示旋转的“等待”光标几分钟。总内存分配上下波动,但保持在限制范围内,因此没有严重的内存泄漏。我也在模拟器上运行了 Zombies 仪器。它同样缓慢,但仍然没有崩溃。)

【问题讨论】:

  • 你能在调试器中捕捉到崩溃吗?有栈吗?您是否有将self 捕获为unowned 的块?
  • 是的,它显示在调试器中。这是它在let loByte = bytes[pos]let hiByte = bytes[pos+1] // breaks here 上的代码,实际值有所不同,但最后一次 pos 是 630。在调试器中,无论是字节还是第 630 和 631 个字节元素都没有什么异常。

标签: ios memory-management swift3


【解决方案1】:

这种情况下的问题是线程安全。如果我在一个线程上设置 UInt8 变量并在另一个线程上读取它,可能会导致内存错误。 setter 和 getter 不是线程安全的。

(我职业生涯的大部分时间都在对计算机进行编程,主要使用 C、C++ 和 Java。我熟悉这些语言中的多线程问题。我是 Swift 3 的新手。它只是没有到目前为止,我还没有想到设置和获取数值变量不是原子操作——不合时宜的访问可能会导致程序崩溃。我将不得不彻底重新考虑我使用 Swift 进行并发的方法。)

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 2023-03-08
    • 2011-05-22
    • 2012-10-10
    • 1970-01-01
    • 2013-06-25
    • 2021-09-06
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多