0

-finstrument-functionsgcc のオプションとこの (簡略化された) コードを使用して、トレース動作を実装しました。

void __cyg_profile_func_enter(void *this_fn, void *call_site)
{
    Dl_info di;
    if(dladdr(this_fn, &di))
        printf("entered %s\n", (di.dli_sname?di_dli_sname:"<unknown>"));
}

これはうまく機能しますが、1 つのことを除いては、マクロも処理されますが、関数はマクロを含む関数の情報を出力します。

そのため、マクロを含む関数では、その情報が複数回出力されます (これはもちろん望ましくありません)。

マクロが処理されていることを検出するものはありますか? または、計測マクロをまったくオフにすることは可能ですか?

PS同じ問題が発生しますsizeof()

編集:明確にするために:マクロがインストルメント化された機能をいじるのを防ぐための解決策を探しています(これはすべきではありません)。マクロ、関数、および/またはその他のものをトレースするメソッドではありません。

4

2 に答える 2

1

本当に掘り下げたい場合は、c++ コード サイズの内訳に対する私の回答をご覧ください。C++ テンプレートは、実際にはより形式的なマクロにすぎないため、これでうまくいく場合があります。

マクロ内のLINEFILEは呼び出し元に対応するため、そうでない場合もあります。

これに関する私のコメントから編集:

$ gcc -E foo.c | gcc -x c-cpp-output -c -finstrument-functions - -o foo.o

標準入力で前処理された入力を期待して gcc にパイプされた前処理

于 2010-04-08T16:03:05.290 に答える
1

マクロはプリプロセッサによってインラインで展開されるため、コードから直接呼び出された関数とマクロから呼び出された関数を区別する方法はありません。

これを回避する唯一の方法は、マクロにグローバル フラグを設定することです。これは、トレース関数によってチェックされます。もちろん、マクロから呼び出された関数によって行われた呼び出しも同じように表示されるため、これは絶対確実というわけではありません。

于 2010-04-08T15:56:21.360 に答える