【问题标题】:gcov not showing any coverage datagcov 未显示任何覆盖率数据
【发布时间】:2012-12-07 02:46:58
【问题描述】:

我正在尝试在 Linux(Ubuntu) 上使用 gcov 来查看每一行源代码的执行频率。

我在我的 gcc 编译器和链接器标志中添加了以下标志,

CCFLAGS =  -fprofile-arcs -ftest-coverage
LDFLAGS = -fprofile-arcs -lgcov

但是在编译和运行程序之后,我没有看到 *.gcda 文件被创建。结果,当我运行时

gcov  --object-directory <path to the *.gcno/*.gcda files> myfile.cpp 

显示错误:

myfile.gcda:cannot open data file, assuming not executed
File '../../../../../code/myfile.cpp'
Lines executed:0.00% of 2625

我错过了什么吗?如何解决这个问题?

【问题讨论】:

  • 程序是否成功运行完成?
  • 另外,运行strings compiled_prog | grep gcda会得到什么?
  • @Shawn - 它是一个不返回的服务/守护进程。所以基本上我必须在终端中对可执行文件进行 CTRL-C 来停止它。这会影响 gcov 的行为吗?我知道 gprof 不会为不退出()的此类进程生成分析数据。 gcov 也有这个限制吗?
  • @Shawn 关于您的第二个 cmets 字符串compiled_prog... 但似乎 gcov 正在寻找一个单独的 gcda 文件,而不是二进制文件中的 gcda 信息。我仍然会检查字符串命令的输出并更新
  • AFAIK,与 gprof 数据一样,覆盖率数据仅在 exit 调用时输出,因此如果应用程序突然终止,您将不会获得输出。至于我的第二条评论,数据文件的输出路径通常嵌入在编译的二进制文件中,因此如果在编译后移动了二进制文件,它们可能不会出现在预期的位置。 (p.s. 这些 cmets 是基于过去的经验。自从我上次摆弄 gcov 以来,情况可能已经发生了变化。)

标签: linux gcov


【解决方案1】:

您可以在代码中使用 __gcov_flush() 方法。 您需要从注册的信号处理程序中调用它。

见:

https://www.osadl.org/fileadmin/dam/interface/docbook/howtos/coverage.pdf

使用它,您可以保持服务运行并在需要转储覆盖数据时发出“kill”。

希望对您有所帮助....

【讨论】:

    【解决方案2】:

    确保 gcov 和 gcc 的版本相同 :),这是很多人无法检查的地方。

    $gcc --version
    gcc (GCC) 4.1.1
    Copyright (C) 2006 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    $ find  /usr/lib/gcc -name libgcov.a
    /usr/lib/gcc/x86_64-redhat-linux/4.1.1/32/libgcov.a
    /usr/lib/gcc/x86_64-redhat-linux/4.1.1/libgcov.a
    /usr/lib/gcc/x86_64-redhat-linux/3.4.6/32/libgcov.a
    /usr/lib/gcc/x86_64-redhat-linux/3.4.6/libgcov.a
    

    所以你加载的 gcc 版本应该至少在 libgcov.a 的可用列表中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2012-05-26
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 2022-11-30
      相关资源
      最近更新 更多