gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:48:10 24 4
gpt4 key购买 nike

我有一些用 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 标志之后(没有该标志它工作正常)。

最佳答案

I know that linking should be with -lgcov

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

The problem occured just after added -rdynamic flag (without that flag it worked properly).

我无法想象 -rdynamic 可能与这个问题有什么关系。一个简单的测试用例表明它以任一种方式工作,因此您关于“它停止工作并添加 -rdynamic”的说法是错误的,或者存在一些更复杂的交互继续(我不会在我的简单测试中重现)。

你可能想开始

  1. 验证实际上在不使用 -rdynamic 的情况下重新链接 server.exe 作为唯一更改使其再次工作。
  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

关于c++ - 添加 -rdynamic 标志后,gcov 停止生成 gcda 文件(__gcov_flush() 通过 gdb 调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11364090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com