为嵌入式目标定制 gccs 代码覆盖率方法

问题描述 投票:0回答:1

我需要在裸机中的几个资源非常有限的设备中进行代码覆盖。

当我尝试启用这个功能时,我的内存使用量会加倍,并且代码大小会爆炸,没有任何合适的东西。

它的功能无法使用,因为在 gcc 中实现它不适合

gcc 似乎正在创建一个小型数据结构来保存信息,然后当应用程序退出时,它将数据转储到文件中。

抱歉,我的目标没有文件系统,因此无法工作,我需要它在我的板上的目标中工作,而不是在模拟器中工作(尝试为 itq 处理程序等进行代码覆盖)

我认为可行的是在生成的代码中的每个有趣的点插入一系列函数调用

示例:在 if 语句中,我需要记录 if 何时为 true,何时为 false。

所以如果我创建 2 个函数: _gcc_condition_true() 或 _gcc_condition_false() 也许还有两个:_gcc_func_enter() 和 _gcc_func_exit()

这些将返回 void 并采用 void 参数

我可以轻松地在我的嵌入式目标上实现这些。

例如,在大型arm64上 - 我可以使用系统跟踪模块,或者在coretexM上使用单线跟踪(SWV),甚至高速同步uart,或者以高速(例如100mhz)运行的简单spi接口)

例如,spi 或 uart 接口可能输出 4(或 5)个字节,即 ascii T、F(真/假)或 E 或 X(输入退出),后跟 32 位返回地址。如果代码大小不大我可以使用地址的低24位和高8位作为原因代码

在外部,我使用 ddr 捕获一些多么小的 fpga 数据……然后重建覆盖范围所需的调用流程。

另一个困难的部分是我需要构建 10-20 个不同的仪器测试应用程序,因为整个东西不适合设备(即:我有 256k 总闪存和 20-30k 内存,没有其他芯片,这个芯片是我的唯一的解决方案,我需要覆盖硬件驱动程序

这个想法是外部进程将通过“addr2line”操作将调用映射回源代码。因此我可以创建一个记分板,其中包含已测试和尚未测试的内容

关于如何或在 gcc 内部从哪里开始黑客攻击的任何想法…距离我上次黑客攻击 gcc 内部已经有 15 年了,它已经发生了很大的变化…

我需要对以下对象执行此操作:cortexm3、m4、arm64、riscv 和 xilinx microblaze 目标。

没有任何商业广告可以与之相媲美……它们只支持不支持我的目标的 Linux 应用程序或模拟。

gcc code-coverage gcov gprof
1个回答
0
投票

正如您所指出的:除了文件系统(及其缺乏)问题之外,由于所有计数器更新、这些更新创建的内存流量、各种回调等,您将看到代码大小的大幅增加和循环性能的下降。 所有这些可能意味着 a) 您的代码不适合,b) 即使它适合,您也不会满足 HRT 约束。 子集化可能不会解决 HRT 问题,并且会由于代码更改而产生一系列与聚合和执行差异相关的新问题(例如,因为您由于不同的 HRT 违规而采取了不同的路径)。

有两种选择:

  • 考虑 ASM 覆盖范围(而不是源覆盖范围)。 你可能会也可能不会很容易地从国际空间站获得这个信息。 一般来说,您很难将 ASM 映射回源(例如,由于内联、展开、推测执行等)
  • 使用您的 Hostsim 环境,并测量那里的源覆盖率。 这也不理想,因为您可能不会/无法对中断和时序相关事件进行建模。

这里真正的问题是你的目标是什么。 如果您有一个完美运行的工具/环境/完全符合您的要求:它做了什么? 您想回答哪些问题/根据这些问题的答案您计划采取哪些行动?

如果覆盖范围只是一个复选框项目……那么您做什么并不重要。 为您可以运行的任何方法提出一个听起来合理的理由,并解释为什么您得到的数字符合您的项目阈值。 (也许某些人工智能系统可以为你写下这个理由。)

如果您有真正的项目目标:那么这可能是一个(更长)更长的讨论。

© www.soinside.com 2019 - 2024. All rights reserved.