我想使用 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-functions test.c 编译它
运行./a.out,一切正常。
但是当我使用 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 编译,然后尝试执行它但得到 Core dumped 错误消息。我用 gdb 跟踪转储,__cyg_profile_func_enter() 中存在分段错误。
GCC 版本是 2.95.4。我还在 4.4.3 上对其进行了测试,一切正常。那么使用 2.95.4 gcc 是否可以解决这个问题?