1

これに 2 日間費やしましたが、まだクラッシュの原因を見つけることができません。

解放されたオブジェクトにアクセスしようとすることに関係があることは知っていますが、どのアクセスまたはどのオブジェクトかはわかりません。

EXC_BAD_ACCESS のソースを見つけようとしてグーグルで検索するたびに、人々は NSZombies の使用を提案します。問題は、(環境変数を介して xcode で、または ObjectAlloc プロパティを介してインストゥルメントで) ゾンビを有効にすると、プログラムは通常クラッシュせず、ゾンビは何も報告しません (ログには何も表示されず、何もフラグが立てられません)。楽器)。NSZombie に欠けているものはありますか?

xcode のデバッガーと ObjectAlloc からの情報をインストゥルメントで利用しようとしましたが、すべての情報は非常に不可解であり、実際には役に立ちません。

Objective-C 例外で停止するようにデバッガーを設定しました。それが行われると、これは示されているコール スタックです。

0 objc_msgSend
1 ??
2 -[UITableViewCell removeFromSuperView]
3 -[UIView dealloc]
... etc ...

まず、「1??」ってどういうこと?? クエスチョンマークの意味は?第二に、コード内でこれが呼び出された場所をどのように知ることができますか? 記載されているすべての操作は一般的すぎます (たとえば、UIView の dealloc ですが、どの UIView で、どこで?)。

また、例外が発生すると、コードが何をするのかを理解するために何時間も費やさない限り、アセンブリ コードを指します。私はいくつかのアセンブリを知っていますが、もっと良い方法が必要です...よね?

例外が発生する前にコードで実行された最後の行について、意味のある情報を取得する方法はありますか?

いくつかの NSLog とブレークポイントを散らしてみましたが、ナビゲーション コントローラーからビュー コントローラーをポップした後にクラッシュが発生するため、あまり役に立ちません。ブレークポイントを配置するすべての場所で、ブレークポイントに問題なく到達します (クラッシュ後にブレークするポイントが見つかりません)。例外が発生するのは、デバッガーで「続行」したときだけです。クラッシュがコードの外で発生したかのように見えるので、どこでそれを処理すればよいかわかりません。

私は自分のコードを調べて、すべてのメモリ管理規則に準拠していることを再確認しました (少なくとも私の知る限りでは)。それは非常に微妙なものだと確信していますが、それを見つけることができないようです。

NSZombie を使用せずにそのようなバグを見つける方法を誰かが知っている場合は、共有してください。

ありがとう。

4

1 に答える 1

1

さて、私は問題を見つけました。(最後ではなく) dealloc メソッドで最初に [super dealloc] を呼び出したカスタム テーブル セル クラスがありました。このクラスを急いで書いたので、あまり考えていなかったと思います。子供が解放するために必要な何かが親で解放されたと思いますか?

したがって、私自身の質問に対する本当の答えはありませんが、基本的に、アドホック コード トレースとさまざまなデバッグ手法 (ブレークポイント、NSLog、暗号スタック トレースの解読など) を組み合わせて問題を発見しました。

実際、私を助けた主な戦略は、コードを少しずつコメントアウトすることでした。クラッシュをそのまま維持しながら、問題の領域を可能な限り単純なものに分解しました。これにより、問題は私が思っていた場所ではなく、より微妙な領域にあることがわかりました (たとえば、この場合はセカンダリ クラスの dealloc メソッド)。

これが誰かを助けることができることを願っています。誰かが NSZombies に依存せずに、より徹底的なデバッグ戦略を持っている場合に備えて、この質問には少し答えないままにしておきます。また、スタックトレースでこれら2つの疑問符が何を意味するのかを誰かが明確にできると助かります。

于 2010-06-24T16:37:30.670 に答える