为什么在运行带有"期望"的程序时不生成'gcov'数据?

Why 'gcov' data isn't generated when running program with 'expect'?

本文关键字:数据 gcov 行带 运行 期望 程序 为什么      更新时间:2023-10-16

假设一个名为xmpl.cpp的源文件(例如Fröhlich描述的文件)。当使用带有标志-fprofile-arcs-ftest-coveragegcc编译此文件时,它在通常的二进制可执行文件xmpl和gcov数据文件xmpl.gcno中生成。然后,当程序被执行时,生成另一个gcov数据文件xmpl.gcna,该文件包含在执行期间收集的信息。

但是,当我使用expect脚本来运行相同的程序时,不会生成xmpl.gcna。更具体地说,问题出在spawn命令上,exec一切都很好(但是,为什么要使用expect,对吧?)。

我对解决这个问题很感兴趣,因为我们有很多期望的脚本在我们的项目中执行一些测试,而目前还没有为这些测试生成覆盖率信息。上面描述的示例的代码可以在这里获取。

spawnexec都创建了一个新进程来执行程序。它们之间的区别在于exec暂停TCL(Expect)的执行,直到执行完成。由于在使用spawn运行程序时,程序从未达到其"自然结束",因此无法生成覆盖范围信息。

要解决这个问题,必须等到子流程完成后,才能让期望的脚本结束执行,这可以通过期望eof来实现。这就是预期脚本的样子:

#!/usr/bin/expect -f
spawn ./xmpl Hey! xxx
expect eof