2009-03-11 8 views
1

すべてのC関数にエントリログと終了ログを追加する必要がありますか?Cの自動エントリ終了トレース

関数の入力と終了を自動的に書く方法があります(Javaでのアスペクト指向プログラミングを使用した自動入力/終了に似ています)。

私が書いているアプリケーションはタイムクリティカルであり、各関数の入口/出口ステートメントを追加すると、パフォーマンスが遅くなる可能性があり、コードが読み込み不能になる可能性があります。

+0

どのような目的でこれをしたいですか?プロファイリングまたはデバッグ? – epatel

+0

これは実際には非常に興味深いトピックです。 Cのアスペクト・プログラミングのラインに沿って何かをサポートするのに十分な魔法があるようです...誰が知っていますか? –

+0

私はコーディングを始めたばかりなので、目的はデバッグです。しかし、後の段階で私はプロファイリングのためにこれを必要とするかもしれません。 –

答えて

2

Cは、イントロスペクションのいずれかの形式をサポートしたり、実行時にまたは仮想マシン上の魔法を通じて自動的ものをやっていません。仮想マシンはなく、ランタイムサポートは、基本的に標準機能を提供する「デッド」コードのライブラリです。

Subtwoが指摘しているように、(ログの入力/終了のような)何かをしたいのであれば、それは行われなければならず、時間がかかるでしょう。

標準のプロファイラでは、プログラムを統計的にサンプリングして実行する機能を確認することができますが、それはわかりませんが、その罰金を隠すことはできません。呼び出し順序、サンプルがサンプリングされたときにプログラムがコードを実行していたランダムな場所だけです。

これは、プリプロセッサのトリッキーに頼ることができます。これは、ロギングのような「定型化」を行う一般的な方法です。たとえば、各関数の入口/出口にあるマクロを定義します。それでも、マクロを含むことを覚えておかなければならず、ロギングを実行することによるパフォーマンス上のペナルティはもちろん存在します。

1

まず、あなたが何かを記録したいのであれば、それを達成しても時間がかかるでしょう。それはアスペクト・プログラミングや他の何かによるものです。アプリケーションがタイムクリティカルな場合は、デバッグをオン/オフするスイッチが必要です。

更新: チェックアウトhttp://perfinsp.sourceforge.net/hookit_linux.html

+0

Subtwoにはgoogle-fooがあります。ナイスキャッチ。 – dmckee

+0

リンクをありがとう。ちょっと見せてください。 –

0

AspectCはアスペクト指向の機能で拡張されたCの変種で、AspectJはアスペクト指向の機能を備えたJavaの変種です。

0

FUNCTIONといくつかのマクロからいくらかのマイレージが出る可能性があります。各機能に入力マクロと終了マクロを追加する必要があります。しかし、少なくとも関数名を再入力する必要はありません。

もしあなたがC++ RAIIであれば、各機能にエントリーマクロが必要です。