私のアプリで逃げようとするクラッシュをデバッグしようとしています。何分もの間平穏に実行した後、アプリケーションは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?
}
}
UInt8配列は実行開始時に一度割り当てられ、リサイクルされます。私は、書き込みのための配列のコピーを作成しようとしましたが、それは問題を解決していないので、それはスレッドの問題ではありません。私はXode内のAllocationsとLeaks Instrumentsの下で私のプログラムを実行しました。私はインストゥルメンツでクラッシュすることはできませんが、急激なメモリ増加の兆候はありません。 –