我正在尝试调试我的应用程序中的一个难以捉摸的崩溃。在平安无事地运行了几分钟后,应用程序将停止并显示Message from debugger: terminated due to memory issue。没有堆栈跟踪。
我已经确定崩溃与将字节复制到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?
}
}发布于 2017-09-15 23:19:34
FileHandle.write不应该创建另一个线程。我认为“来自调试器的消息:由于内存问题而终止”错误的最可能的解释是,由于某种原因,你的应用程序正在耗尽内存。可能有什么东西没有正确释放。
你是否在一个循环中分配多个UInt8字节数组?
https://stackoverflow.com/questions/46228602
复制相似问题