Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gcovr排除的问题_C++_Code Coverage_Gcovr - Fatal编程技术网

C++ gcovr排除的问题

C++ gcovr排除的问题,c++,code-coverage,gcovr,C++,Code Coverage,Gcovr,我在一个源代码外版本上运行gcovr(3.3),如: gcovr--root=/path/to/source--object directory=/path/to/build 现在我想从报告中排除两种不同的内容: 1) 名称中包含“Test”的任何.cpp文件 --exclude='.*Test.*'似乎不起作用 2) 目录中的所有源文件(例如/path/to/source/MyModule/) --exclude='/path/to/source/MyModule/*'似乎不起作用 --exc

我在一个源代码外版本上运行gcovr(3.3),如:

gcovr--root=/path/to/source--object directory=/path/to/build

现在我想从报告中排除两种不同的内容:

1) 名称中包含“Test”的任何
.cpp
文件

--exclude='.*Test.*'
似乎不起作用

2) 目录中的所有源文件(例如
/path/to/source/MyModule/

--exclude='/path/to/source/MyModule/*'
似乎不起作用

--exclude directories='/path/to/source/MyModule'
似乎也不起作用

我的问题

a)
--exclude directories
的作用是什么,因为您似乎(应该)能够通过传递给
--exclude
的正确正则表达式排除目录


b) 关于
--exclude
不能按预期工作的原因,有什么建议吗?也许这些不是正确的正则表达式类型/样式?

这两个选项都没有很好的文档记录,因此主要的知识来源是

a) 什么是--exclude目录,因为您似乎(应该)能够通过传递给--exclude的正确正则表达式排除目录

--排除目录
选项,gcovr使用该选项按名称而不是完整路径跳过目录。如果您检查gcovr的源代码,就可以对其进行验证。魔法在
def link\u walker(路径)
功能中完成:

    for root, dirs, files in os.walk(
        os.path.abspath(path), followlinks=True
    ):
        for exc in options.exclude_dirs:
            for d in dirs:
                m = exc.search(d)
根据文档,
dirs
是子目录名称的列表。例如,要跳过以
MyMod
开头的所有目录,请使用
--exclude directories='MyMod.*'

b) 关于--excludes不能按预期工作的原因有什么建议吗?也许这些不是正确的正则表达式类型/样式

您的正则表达式是正确的。这是典型的Python正则表达式

要了解
--exclude
选项的情况,启用
-v
输出非常有用。启用此选项后,输出应有许多行:

currdir      /cygdrive/f/test/path/to/source
gcov_fname   myfile.cpp.gcov
           ['        -', '    0', 'Source', 'myfile.cpp\n']
source_fname /cygdrive/f/test/path/to/source/myfile.gcda
root         /cygdrive/f/test/path/to/source
fname        /cygdrive/f/test/path/to/source/myfile.cpp
Parsing coverage data for file /cygdrive/f/test/path/to/source/myfile.cpp
此输出由函数生成。如果检查源代码,您将看到以下内容:

for exc in options.exclude:
    if (filtered_fname is not None and exc.match(filtered_fname)) or \
            exc.match(fname) or \
            exc.match(os.path.abspath(fname))
排除过滤器适用于上面打印的
fname
。这是绝对文件路径。它还适用于包含覆盖率数据的所有文件。如果文件被排除在外,则输出中应包含以下行(
-v
需要选项):


谢谢你的解释。两个小问题:1)我仍然不明白
--exclude='.*/MyMod.*'
--exclude directories='MyMod.*'
之间的区别?2) 你能解释一下
--exclude
--gcov exclude=
之间的区别吗?2)
--gcov exclude
排除gcov数据文件。它适用于
myfile.cpp.gcov
文件
--exclude
exclude
cpp
文件。但是每个
.cpp
文件不是只有一个
.gcov
文件吗?当然可以,但是您可以创建正则表达式来匹配文件夹(类似于
--exclude='.*/MyModule/*.
),对吗?所以我猜这真的是个帮手?我只是我只是想确保我的判断正确,你可以用
--exclude directory
做任何事情,你也可以用
--exclude
和适当的正则表达式来做。@RamkumarD
--exclude
标志可以多次使用:
Excluding coverage data for file /cygdrive/f/test/path/to/source/myfile.cpp