gcc -fprofile-arcs:如何在自定义 RTOS 上输出文件

Posted

技术标签:

【中文标题】gcc -fprofile-arcs:如何在自定义 RTOS 上输出文件【英文标题】:gcc -fprofile-arcs: how to output a file on custom RTOS 【发布时间】:2017-12-07 23:56:35 【问题描述】:

gcc 有一个 bunch of options ,可用于运行时分析,在程序执行期间产生输出。

例如:gcc -fprofile-arcs

添加代码以便检测程序流弧。执行期间 程序记录每个分支和调用执行了多少次 以及被拿走或返回的次数。关于支持的目标 具有优先级支持的构造函数,分析正确处理 的构造函数、析构函数和 C++ 构造函数(和析构函数) 用作全局变量类型的类。

当编译的程序退出时,它将此数据保存到一个名为 每个源文件的 auxname.gcda。数据可用于 配置文件导向优化(-fbranch-probabilities),或用于测试 覆盖分析(-ftest-coverage)。每个目标文件的 auxname 是 从输出文件的名称生成,如果明确指定 并且它不是最终的可执行文件,否则它是 源文件。在这两种情况下,任何后缀都会被删除(例如 foo.gcda 对于输入文件 dir/foo.c,或 dir/foo.gcda 对于指定为的输出文件 -o dir/foo.o)。

我正在运行一个没有文件系统的自定义 C++ RTOS,因此程序无法使用与 Linux/Windows/QNX 上相同的机制“保存”数据,如 粗体 字所示.

问题

如果可能,我如何在没有文件系统的自定义 RTOS 上使用 -fprofile-arcs(或任何其他生成文件的运行时分析选项)?

是否可以通过提供“作家”类来重定向信息?如果是这样,我可以使用任何可用的接口(如 JTAG)将数据流式传输到 PC。

说到调试器,是否可以使用gdb 和JTAG 连接来以某种方式解决这个问题?

【问题讨论】:

【参考方案1】:

我曾经做过类似的事情——我是在代码覆盖之后。幸运的是,我能够获得 VectorCast 许可证,它可以在编译之前检测源代码并在内存中进行簿记。不记得我是多么仔细地为已检测的 gcc 代码提供存根。

如果您的重点是在 RTOS 嵌入式环境中进行分析,您可以定期记录程序计数器并运行足够长的时间来收集有意义的数据。

【讨论】:

我希望在每个函数进入/退出时触发跟踪。实际上,我已经可以使用gcc -finstrument-functions 做到这一点。我想我只需要想出我自己的存储抽象来存储跟踪信息。

以上是关于gcc -fprofile-arcs:如何在自定义 RTOS 上输出文件的主要内容,如果未能解决你的问题,请参考以下文章

gcc 和 g++/gcc-c++ 有啥区别?

GCC:在 GCC 版本之间伪装

arm gcc 内嵌汇编,gcc该是啥选项呢

gcc编译器究竟怎么打开?我竟然在gcc的安装文件夹中找不到gcc的打开文件?

ubuntu怎么安装gcc

详解Linux安装GCC方法