gcov在添加-rdynamic标志后停止生成gcda文件(通过gdb调用__gcov_flush())

时间:2012-07-06 14:24:04

标签: c++ gdb gcov

我在c ++中有一些服务器(从build-system获取的命令):

g++ -o obj/server.o -c -m64 -isystem/opt/boost/include -Wall -Werror -march=core2 -ftest-coverage -fprofile-arcs -DGCOV_ENABLED= -Iinclude -I/opt/hydraOST/lzopro/include -I/usr/include/libxml2 -Idaemon/include src/server.cpp

g++ -o bin/server.exe -rdynamic -ftest-coverage -fprofile-arcs -m64 -Wl,-rpath=\$ORIGIN -Wl,-rpath=/opt/hydraOST/lzopro/lib  obj/server.o (+ other libs)

因为它是守护进程而且我用信号停止它但在kill $PID之前强制转储gcov数据我正在使用 gdb

gdb -p $PID -batch -x gcov/dumpGcovData

gcov / dumpGcovData 的内容:

call __gcov_flush()
thread apply all call __gcov_flush()

我知道链接应该是-lgcov,但因为它以这种方式工作所以我没有在构建系统中更改它。在添加-rdynamic标志(没有该标志后,它正常工作)之后发生了问题。

2 个答案:

答案 0 :(得分:1)

  

我知道链接应该是-lgcov

这是不正确的:gcc会自动添加-lgcov给你的旗帜;没有明确的-lgcov

  

在添加-rdynamic标志之后发生了问题(没有该标志它正常工作)。

我无法想象-rdynamic可能与此问题有什么关系。一个简单的测试用例表明它以 的方式工作,因此您对“它停止使用添加-rdynamic”的说法是错误的,或者存在一些更复杂的交互(其中我没有在我的琐碎测试中复制。)

您可能希望从

开始
  1. 确认实际上重新链接server.exe而不-rdynamic作为更改会使其再次发挥作用。
  2. 显示g++ -o bin/server.exe ... -Wl,-y,__gcov_flushreadelf -s bin/server.exe | grep __gcov_flush的输出。这是它应该是什么样子:

    g++ -ftest-coverage -fprofile-arcs cov.c -g -rdynamic -Wl,-y,__gcov_flush
    /usr/lib/gcc/x86_64-linux-gnu/4.4.3/libgcov.a(_gcov.o): definition of __gcov_flush
    
    readelf -s a.out | grep gcov_fl
    66: 00000000004023c0   131 FUNC    LOCAL  HIDDEN   14 __gcov_flush
    

答案 1 :(得分:1)

添加-Wl,-y,__gcov_flush后,它打印出来的行(并且标记-rdynamic无关紧要):

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/libgcov.a(_gcov.o): definition of __gcov_flush

不幸的是,看起来-rdynamic标志不会影响输出:

with -rdynamic

readelf -s server.exe | grep gcov_flush
  1203: 0000000000808370   107 FUNC    LOCAL  HIDDEN   12 __gcov_flush

没有-rdynamic

readelf -s server.exe | grep gcov_flush
  1203: 0000000000808380   107 FUNC    LOCAL  HIDDEN   12 __gcov_flush

无论如何,我有一个非常简单的解决方案(或者更确切地说是解决方法):如果它的构建不适用于gcov,则只添加-dynamic:

if CONFIG == gcov:
    addFlags(["-ftest-coverage", "-fprofile-arcs"])
else:
    addFlags(["-rdynamic"])

所以,主要问题似乎是未解决,无论如何得到了一些解决方法(对我有用,因为我宁愿不使用gcov配置进行调试 - 仅用于生成覆盖率报告)。无论如何,谢谢你的帮助!