【问题标题】:gcov not generating gcda filesgcov 不生成 gcda 文件
【发布时间】:2012-04-18 04:00:40
【问题描述】:

我尝试使用 -fprofile-arcs-ftest-coverage 运行 gcov,但没有任何链接。

它给出了这个错误:-

 hidden symbol `__gcov_init' in /home/mojave/tools/gcc-4.4.1/amd64/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.4.1/libgcov.a(_gcov.o) is referenced by DSO

然后程序退出。

编译命令-

bsub -g /mojave/build/"DummyDate" -J compile-obj/linux24rhel3_x86_64_GCOV64/DXp.o -I -q DFM -S 8192 -R "(model==OPTERON_250)" '/usr/bin/time --format="          ...finished DXp [`hostname`] [%E s with %P CPU]"  /home/mojave/tools/gcc-4.4.1/amd64/bin/g++ -fPIC -Wall -Wno-deprecated -DTCL_8_5 -m64 -march=opteron -DLITTLE_ENDIAN_PLATFORM -DARCH=amd64 -DARCH_amd64 -DARCH_BITS=64 -DARCH_BITS_64 -fsigned-char -msse3 -D__DISABLE_MULTITHREAD__ -D_CPP_NUMERIC_LIMITS -mfpmath=sse,387 -mmmx -m3dnow -pipe -Dgcc -DLICENSE_ALWAYS_GOOD -I/home/mojave/tools/flexlm/include/v8.4 -DNO_SUPPORT_STABIE -DGCOV -I../dxpclient -I/home/mojave/tools/bzip2-1.0.2/amd64/include -I/home/mojave/tools/zlib-1.2.3/amd64/include -I/home/mojave/tools/tcltk8.5.2/amd64//include -I/home/mojave/tools/tcltk8.5.2/amd64//include -g -fprofile-arcs -ftest-coverage -DBUILD_DATE=\""UNSET"\" -DVERSION_NUMBER=\"Dum.Dum.Dum.Dummy\" -DEXT_VERSION_NUMBER=\"Dum.Dum.Dum.Dummy\" -DLAST_RELEASE_VERSION=\"1.1614\" -Wreturn-type -DTCL_8_5 -DGOOGLE_MALLOC -L../dx/linux24rhel3_x86_64_GCOV64/ -ldx -o obj/linux24rhel3_x86_64_GCOV64/DXp obj/linux24rhel3_x86_64_GCOV64/DXp.o -Wl -lgcov /home/mojave/tools/zlib-1.2.3/amd64/lib/libz.a  -L/home/mojave/tools/bzip2-1.0.2/amd64/lib -lbz2    -ldl'

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 你能告诉我们Makefile或编译字符串吗?您很有可能将配置文件标志附加到错误的目标对象。

标签: gcc gcov


【解决方案1】:

我刚刚发现,如果我向我的程序发送 sig kill 或 sig term,则只会生成 GCNO 文件,没有 gcda 文件。

【讨论】:

  • 那么是否有任何信号退出进程并保留生成 .gcda 文件,例如SIGHUP 还是 SIGINT?
  • @Melebius 我刚遇到同样的问题,发现:this。使用链接中描述的 SIGTERM 和 handling sigterm 对我有用。
【解决方案2】:

使用-fprofile-arcs-ftest-coverage 编译。在生成共享对象期间与-lgcov 链接。它会起作用的。

您也可以使用--coverage 选项作为所有三个步骤的同义词

查看:gcc instrumentation options 了解更多信息

【讨论】:

  • 注意:使用--coverage 编译和链接会自动转换为您提供的标志。这是 gcc 提供的一种便利,使事情变得更容易。也是面向未来的。享受吧!
  • 我尝试了这个命令,但仍然没有 gcda 文件输出:g++ -fprofile-arcs -ftest-coverage -lgcov main.cpp我还有什么遗漏吗?
  • @naive231 我个人遇到了这个问题,因为我在 main 方法的末尾有一个 for(;;) 无限循环。程序需要退出才能正确生成 gcda 文件。
  • 即使这一切设置正确,Eclipse 也可能需要运行二进制文件来生成要生成的 .gcda 文件。如果您只看到 .gcno 文件,这可能就是您的情况。
【解决方案3】:

考虑编译标志后,如上面crazy_prog所说, 检查“路径”。在使用 lcov/gcov 进行覆盖时,路径起着重要作用。

因此,您创建二进制文件的路径(完整路径字符串)和运行二进制文件的路径应该完全相同。

出于我的目的,由于二进制文件的创建和二进制文件的执行在不同的地方(一个在开发环境中,另一个在实际板中),所以使用软链接/快捷方式,我创建了类似的路径,因此运行可执行。最后,可以在开发环境中生成报告(通常,因为板载的实际平台可能不支持 lcov 工具)。

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 2020-12-01
    • 2011-06-06
    • 2011-04-12
    • 2016-04-09
    • 2014-07-18
    • 2014-05-30
    • 2012-07-07
    相关资源
    最近更新 更多