2017-08-25 18 views
-1

メモリに問題があります。私はエラーメッセージ "スレッド1:EXC_BAD_ACCESS(コード= 1、アドレス= ...)が表示されますエラーは難解で、明らかにタイミングに依存します。私のiPad miniでは、通常、クラッシュの間に約3分、iPhone SEでは平均10分、シミュレータではクラッシュせずに20時間実行されます。メモリエラーの考えられる原因

ゾンビ検出器の使用に成功しません。 (私の経験については、下を参照してください)だから私はクラッシュを引き起こす可能性があるかどうかを確認するために、細かい歯の櫛で自分のコードを調べようとしています。割り当てエラーを引き起こす可能性がある問題は何ですか?

私のアプリはマルチスレッドです。マイクからサウンドを取り出し、処理し、処理結果を表示し続ける。それはSwift 3で書かれているので、明示的なmallocや解放はしていません。

エラーが発生する可能性のあるコード内の場所を探しています。私が最も近づけているのは弱い参照と安全でないポインタです。他にも一般的なプログラミングエラーがありますが、それは私を飛び越えることができますか?

(Apple Instrumentsユーザーガイドには、「iOSアプリの場合、物理デバイスではなく、ゾンビテンプレートをiOSシミュレータで使用します」という警告が無視され、 iPad miniの場合、クラッシュすることはできません。すべてが約1/10のスピードで実行され、録音を一時停止すると、OSXマシンも低速になり、一度に数分間分回転する「Wait」カーソルが表示されます。メモリの総割り当ては上下しますが、限界内にとどまるので、大きなメモリリークはありません。また、シミュレータ上でゾンビの計測器を実行しても、同様に低速ですが、まだクラッシュしません)

+0

デバッガでクラッシュする可能性はありますか?スタックはありますか? 「自己」を「所有していない」と捉えるブロックを持っていますか? –

+0

はい、デバッガに表示されます。ここではbarfs上のコードです 'let loByte = bytes [pos]' 'let hiByte = bytes [pos + 1] //ここで壊れます ' 実際の値は異なりますが、この最後の位置は630です。バイトまたはバイトの630番目と631番目の要素に関するデバッガ –

答えて

0

この場合の問題はスレッドセーフであることが判明しました。あるスレッドでUInt8変数を設定し、別のスレッドでそれを読み取ると、メモリエラーが発生する可能性があります。 setterとgetterはスレッドセーフではありません。

(これらの言語のマルチスレッドの問題に精通しています。私はSwift 3の新機能です。今まで、数値変数の設定と取得が原子的操作ではなく、不適切なアクセスがプログラムをクラッシュさせる可能性があることを今まで私には知らされていませんでした。私はSwiftとの並行性に対するアプローチを徹底的に考え直さなければなりません。 )

関連する問題