2011-11-28 6 views
42

引数>環境変数でALT + CMD + Rを押してNSZombieEnabledを有効にしました。さらに、「診断」>「メモリ管理」>「ゾンビオブジェクトを有効にする」で有効にしました。私はいくつかの点で、私のコンソールでこの役に立たないメッセージを与える私のアプリがクラッシュ構築し、実行したときにXcode4の「割り当てられたインスタンスに送信されたメッセージ」をデバッグする方法は?

しかし、:

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

をスタックトレースが同じように無意味です。私は、詳細レベルのスライダをすべて右に移動しました。

screenshot

すべてがシステム所有であると私のアプリに関連した一行はありません:スレッド1は、単に私にこのことを示しています。だから明らかにNSZombiesEnabledはXcode 3のように動作しません。そこでは、死んだオブジェクトで停止しました。

を把握する方法はありますか? CALayerの割り当てが早すぎますか?

更新:突然、約100回以上ビルドして実行した後、問題は破棄されました!完全に消えた!そして、最も重要な部分:私は自分のコードを変更していませんでした!私はビルドフォルダとプロジェクトをクリーンなコマンドで数回きれいにし、シミュレータで数回もアプリケーションを削除しました。

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

アップデート3:最後に偶然それを見つけた:

startButton = newBttn; 

はされている必要があります。

self.startButton = newBttn; 

スタートボタンは、保持特性だったと-deallocで、私はそれをリリースしました。だから、それは過度に解放され、ほとんどが(すべてではありませんが)ビューが消えてからクラッシュして、その奇妙なCALayerのretainCountメッセージを与えました。

Zombies Instrument(CMD + I)は、最後にボタンと関係があると指摘しました。理由と理由は分かりませんでした。

クラングスタティックアナライザは、この明らかなグリッチについては不平を言っていませんでした。

+0

「自分自身を修正する」というバグはありません。これは並行性に関連した所有権の問題であり、コード内にはおそらく存在する可能性が非常に高いです。あなたが望むなら、時を刻む爆弾。あなたの靴では、Core Animationベースのリソースをどのように管理しているか、非常に見ていきます。 – bbum

+0

Core Animationベースのリソースとは、具体的にはどういう意味ですか? – dontWatchMyProfile

+0

スクリーンに寝かせ敷きに関係するものは何でも。 cocos2dを訴えている場合は、間接的にCA *のリソースを管理するので、そこでのリソースの管理を見直す必要があります。 – bbum

答えて

88

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

+0

素晴らしいツール!ありがとう!より良いスタックトレースが表示されますが、どのUIViewがそのCALayerゾンビを所有しているのかわかりません。このような場合にその機器を使用する方法を示す良いリソースを指摘できますか? – dontWatchMyProfile

+0

偉大な、素晴らしい答え、ありがとう – Sam

+0

これはちょうど私の一日を作った。私はあなたがそのようなアプリをプロファイリングできるかどうか分かりませんでした。あなたは今私がどれほど幸せであるか分かりません。 – shulmey

46

ジェフの素晴らしい答えに加えて、ほとんど同じことをするが、Instrumentsを開いたりアプリケーションをプロファイリングする必要なく、デバッガにNSZombieEnabledMallocStackLogging、およびguard mallocを設定することができます。そして、あなたのアプリケーションがクラッシュし、GDBコンソールで次のように入力します。

(gdb) info malloc-history 0x543216 

は、クラッシュの原因となったオブジェクトのアドレスで0x543216を交換し、あなたがはるかに便利なスタックトレースを取得し、それはあなたがピンポイントで役立つはずです問題の原因となっているコードの正確な行。

This article has some additional infoz.

+0

ゾンビツールは、基本的にはこの手順に沿ったGUIラッパーであると思います。ちょうどあなたの面倒な作業の一部を処理します。 – Olie

+12

は残念ながらlldb FYI – Chris

+20

でこのdoesntの仕事:次のようにLLDBデバッガを使用すると、これを行うことができます:ロードする (lldb)スクリプトのインポート (lldb)malloc_info --stack履歴0x7c506a00 – Ron

関連する問題