gccオプション-finstrument-functionsを使用して、プログラムの関数の呼び出しスタックを取得したいと思います。
典型的なコード
void __cyg_profile_func_enter (void *, void *) __attribute__((no_instrument_function));
void __cyg_profile_func_exit (void *, void *) __attribute__((no_instrument_function));
int depth = -1;
void __cyg_profile_func_enter (void *func, void *caller)
{ }
void __cyg_profile_func_exit (void *func, void *caller)
{ }
int main()
{
printf("Hello world");
return 0
}
gcc-finstrument-functionstest.cを使用してコンパイルします
./a.outを実行し、すべてOKです。
しかし、g ++でそれを行ったとき、__cyg_profile_func_enter関数への未定義の参照を取得しました。_cyg関数はCコードの一部であり、C ++で使用する場合は、extern "C"を使用する必要があるため、最終的なコードがあります。
extern "C"{
void __cyg_profile_func_enter (void *, void *) __attribute__((no_instrument_function));
void __cyg_profile_func_exit (void *, void *) __attribute__((no_instrument_function));
int depth = -1;
void __cyg_profile_func_enter (void *func, void *caller)
{ }
void __cyg_profile_func_exit (void *func, void *caller)
{ }
}
int main()
{
printf("Hello world");
return 0
}
g ++ -finstrument-functions test.cでコンパイルし、実行しようとしましたが、コアダンプされたエラーメッセージが表示されました。gdbでダンプをトレースしましたが、__ cyg_profile_func_enter()でセグメンテーション違反が発生しました。
GCCバージョンは2.95.4です。また、4.4.3とすべてOKでテストしました。では、2.95.4 gccを使用してこの問題を回避する可能性はありますか?