1. ホーム
  2. objective-c

[解決済み] Xcode/LLDB: 投与されたばかりの例外に関する情報を取得するには?

2023-06-18 17:01:43

質問

では、私のブレークポイントである objc_exception_throw にあるブレークポイントがちょうどトリガーされたとします。 私はデバッガーのプロンプトに座っていて、例外オブジェクトに関するいくつかの詳細な情報を取得したいと思います。例外オブジェクトの情報はどこにあるのでしょうか?

どのように解決するのですか?

例外オブジェクトは、第一引数として objc_exception_throw . LLDB では $arg1 .. $argn という変数を使って、正しい呼び出し方法で引数を参照することで、例外の詳細を簡単に表示することができます。

(lldb) po $arg1
(lldb) po [$arg1 name]
(lldb) po [$arg1 reason]

を必ず選択してください。 objc_exception_throw フレームを選択していることを確認してください。ステージでこれを実行する様子を見るには、WWDC15 セッションのビデオにある "Advanced Debugging and the Address Sanitizer" を参照してください。

古い情報

GDB を使用している場合、第1引数を参照する構文は、実行しているアーキテクチャの呼び出し規約に依存します。 実際の iOS デバイスでデバッグしている場合、オブジェクトへのポインタはレジスタ r0 . これを印刷したり、メッセージを送ったりするには、次のような簡単な構文を使います。

(gdb) po $r0
(gdb) po [$r0 name]
(gdb) po [$r0 reason]

iPhone Simulatorでは、関数の引数はすべてスタックに渡されるため、構文はかなり恐ろしいものになります。私が組み立てた最も短い式は、次のとおりです。 *(id *)($ebp + 8) . 苦痛を少なくするために、私は便利な変数を使用することをお勧めします。

(gdb) set $exception = *(id *)($ebp + 8)
(gdb) po $exception
(gdb) po [$exception name]
(gdb) po [$exception reason]

また $exception にコマンドリストを追加することで、ブレークポイントが発生するたびに自動的に objc_exception_throw を追加することで、ブレークポイントが発生するたびに自動的に

(私がテストしたすべてのケースで、例外オブジェクトは eaxedx はブレークポイントがヒットした時に登録されます。常にそうなるとは限りませんが)。

下のコメントから追加。

lldb のスタックフレームを選択します。 objc_exception_throw を選択し、このコマンドを入力します。

(lldb) po *(id *)($esp + 4)