我有一些用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
标志之后。(没有该标志,它可以正常工作)。
-rdynamic
标志后,已生成覆盖率。我将使用readelf
进行实验,但当我编译它时,nm
显示'__gcov_flush'在server.exe
中定义(因此使用__gcov_flush应该可以工作...)。 - ddzialak-rdynamic
与问题有什么关系 - 是的,这是我的主要问题 - 请注意,还有其他正常结束并生成正确 gcda 文件的二进制文件。 我认为-rdynamic
只是导致某种方式通过gdb
调用__gcov_flush
不起作用...但不知道为什么(?) - ddzialak