web-dev-qa-db-ja.com

LLDBの不良メモリアドレスに関する情報の取得

IPhoneアプリでEXC_BAD_ACCESSをデバッグしようとしています。メソッド呼び出しでクラッシュし、メソッドの行はEXC_BAD_ACCESS (code=1, address = xxx)です。

以前は、gdb info malloc-history <xxx>デバッグを開始しますが、LLDBで並列コマンドを見つけるのに問題があります。

this Instrumentsを使用するように言っているスレッドを見ましたが、実行してもクラッシュしますが、Instrumentsのどこからアプリがクラッシュしているかを正確に知る方法がわかりません。

クラッシュしているこのメモリがどこを指しているのかを把握する必要があります。 LLDBまたはInstrumentsを使用してこれを行う最良の方法は何ですか?

24
Ross Kimes

この問題は、有益なバックトレースで非常に簡単に解決できます。残念ながら、最新バージョンのiOSおよびXcodeでは、優れたスタックトラックを入手するのが難しい場合があります。幸いにも、Xcodeで「例外ブレークポイント」を設定して、EXC_BAD_ACCESS例外の前にこのコードを調べることができます。

  1. Xcode 4でブレークポイントナビゲーションを開きます(これは、右側に点がある長方形のように見えます)
  2. 左下の「+」ボタンを押して、「例外ブレークポイント」を追加します。 「すべて」の例外については、必ず「オンスロー」を解除してください。

これで、この例外が発生する直前に完全なバックトレースを取得できます。これにより、この例外がスローされる場所を少なくともゼロにすることができます。

37
Sam

計測器を使用してデバッグすると、mallocスタックを確認できます。

私はあなたと同じ問題に遭遇し、同様にlldbを使用するときにmalloc履歴を取得する方法を知りたいと思っていました。残念ながら、gdbにmalloc-historyのような気の利いたコマンドが見つかりませんでした。正直なところ、デバッガーを切り替えただけですが、そうする必要はないと感じたので、迷惑でした。

機器を使用してmallocの履歴を見つけるには:

  1. プロジェクトのプロファイルを作成します
  2. 楽器のリストからゾンビを選択します enter image description here
  3. アプリに問題を引き起こさせる
  4. この時点で、すでに割り当てが解除されているアドレスが表示され、探索することができます。 enter image description here この時点では、malloc履歴を表示するだけの簡単なことです。自分が行っている作業に固有のクラス/プロジェクト名が付いている部分を黒く塗りつぶしましたが、この情報を取得する方法の本質と有用性は存在していると思います。

最後の言葉

私が遭遇した問題は次のようなメッセージをもたらしました:

***-[someClass保持]:割り当て解除されたインスタンス0x48081fb0に送信されたメッセージsomeProject(84051,0xacd902c0)malloc:標準レコーダーを使用してmallocスタックをディスクに記録します

このretainがどこから来たのか、私は本当に戸惑いました。なぜなら、それが壊れていたコードにはコードがなかったからです(それがあった行のゲッターやセッターにはありませんでした)。特定のオブジェクトがdeallocされたとき、私はremoveObserver:forKeyPath:を呼び出していなかったことがわかりました。実行の後半で、KVOがライン上のセッターに対して実行され、KVOが既に解放されたオブジェクトに通知しようとしたため、プログラムが爆破されました。

44
Sam

lldbで次のようなコマンドを使用できます。

image lookup --address 0xec509b

あなたはより多くのコマンドを見つけることができます: LLDB TO GDB COMMAND MAP

15
tristan

手遅れかもしれませんが、LLDBでさらに支援が必要です。

(lldb) p *(MyClassToPrint*)memory_address

例えば。

(lldb) p *(HomeViewController*)0x0a2bf700
10