0

詳細を知りたくないフレームワークを開発したいと思っています。

iPhoneアプリケーションに1000以上のメソッドを持つ100以上のクラスがあるとします。このシナリオでは、各クラスの各メソッド(開始時または終了時、あるいはその両方)にNSLogを追加します。

NSLogを手動で追加することは可能ですが、より良い解決策はありますか?手作業をしなくてもこのログを追加できるような方法でアプリケーションを構築するようなものです。

よろしくお願いいたします。


デニス、

あなたの答えは多くのフォーラムで最も役に立ちました。どうもありがとう。

私がこのようなものを探している理由は、多くのクライアントプロジェクトがあり、QAおよびUAT中にクラッシュやその他の問題が発生することがよくあるためです。それらの約80%は再現性がないか、特定のシナリオを必要とします。このような問題を追跡するために.crashとdsymを使用していました。しかし、そのようなシナリオではそれほど有用ではありません。

私が探しているのは、そのような問題を簡単に再現できるように、ユーザーが実行した手順をログに記録するaddhocビルドを提供することです。

現在、私はプリコンパイル済みヘッダーとあなたが言及した最初の方法を使用しています(最初の開始中括弧を検索してからマクロに置き換えます)。

あなたが言ったように、私はDTraceとobjc_msgSendを調べます。その間、私はこれらをグーグルで検索します。あなたが好きなチュートリアルを持っているなら、それは素晴らしいでしょう。

ありがとう、よろしく、:D

4

1 に答える 1

1

では、コードにトレース機能を追加したいですか?

Appleはこのようなものを提供していません。トレース機能は自分で追加する必要があります。ソースコードのスタイルに一貫性がある場合、これは比較的簡単に自動的に実行できる可能性があります。たとえば、マイナス(またはプラス)記号で始まる行に続く最初の開始中括弧を検索するようなものです...

または、パブリックObjective-Cランタイム関数を使用して、すべてのクラスとそのすべてのメソッドを列挙してNSLogから、元のクラスにジャンプする前に、各クラスを別のクラスでメソッドスウィズルすることもできます。

または、のオープンソース実装を使用して、最初objc_msgSendにへの呼び出しを挿入することもできますNSLogobj_msgSendメソッドへの末尾呼び出しに注意してください。これにより、戻り時に呼び出しを追加できなくなります。もちろん、膨大な出力に備えてください。NSLogへの呼び出しを、セレクター・パラメーターの値objc_msgSend(共通プレフィックスなど)に条件付けることができます。

最後に、トレースする最良の方法は、おそらくDTraceプローブをへのエントリに接続することobjc_msgSendです。上記と同じ末尾呼び出しの理由により、DTraceプローブをそのリターンに接続することはできません。

しかし、より良い質問は、なぜそれをしたいのかということです。

于 2011-09-24T13:44:02.357 に答える