web-dev-qa-db-ja.com

Xcode4で「割り当て解除されたインスタンスに送信されたメッセージ」をデバッグする方法は?

Alt + CMD + Rを押して、Arguments> Environment VariablesでNSZombieEnabledをアクティブにしました。さらに、[診断]> [メモリ管理]> [ゾンビオブジェクトの有効化]でアクティブにしました。

ただし、ビルドして実行すると、ある時点でアプリがクラッシュし、コンソールにこの役に立たないメッセージが表示されます。

*** -[CALayer retainCount]: message sent to deallocated instance 0x656b260

スタックトレースはまったく役に立たない。詳細レベルのスライダーを右端まで動かしました。スレッド1は、これを単に示しています。

screenshot

すべてがシステム所有であり、アプリに関連する単一の行はありません。したがって、明らかにNSZombiesEnabledは、Xcode 3のように機能しません。Xcode3では、死んだオブジェクトで停止しました。

which CALayerが早期に割り当て解除される方法を理解する方法はありますか?

更新:そのため、約100回以上ビルドして実行すると、問題は突然消えました!完全になくなった!そして最良の部分:私はコードを変更しませんでした!その間、ビルドフォルダーとプロジェクトをクリーンコマンドで数回クリーンアップし、シミュレーターでアプリも数回削除しました。

更新2:幸いなことに、問題が再発しました。そして今、それは永続的なようです。幸いなことに、私はユーザーをランダムに悩ませるよりも根本原因を見つけることを好みます。

更新3:最後に偶然見つけました:

startButton = newBttn;

になるはずだった:

self.startButton = newBttn;

startButtonは保持プロパティであり、-deallocでリリースしました。そのため、リリースが過剰になり、ビューがフェードアウトした後(ほとんどではありませんが)ほとんどの場合、クラッシュして異常なCALayer retainCountメッセージが表示されました。

Zombies Instrument(CMD + I)は、ボタンと関係があることをようやく指摘しました。理由と場所がわかりませんでした。

Clang Static Analyzerは、この明らかなグリッチについて文句を言いませんでした。

49

これが再び発生する場合は、専用のゾンビ楽器を実行できます。 Command + Iを押してアプリのプロファイルを作成し、ゾンビ機器を選択します(シミュレーターで実行する必要があります)。ゾンビを取得した場合は、そのオブジェクトのメモリ履歴全体(各保持/解放)を表示できます。これは、エラーの追跡に非常に役立ちます。

98
Jeff Kelley

ジェフの素晴らしい答えに加えて。ほぼ同じことを行いますが、インストゥルメントを開いたり、アプリのプロファイルを作成したりすることなく、 NSZombieEnabledMallocStackLogging 、および guard malloc を設定できますデバッガー。次に、アプリがクラッシュしたら、gdbコンソールに次のように入力します。

(gdb) info malloc-history 0x543216

置換0x543216クラッシュの原因となったオブジェクトのアドレスを使用すると、はるかに有用なスタックトレースが得られ、問題の原因となっているコード内の正確な行を特定するのに役立ちます。

この記事には追加情報があります。

53
chown