2009-08-24 18 views
11

NSAutoreleasePoolが流出したときにクラッシュしました。おそらく、プールは別のコードによって時期尚早にリリースされたオブジェクトの割り当てを解除しようとしています。私が持っているクラッシュは、もはや存在しないオブジェクトにメッセージを送信しようとしているので、objc_msgSendの中にあります。objc_msgSend内のクラッシュをデバッグするにはどうすればよいですか?

与えられたスタック状態を考慮すると、問題のオブジェクトに関する情報や不正な解放が発生した時点の情報を入手するためのヒント/トリック/プロセス/ gdbコマンドがありますか?

答えて

16

時期尚早な削除である場合は、ゾンビを有効にして仮説を確認し、次に何が起こっているのかをデバッグします。ゾンビを有効にすると、オブジェクトは実際には破棄されませんが、ゾンビ状態に設定されるため、deallocが呼び出された後にアクセスされたときを検出するのに役立ちます。このクラッシュの種類によりNSZombieEnabled

+3

さらに、InstrumentsのObject Alloc計測器を使用して、早期にリリースされたオブジェクトの保持/解放イベントを追跡することができます。それは自動解放プールの解放ではありませんが、それは問題ですが、いくつかの先行リリースがあります。 – bbum

+0

@Pangリンクを更新しました。 – inga

3

NSZombieEnabledを使用する場合は、オブジェクトがどのクラスであるかを少なくとも把握できます。

+2

が起こったことがなかったふり私の一日続け答えはいくつかの有用な詳細と共に答えを提供します。 – bbum

+0

まあまあです。私は少なくとも外部情報へのリンクを提供することができました。 – Wevah

2

は私がobjc_msgSendでのクラッシュのように見えるものに出くわしました。見知らぬ人だったのはapplication:didFinishLaunchingWithOptions:だったので、いわゆるクラッシュが発生する前に到達していませんでした!

私の場合、クラッシュは、私のコードのいずれかに到達する前に呼び出されていたメモリアドレスに不用意に設定したブレークポイントになっていました。

enter image description here

これを理解しようとしているの時間かそこらの後、私は、ブレークポイントをオフにコードを実行し、顔がpalmed、正しい、tequilatangoのだが、それは...

関連する問題