3

Xcode では、スローされた例外の説明を評価する条件でブレークポイントを設定して、そのブレークポイントで停止するかどうかを決定できます。Core Data は制御フロー メカニズムとして内部的に例外をスローし、Core Data ではなく例外で停止する必要があるため、これは Core Data を操作する場合に特に役立ちます。(注: 説明されているように例外をフィルタリングする方法を知りたい場合は、SO の質問Ignore specific exceptions when using Xcode's All Exceptions breakpointで回答されています)。

ただし、これらのフィルターは、例外のアドレスがレジスターに格納されているため、レジスターの内容に依存することがよくあります。シミュレーター (Intel アーキテクチャーで実行) では、レジスターは です$eaxが、デバイス (ARM アーキテクチャー) では$r0です。

現在使用されているアーキテクチャに関係なく、1 つの式が正しいレジスタを使用するように、2 つのアーキテクチャを区別する式を作成することは可能ですか?

4

1 に答える 1

1

lldb は、レジスタで値を渡すアーキテクチャ用の便利なレジスタ名を提供arg0します。たとえば、最初の引数などです。ただし、標準の i386 ABI はレジスタで引数を渡さず、スタックで渡されます (使用可能な汎用レジスタの数が少ないことを考えると、これは驚くべきことではありません)。

eax(i386 ABI の volatile/non-callee-saved reg) のエントリに関連性の値があるという事実objc_exception_throwは、Objective-C ランタイム ( libobjc) が内部ルーチン間で非標準関数呼び出しを行っていることを示しています。効率。別のモジュールから、このような非標準の ABI を使用してルーチンを呼び出すことはできませんでした。

x86_64 と arm など、レジスタで引数を渡す 2 つの ABI について話している場合は、lldb のarg0便利な変数で問題ありません。

コマンド ラインで lldb を使用している場合は、アーキテクチャに応じてr0またはeaxを取得し、例外名を取得してブレークポイントを続行するかどうかを決定する Python 関数を作成できます。しかし、Xcode (今日) では、python コマンドをブレークポイントに置いて、プロセスを再開するかどうかを制御する方法が提供されているとは思いません。

于 2013-01-17T04:39:46.313 に答える