36

iPadアプリケーションのクラッシュを追跡するのに苦労しています。この問題は、アプリケーションが失敗したときにエラーやスタックトレースが存在しないという事実に起因しています。それは単にKeizerSozeのように消え去り、「そしてそのように、うんざりしている。彼は去った」。

シミュレーターとデバイスの両方でクラッシュを再現しました。デバイスログはゼロで、コンソールには何もありません。

クラッシュ中に、いくつかのCoreGraphics操作がバックグラウンドスレッドで発生していることを私は知っています。通常、3つほどのNSOperationsがいくつかの画像ブレンドを開始します。

ブレンディングは、CGContext *呼び出し(DrawImage、SetBlendMode、SetAlphaなど)で構成されます。NSOperationは、メインスレッドのデリゲートを呼び出してイメージを処理し、に設定するためUIImage、UIメインスレッドの競合ではないはずですが、現時点では何も割り引いていません。

何が起こっているのかを正確に追跡するために私が見逃しているXcodeのトリックはありますか?または、少なくとも問題がどこにあるかについてのより良いヒントを得ますか?

編集私はメモリ使用量を追跡するInstrumentsでアプリを実行しましたが、2MB前後でかなり安定していることがわかりました。だから、それがメモリの問題だとは思わないでください。しかし、検討の結果、この安定した2MBは異常に低いようです。InstrumentsがCoreGraphicsの割り当てを取得していない可能性はありますか?

4

6 に答える 6

28

レジスターを読み取ってみてください。

アプリがエラーなしでクラッシュするときはいつでも、ほとんどの場合、レジスタで例外を見つけました。

最初に [例外] タブに移動し、左下隅の + を使用して [例外ブレークポイントを追加] を選択します。 ここに画像の説明を入力

次に、アプリがクラッシュしたら、スレッド 1 の下の「0 objc_exception_throw」をクリックします。 ここに画像の説明を入力

最後に、コンソールに次のように入力します。

  • register read (レジスタのリストを取得する必要があります)

  • po $rax (通常、例外は 'rax' にあります)

    (コンソールに例外出力が表示されるはずです)

お役に立てれば。

于 2014-05-08T12:03:24.540 に答える
10

より良い解決策がない場合、およびそれが明らかでない場合は、アプリに NSLogs を追加して、これが発生した場所を一周し、ブレークポイントや追加のログを介してそこからさらに掘り下げます。

于 2011-01-27T11:37:07.560 に答える
2

非常に遅い回答ですが、try / catchを使用すると、スタックトレースを取得できず、アプリケーションがKeizer Sozeをプルするときに情報を提供できることがわかりました。

@try
{
  // suspected code causing crash/errors
}
@catch (NSException *exception)
{
  NSLog(@"Exception: %@", exception);
}
于 2014-05-28T02:25:49.660 に答える
1

私の場合は、スキームで「Zombie Objects」を有効にして問題を見つけたためでした。これにより、最終的にメモリ不足とクラッシュが発生しました。

于 2015-09-05T00:19:11.793 に答える
0

私の場合、オブジェクトが解放されたことが原因でした。通常、割り当て解除されたインスタンスに送信されたメッセージなどと表示されますが、そうではありませんでした。iPhone のログを確認したところ、KERN_INVALID_ADDRESS が見つかりました。Google で調べたところ、KERN_INVALID_ADDRESS が見つかりました

ゾンビ オブジェクトを有効にして、割り当てを解除したインスタンスを使用しようとしたことがわかりました。また、後でログにあったオブジェクトも教えてくれました。

将来の訪問者に役立つことを願っています。

于 2014-08-17T21:56:49.807 に答える