IPhoneアプリでEXC_BAD_ACCESSをデバッグしようとしています。メソッド呼び出しでクラッシュし、メソッドの行はEXC_BAD_ACCESS (code=1, address = xxx)
です。
以前は、gdb info malloc-history <xxx>
デバッグを開始しますが、LLDB
で並列コマンドを見つけるのに問題があります。
this Instrumentsを使用するように言っているスレッドを見ましたが、実行してもクラッシュしますが、Instrumentsのどこからアプリがクラッシュしているかを正確に知る方法がわかりません。
クラッシュしているこのメモリがどこを指しているのかを把握する必要があります。 LLDB
またはInstrumentsを使用してこれを行う最良の方法は何ですか?
この問題は、有益なバックトレースで非常に簡単に解決できます。残念ながら、最新バージョンのiOSおよびXcodeでは、優れたスタックトラックを入手するのが難しい場合があります。幸いにも、Xcodeで「例外ブレークポイント」を設定して、EXC_BAD_ACCESS例外の前にこのコードを調べることができます。
これで、この例外が発生する直前に完全なバックトレースを取得できます。これにより、この例外がスローされる場所を少なくともゼロにすることができます。
計測器を使用してデバッグすると、mallocスタックを確認できます。
私はあなたと同じ問題に遭遇し、同様にlldbを使用するときにmalloc履歴を取得する方法を知りたいと思っていました。残念ながら、gdbにmalloc-history
のような気の利いたコマンドが見つかりませんでした。正直なところ、デバッガーを切り替えただけですが、そうする必要はないと感じたので、迷惑でした。
私が遭遇した問題は次のようなメッセージをもたらしました:
***-[someClass保持]:割り当て解除されたインスタンス0x48081fb0に送信されたメッセージsomeProject(84051,0xacd902c0)malloc:標準レコーダーを使用してmallocスタックをディスクに記録します
このretain
がどこから来たのか、私は本当に戸惑いました。なぜなら、それが壊れていたコードにはコードがなかったからです(それがあった行のゲッターやセッターにはありませんでした)。特定のオブジェクトがdealloc
されたとき、私はremoveObserver:forKeyPath:
を呼び出していなかったことがわかりました。実行の後半で、KVOがライン上のセッターに対して実行され、KVOが既に解放されたオブジェクトに通知しようとしたため、プログラムが爆破されました。
lldbで次のようなコマンドを使用できます。
image lookup --address 0xec509b
あなたはより多くのコマンドを見つけることができます: LLDB TO GDB COMMAND MAP
手遅れかもしれませんが、LLDBでさらに支援が必要です。
(lldb) p *(MyClassToPrint*)memory_address
例えば。
(lldb) p *(HomeViewController*)0x0a2bf700