2017-09-14 22 views
0

我想在我的应用程序中调试一个难以捉摸的崩溃。运行平稳很多分钟后,该应用程序将停止运行Message from debugger: terminated due to memory issue。没有堆栈跟踪。FileHandle.write线程安全吗?

我已确定崩溃与将代码复制到UInt8阵列的代码段相关联。同一个阵列可以在之前或之后立即写入文件系统。我从悲惨的经历中知道,你不能从不同的线程读写数据。它会导致非常像我正在经历的崩溃。但是我在实施过程中非常小心。将字节写入数组的代码以及从中读取字节的代码都运行在同一个串行DispatchQueue上。

但也许有另一个线程?在FileHandle.write返回之前写入是否真的完成,还是有一些后台处理?

func bug() { 
    let bufferSize = ... 
    var fileHandle:FileHandle = ... 
    var fileIndex:UInt64 = ... 

    var bytes = [UInt8](repeating:0, count:bufferSize) 

    fileHandle.seek(toFileOffset: fileIndex) 
    fileHandle.write(Data(bytes)) 
    for pos in 0..<bufferSize { 
     bytes[pos] = ...  // Can my app crash here? 
    } 
} 

回答

0

FileHandle.write不应该创建另一个线程。我认为“从调试器发出的消息:由于内存问题而终止”错误的最可能原因是由于某种原因您的应用程序内存不足。可能有些东西不能正确释放。

你在循环中分配多个UInt8字节数组吗?

+0

UInt8数组在执行开始时被分配一次,并被循环使用。我试图创建一个数组的副本进行写入,但是这并没有解决问题,所以它不太可能是线程问题。我在Xode的Allocations和Leaks Instruments下运行我的程序。我无法让它在乐器下崩溃,但没有迹象表明内存增长失控。 –