繁体   English   中英

C / C ++关于跟踪编程技术的问题

[英]C/C++ Question about trace-programming techniques

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

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

我正在考虑通过我开发的前端加载/启动捆绑任务来执行此操作,该任务查看跳转/帧指针推送的常见模式的指令,写下地址,然后将地址映射到符号的函数名称在abc中调试信息。 虽然没有前端加载器,但可以采用更好的系统级方法来实现这一点,而且我不确定什么是最可行的。

有没有实施过的技术?

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

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

在存在帧指针省略和尾调用优化的情况下,寻找共同的序言/结尾将不起作用。 此外,现代优化器喜欢将函数分成几个块并合并不同函数的常见尾部块。

没有标准的解决方案。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM