难以捉摸的崩溃:因内存问题而终止

时间:2017-09-22 19:37:06

标签: ios multithreading memory swift3 disk

我还在尝试在我的应用中调试难以捉摸的崩溃。我的早期帖子见here

应用程序从麦克风获取声音,处理它,并使用处理结果不断更新显示。在平稳运行几分钟后,应用程序将暂停Message from debugger: terminated due to memory issue。没有堆栈跟踪。

崩溃的时间使得看起来有一些有限的资源在运行这么多分钟后会耗尽。崩溃所需的时间非常均匀。当我在代码中更改某些内容时,崩溃的时间可能会发生不可预测的变化,但只要代码保持不变,崩溃的时间就会大致保持不变。在最近的10次试运行中,碰撞时间在1014秒到1029秒之间变化。

显示器更新的次数更加均匀。在同一组10个测试中,对UIView.draw的调用次数从15311到15322不等。这是0.07%的变化,而不是崩溃时的1.5%。

内存不足。我的代码是用Swift 3编写的,所以我没有做任何显式的mallocs或者frees。在需要的地方,我的班级参考文章很薄弱。我已经在XCode下的Activity Monitor,Allocations和Leaks Instruments下进行了测试。我的程序占用了44.6 MiB,并且它不会随着时间的推移而增长。

访问共享数据时,我一直非常注意线程安全。所有共享数据都在同一串行DispatchQueue上读取和写入。

我已经将崩溃跟踪到一段代码,该代码将一个字节数组写入磁盘,然后读入另一个字节数组。这是该代码的简化版本:

var inputBuf:Buffer = Buffer()
var outputBuf: Buffer = Buffer()
var fileHandle:FileHandle? = ...
struct Buffer {
    let bufferSize = 16384
    var fileIndex:Int = 0
    var bytes:[UInt8]
    init() {
        bytes = [UInt8](repeating:0, count:bufferSize)
    }
    func save(fileHandle:FileHandle) {
        fileHandle.seek(toFileOffset: UInt64(Int64(fileIndex)))
        fileHandle.write(Data(bytes))
    }
}
func bug()
{
    outputBuf.save(fileHandle:fileHandle!)
    fileHandle!.seek(toFileOffset: UInt64(inputBuf.fileIndex))
    let data = fileHandle!.readData(ofLength: inputBuf.bufferSize )
    for i in 0..<data.count {
        inputBuf.bytes[i] = data[i]     // May crash here
    }
}

通常在循环期间发生崩溃,将数据从readData的结果复制到我的缓冲区。但有一次,在崩溃之前完成了循环。这导致我怀疑实际崩溃发生在另一个线程上。没有堆栈跟踪,所以我唯一的调试技术是在代码中插入print语句。

fileIndex总是在0到2592500之间。我修改了代码以在使用后关闭FileHandle并在下次需要时创建一个新的FileHandle。它没有影响结果。

1 个答案:

答案 0 :(得分:1)

这是僵尸探测器!我关闭僵尸检测,应用程序永远运行。