3

私は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)

それはデーモンであり、シグナルで停止していますが、gdbkill $PIDを使用する前にgcov データのダンプを強制するため:

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

gcov/dumpGcovDataの内容:

call __gcov_flush()
thread apply all call __gcov_flush()

リンクが必要であることは知っています-lgcovが、そのように機能していたので、ビルドシステムで変更しませんでした。フラグを追加した直後に問題が発生しました-rdynamicそのフラグなしでは正常に機能しました)。

4

2 に答える 2

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フラグは出力に影響を与えないようです。

-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用でない場合にのみ-rdynamicを追加してください:

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

したがって、主な問題は解決されていないようですが、とにかくいくつかの回避策があります(デバッグにgcov configを使用しないため、カバレッジレポートを生成するためだけに機能します)。とにかく、助けてくれてありがとう!

于 2012-07-09T10:09:16.203 に答える
1

リンクは-lgcovで行う必要があることを知っています

それは正しくありません: gcc は指定さ-lgcovれたフラグを自動的に追加します。明示的-lgcovな必要はありません。

-rdynamic フラグを追加した直後に問題が発生しました (そのフラグがなくても正常に動作しました)。

この問題に何が関係しているのか想像できません-rdynamic。些細なテストケースは、どちらの方法でも機能することを示しているため、「」を追加すると機能しなくなったという主張-rdynamicが間違っているか、より複雑な相互作用が進行中です(これは私の些細なテストでは再現していません)。

あなたはから始めたいと思うかもしれません

  1. 唯一の変更server.exeなしで実際に再リンクすると、再び機能することを確認し-rdynamicます。
  2. g++ -o bin/server.exe ... -Wl,-y,__gcov_flushおよびからの出力を表示しreadelf -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
    
于 2012-07-07T03:42:58.377 に答える