いくつかのデバイスでクラッシュするiOSアプリケーションがあります。これが起こったときにiTunesで残っている悪いレビューを考えると、コード内の同じポイントでクラッシュが起きているように見えます。GCDを使用すると一部のデバイスでクラッシュする
最後に、ただ1人の素敵な人が実際にレビューを残す代わりに私に連絡してくれました。私のためにTestFlightを使ってデバッグバージョンのアプリをインストールすることさえできました。
私はそれが深いのmallocのどこかで発生していることがわかりますクラッシュレポートで武装:
2 libSystem.B.dylib 0x34683d6e _sigtramp + 42
3 libSystem.B.dylib 0x3468c886 szone_malloc_should_clear + 2122
そして、行番号与えられ、私がバックグラウンドタスクを開始する時点で発生する表示されます。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage *image = [self loadImage:path];
dispatch_sync(dispatch_get_main_queue(), ^{
クラッシュが起こっている行が不明です.GCD自体の呼び出し、ブロックのコードの開始時、またはブロック自体のどこかでクラッシュが発生するかどうかは不明です。
上記のコードスニペットを含む関数でスタックトレースが終了し、ブロック自体には見えません。クラッシュが非同期ブロックにあった場合、スタックトレースには依然として親関数への呼び出しツリーが含まれますか?私は現在、ブロック内のクラッシュのスタックトレースには親関数(ブロックが独自のスレッドで非同期に実行されているので)が含まれていないと仮定しているので、クラッシュするGCDへの呼び出しだと思います。
私はTFLogを使って失敗の正確な瞬間を見つけようとしましたが、ログはまったく記録されていません。私はログの呼び出しが正しく行われていることを知っています。私の開発デバイスでは、ログがTestFlightレコーダーでポップアップしているので、クラッシュがこのデバッグオプションを混乱させるようです。
最後に、TestFlightは、このユーザーが使用しているiPhone 4のiOSバージョン番号を見つけることができません。これがJailbrokenデバイスであるかどうか疑問に思っています。 (私はユーザーに質問しましたが、答えはまだありません)。
これはすべてARCコードなので、私はそれがメモリ管理の問題であることを発見するのに非常に驚くでしょう。それはまた、いくつかのデバイスに分離されていますが、それらのデバイスは毎回同じポイントでクラッシュします。
誰でも洞察力やデバッグの提案を提供することはできますか(自分でデバイスを破損していないことを考えれば)。
おかげで、私はこの恐ろしいバグを解決しました
ティム