是否有编译器功能来注入自定义函数入口和退出代码?

时间:2009-09-24 16:23:38

标签: c

目前使用VS2005在Windows上编码(但不介意知道是否有其他编译器和平台的选项。我最感兴趣的是OSX作为替代平台。)我有一个C(没有C ++)程序而且我我想做以下事情......

给定一个功能,比如......

int MyFunction(int myparam)
{
   // Entry point.
   ...
   // Exit point.
   return 1;
}

我想在入口点和出口处放一段代码。但是,我宁愿不必修改已经存在的100个函数。有没有办法定义编译器将为我的所有函数注入的函数入口和退出代码,而无需全部修改它们?

我找到或尝试过的大多数解决方案都需要我编辑每一个功能,这是很多工作。我认为其他人必须已经打过这样的东西并解决了它。在我怀疑的这个要求中,我不能独一无二。

4 个答案:

答案 0 :(得分:8)

它是特定于Microsoft的,但您可以在进入和退出函数时挂钩_penter_pexit函数来执行某些操作 - 您必须使用一些特殊标志来编译项目。

a little bit of a tutorial here,您可以在Google上找到有关如何使用它们的更多结果。此外,this blog post详细介绍了您需要做的程序集,以避免在进入和退出时弄乱堆栈。

答案 1 :(得分:6)

GCC具有-finstrument-functions标志,允许您定义将在每个函数调用的开头和结尾调用的两个函数:

void __cyg_profile_func_enter(void *this_fn, void *call_site);
void __cyg_profile_func_exit(void *this_fn, void *call_site);

答案 2 :(得分:1)

您正在寻找名为aspect oriented programming或AOP的内容。

这不是C(或C ++)本身支持的东西。 C的链接页面上列出了一些基于库的实现(虽然我不知道它们有多成熟/有用)

答案 3 :(得分:0)

OpenWatcom C和C ++编译器具有-ee和-ep参数:

-ee           call epilogue hook routine
-ep[=<num>]   call prologue hook routine with <num> stack bytes available

它们将使编译器发出对__EPI和__PRO用户定义的钩子例程的调用。

还有

-en           emit routine names in the code segment

将在生成函数序言序列之前将函数名称作为字符串发布到目标代码中。可能对__PRO例程有用。

这些和其他编译器选项中的更多信息可以在http://openwatcom.org/index.php/Manuals

的其他手册中找到的C / C ++用户指南中找到。