我试图在我的应用中调试难以捉摸的崩溃。在平稳运行几分钟后,应用程序将暂停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?
}
}
答案 0 :(得分:0)
FileHandle.write不应该创建另一个线程。我认为最有可能解释来自调试器的消息:由于内存问题而终止&#34;错误是由于某种原因你的应用程序内存不足。可能有些东西没有正确解除分配。
您是在循环中分配多个UInt8字节数组吗?