6

我有以下问题,从系统的角度来看,我想知道如何轻松有效地实现这一目标。

给定一个使用调试信息构建的任务“abc”和一个通常设置为 0 的全局变量“TRACE”,我想打印出文件“记录”在该时间之间调用的每个函数的地址TRACE 设置为 1 并再次设置为 0。

我正在考虑通过我开发的前端加载/引导任务来执行此操作,该任务查看跳转/帧指针推送的常见模式的指令,写下地址,然后将地址映射到符号中的函数名称abc 中的调试信息。不过,如果没有前置加载器,可能会有更好的系统级方法来做到这一点,我不确定什么是最可行的。

那里有任何实施的技术吗?

4

3 回答 3

3

一种可能性是在编译源之前对其进行预处理。此预处理将在每个函数的开头添加代码,以检查 TRACE 全局,如果设置,则写入日志。正如 Mystagogue 所说,编译器具有扩展为函数名称的预处理器宏。

您还可以查看一些分析工具。其中一些具有接近您要求的功能。例如,有些会定期对整个调用堆栈进行采样,这可以告诉您很多有关代码流的信息,而无需实际记录每个调用。

于 2010-08-30T17:58:30.677 回答
2

在帧指针遗漏和尾调用优化的情况下,寻找一个共同的序言/尾声是行不通的。此外,现代优化器喜欢将函数拆分为多个块,并合并不同函数的公共尾部块。

没有标准的解决方案。

对于 Microsoft 编译器,请查看_penter_pexit挂钩。对于 GCC,请查看-finstrument-functions选项和朋友。

此外,在 x86 Windows 上,您可以使用诸如WinApiOverride32 之类的监视器。它主要用于监视 DLL 和系统 API 调用,但您也可以从应用程序的映射文件生成描述文件并监视内部函数。

已编辑:添加了 GCC 选项的链接。

于 2010-08-30T17:59:39.587 回答
1

确保您已查看 __func__ 或 __FUNCTION__ 预定义标识符。它们提供您当前正在执行的函数/方法名称的字符串文字。

于 2010-08-30T17:37:24.577 回答