假设一个名为xmpl.cpp
的源文件(例如the one described by Fröhlich)。使用标记为gcc
和-fprofile-arcs
的{{1}}编译此文件时,它会生成通常的二进制可执行文件-ftest-coverage
和gcov数据文件xmpl
。然后,当程序执行时,会生成另一个gcov数据文件xmpl.gcno
,该文件包含执行期间收集的信息。
但是,当我使用expect脚本运行相同的程序时,不会生成xmpl.gcna
。更具体地说,问题在于xmpl.gcna
命令,spawn
一切都很好(但是,为什么要使用expect,对吧?)。
我有兴趣解决这个问题,因为我们有许多期望脚本在我们的项目中执行一些测试,目前没有为这些测试生成覆盖信息。可以获取上述示例的代码here。
答案 0 :(得分:1)
spawn
和exec
都会创建一个执行程序的新进程。 The difference between them是exec
暂停执行TCL(Expect)直到执行完成。由于程序在使用spawn
运行程序时从未达到“自然结束”,因此无法生成覆盖信息。
要解决此问题,必须等到子流程完成后再让expect脚本结束执行,这可以通过期望eof
来实现。这就是期望脚本的样子:
#!/usr/bin/expect -f
spawn ./xmpl Hey! xxx
expect eof