- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我手头有一个带有 cmocka 测试的 C 项目,它是使用 CMake 构建的。现在我尝试使用 gcov 来确定测试覆盖率并使用此 CMake 模块:https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake该模块提供了一个 make 目标,该目标运行测试目标可执行文件(即运行 gcov),然后运行 lcov 和 genhtml 以生成报告。
现在,问题是,当执行测试目标时,它创建的 .gcda 文件只设置了所有者的可执行位,即。 e.读取位丢失。随后,lcov 无法读取这些文件并生成覆盖率为 0% 的报告。当我之后手动 chmod u+r
gcda 文件并手动运行测试后 lcov 命令时,报告已成功生成(显示实际上已覆盖的内容)。因此 gcda 文件已创建且有效,但它们设置了不合适的权限。
问题似乎源于包装(使用 ld --wrap)用于捕获测试用例中返回的文件描述符的 open
函数。这是一个最小的编译示例:
/* wrapped_open.c */
int main(void)
{
return 0;
}
int __wrap_open(const char *filename, int flags)
{
return __real_open(filename, flags);
}
# CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(gcov-mvce C)
add_executable(wrapped_open wrapped_open.c)
target_link_libraries(wrapped_open
-Wl,--wrap=open
)
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_SOURCE_DIR}/cmake")
include(CodeCoverage)
set_target_properties(wrapped_open PROPERTIES
COMPILE_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage"
LINK_FLAGS "-lgcov --coverage")
setup_target_for_coverage(wrapped_open_coverage wrapped_open "coverage")
# build like this:
cmake . -DCMAKE_BUILD_TYPE=Debug # in-source build
make
# receive coverage report like this
make wrapped_open_coverage
# simple gcc command line for compiling (no cmake required)
gcc -g -O0 --coverage -fprofile-arcs -ftest-coverage -lgcov -Wl,--wrap=open -o wrapped_open wrapped_open.c
当 open 的包装和包装函数定义分别从链接器标志和代码中删除时,它就可以工作。但是对于上面的文件,文件 wrapped_open.c.gcda
是使用访问掩码 0100 创建的,lcov 报告了以下内容:
(bulid-directory)/CMakeFiles/wrapped_open.dir/wrapped_open.c.gcda:cannot open data file, assuming not executed
...导致覆盖 0/4 行和 0/2 函数。
为什么打开函数像上面那样包装时访问位是错误的,即使每个路径仍然使用未修改的参数调用原始函数(至少这是它打算做的)?一个明显的解决方法是修改 cmake 模块来为我执行 chmod,但我更想了解包装 open 时出了什么问题。
请在评论中告诉我是否需要以及需要哪些额外信息来回答这个问题。
最佳答案
正如评论中所指出的,open()
是一个具有可变参数的函数。如果创建了文件,则第三个参数是文件的模式。在我的 __wrap_open
实现中,我省略了第三个参数,因为我没有想到除了被测代码之外的其他代码也会调用 open()
。当然,gcov 最终会创建它的 gcda 文件,并且由于我没有指定 __real_open
的第三个参数,因此该模式中有一些未定义的内容。
因此,解决方案是始终在包装函数中包含所有可能的参数。
关于c - 为什么 gcov 生成 gcda 文件时只设置了可执行位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622179/
我使用 gcc -fprofile-arcs -ftest-coverage [filenames] 在一些 .c 文件上运行 gcov 工具。命令 但向该命令提供文件名是一项非常繁琐的工作。 相反,
我可以在 Windows 中安装 gcov 工具吗? 或者我可以在windows的eclipse中使用这个工具的插件吗? 我对这个工具很陌生。我对这个工具没有任何想法。请帮我获取这个工具的信息。 请告
我在 RHEL 上运行 gcov/gcc 4.1.2。 当我想为 gcov 文件指定一个目录时。关于如何执行此操作的任何想法? 最佳答案 从要创建其文件的目录运行 gcov。您必须使用 -o 参数来告
我正在尝试使用 gcov-tool 为多个源文件合并一些现有的覆盖率数据(不是我自己创建的)。但是当我调用 gcov-tool merge dir1 dir2 时,dir1 和 dir2 是包含 .g
我正在运行 gcov 来测量覆盖率,但对于我在 C 代码中使用的每个函数,我都收到“有来自退出 block 的弧”消息。这条消息有什么问题吗?我应该忽略它们吗? 最佳答案 这可能意味着您的 gcno
我正在尝试使用 gcc 4.8.2 和 lcov 1.10 获取 html 覆盖率以进行测试。我确定我的源文件、对象和 gcov 文件位于同一位置,并且我正在从我运行编译器的目录中运行 lcov。 我
我在远程服务器上用 gcov 标志编译了我的源文件。 CFLAGS += -fprofile-arcs -ftest-coverage -lgcov -coverage 编译工作正常。 gcc 4.7
在使用 gcov 支持编译我的项目时,我面临以下错误 以下是我在编译时的标志信息 编译器标志: CXXFLAGS="-Wno-deprecated -g -ggdb -fprofile-arcs -f
我正在尝试在 iPhone 项目上使用 gcov 并遵循 Apple 的说明 here ,但它不起作用。 当我构建并配置项目时,会为每个目标文件创建 .gcda 文件。但没有执行的行记录到 .gcda
我尝试使用 gcov 编译一个简单的应用程序并收到以下链接错误: gcc AllTests.o CuTestTest.o CuTest.o -o TestTest AllTests.o: In fun
资料夹结构 〜/沙盒/ dev 〜/沙盒/测试 我在dev目录中有main.cpp。我使用--coverage标志编译了代码以生成代码覆盖率。 现在,将生成a.out和main.gcno文件。 现在我
我正在使用 gcov 来获取我们项目的代码覆盖率,但它经常报告 50% 的普通函数调用的条件覆盖率。函数是否接受任何参数或返回任何数据都没有任何区别。我在 Jenkins 中使用 gcovr 和 Co
无法使用我的 C/C++ Makefile 项目在 Windows 上使用 mingw32 的 googletest 获取 gcov 覆盖文件完整源代码位于https://github.com/rus
我正在使用 gcov这是我第一次遇到与此 thread 中报告的问题类似的问题.但是,根据该线程中的评论,我无法解决我的问题。 我正在尝试测量 KMyMoney-4.6.4 中具体测试用例的覆盖率,即
我正在使用 eclipse indigo 和 linux 工具。其中一个工具是 gcov 的插件。我有一个项目是 statis lib(点一个文件)和另一个项目是一个单元测试,它与这个 lib 链接并
我在 32 位机器上使用 -fprofile-arcs -ftest-coverage 标志交叉编译我的可执行文件以覆盖。我在 64 位目标机器上运行生成的可执行文件。 当我运行可执行文件时,它不会生
是否可以使用 gcov 进行多线程应用程序的覆盖测试? 我已经对我们的代码库进行了一些简单的测试,但如果能对我们正在实现的覆盖范围有一些了解就更好了。如果 gcov 不合适,任何人都可以推荐一个替代工
我正在使用 gcov 来衡量我贡献的 c++ 库的测试覆盖率。出于某种原因,gcov 无法将许多文件中的行识别为可执行文件。在给定文件的 160 多行中,它会说其中 40 行是可执行的。例如:
MWE #include struct Foo { Foo() { std::cout << "Constructing Foo " << this << std::endl; }
我正在使用 gcov 测量我的 C++ 代码中的覆盖率。我希望能够标记某些源代码行,以便在使用 gcovr 时将它们排除在覆盖率报告之外。我知道它们存在,因为我曾经偶然发现过它们,但现在我找不到看到它
我是一名优秀的程序员,十分优秀!