我在c++中有一些服务器(从构建系统获取的命令):

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标志(没有该标志的,它可以正常工作)后发生了问题。

最佳答案



那是不正确的:gcc会根据您的标记自动添加-lgcov;不需要明确的-lgcov



我无法想象-rdynamic可能与问题有关。一个简单的测试用例表明,它可以以任何一种方式起作用,因此您的“添加了-rdynamic后停止工作”的主张是错误的,或者正在进行一些更复杂的交互(我在这个琐碎的测试中没有再现)。

您可能要开始

  • 验证实际上重新链接server.exe而不将-rdynamic作为唯一更改会使它再次起作用。
  • 显示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
    
  • 10-07 22:28