我有以下问题,从系统的角度来看,想知道如何轻松有效地实现这一目标。
给定一个使用调试信息构建的任务'abc'和一个通常设置为0的全局变量“TRACE”,我想打印到文件'log'之间调用的每个函数的地址TRACE设置为1并再次返回0的时间。
我正在考虑通过我开发的前端加载/启动捆绑任务来执行此操作,该任务查看跳转/帧指针推送的常见模式的指令,写下地址然后将地址映射到函数名称来自abc中的符号调试信息。虽然没有前端加载器,但可以采用更好的系统级方法来实现这一点,而且我不确定什么是最可行的。
那里有任何已实施的技术吗?
答案 0 :(得分:3)
一种可能性是在编译源之前对源进行预处理。此预处理将在每个函数的开头添加代码,以检查TRACE全局,如果设置,则写入日志。正如Mystagogue所说,编译器具有扩展到函数名称的预处理器宏。
您还可以查看一些分析工具。其中一些功能接近您所要求的功能。例如,有些人会定期对整个callstack进行采样,这可以告诉你很多代码流,而无需实际记录每次调用。
答案 1 :(得分:2)
在存在帧指针省略和尾调用优化的情况下,寻找共同的序言/结尾将不起作用。此外,现代优化器喜欢将函数分成几个块并合并不同函数的常见尾部块。
没有标准解决方案。
对于Microsoft编译器,请查看_penter和_pexit挂钩。对于GCC,请查看-finstrument-functions选项和朋友。
此外,在x86 Windows上,您可以使用WinApiOverride32等监视器。它主要用于监视DLL和系统API调用,但您也可以从应用程序的映射文件生成描述文件,并监视内部函数。
(已编辑:已添加指向GCC选项的链接。)
答案 2 :(得分:1)
确保您已查看__func__或__FUNCTION__预定义标识符。它们提供了当前正在执行的函数/方法名称的字符串文字。