3

有用な情報を出力するのに役立つデバッグ関数またはメソッドを書きたいと思っています。呼び出されると、次のものが必要になります。

  • 呼び出し元オブジェクトのメモリ アドレス (オブジェクトによって呼び出された場合)
  • 呼び出し元のメソッド シグネチャ (またはメソッドの名前)、または関数の名前
  • そのメソッドまたは関数を所有するクラス名

たくさんのパラメーターを渡さずにこの情報を取得することは可能ですか?

私は次のようなものを作りたい:

debug();

次に、すべてのメソッドと関数に入り、何が起こっているかについての有用な情報を出力するのに役立ちます.

4

5 に答える 5

3

私の最初の本能は、ブレークポイントの使用を提案することgdbです。これは、その情報のほとんどがスタック トレースで利用できるためです。ただし、本当に印刷物を見たい場合は、あなたが話していることを近似する方法があります

プリプロセッサは__PRETTY_FUNCTION__、関数/メソッド名を出力するためのマクロを認識し、Objective-C メソッドに対して適切に機能します。関心のある各メソッドのメソッド名と値をself出力すると、貧弱なスタック トレースがほとんど生成されます。

#defineそれを必要とするすべてのファイルに含まれるヘッダーに、次のようなものを含めてみてください。

#define METHOD() printf("%s\t0x%x\n", __PRETTY_FUNCTION__, (unsigned int)self)

次に、その情報を印刷したいときはいつでも次の行を含めるだけです。

METHOD();

出力は次のようになります。

-[MyClass initWithFoo:bar:] 0x12345678

前述したように、このタイプのアプローチは大量の出力を生成する可能性が高く、gdb はおそらくより実用的なオプションです。

于 2009-09-03T15:37:29.497 に答える
2

Karl Kraft のDebugLogを使用します

于 2009-09-03T15:55:50.900 に答える
2
  1. デバッグするメソッドにシンボリック ブレークポイントを設定します。
  2. スタックを上に移動する必要がある場合 (メソッド呼び出しがどこから来たかを確認するため)、Xcode Debugger を使用するか、それを自動化したい場合は、 を使用してフレームbacktrace nのスタック番号を上に移動します。n
于 2009-09-03T15:35:25.223 に答える
1

申し訳ありませんが、完全な回答はありません。関連する情報だけです。

NSThread は、シンボリック化されていないバックトレースを取得するメソッドを定義しますcallStackReturnAddresses。10.6 では、2 番目と 3 番目の要求を満たす文字列も提供されますcallStackSymbols

呼び出し元オブジェクトのアドレスを取得するのは興味深いことですが、完全に単純ではありません。スタックを調べて、ARM に保存されている通常の場所がある場合は、レシーバー オブジェクトが通常保存されている場所を選択する必要があります。このためには、あなた (または誰か) が ARM の呼び出し規則を理解する必要があります。これはおそらく ARM ABI (アプリケーション バイナリ インターフェイス) のどこかに文書化されています。アームはわかりません。これは i386 では実行可能ですが、実際には ppc では実行できません。

于 2009-09-03T16:02:41.047 に答える
0

backtrace(3) API を使用して、呼び出し元のメソッドまたは関数を見つけることができます。ただし、呼び出し元のオブジェクトがあったとしても、それを取得するのははるかに困難です。

于 2009-09-03T18:01:12.190 に答える