6

Boost::iostreams を使用して、コンソールとファイルに同時に書き込みます。Eclipse を使用して (もちろん gdb を使用して) デバッグすると、Boost::iostreams から使用しているクラスの 1 つに RTTI シンボルが見つからないという警告が表示されます。

問題を再現するための最小限のコードを次に示します。

#ifndef BOOST_IO_STREAM_H_
#define BOOST_IO_STREAM_H_

#include <fstream>
#include <boost/iostreams/tee.hpp>
#include <boost/iostreams/stream.hpp>
using boost::iostreams::tee_device;
using boost::iostreams::stream;

typedef tee_device<std::ostream, std::ofstream> TeeDevice;
typedef stream<TeeDevice> TeeStream;

#endif /* BOOST_IO_STREAM_H_ */

int
main()
{

  /* A config file to output experiment details */
  std::string self_filename = "./experimentconfig.txt";
  std::ofstream fconfig(self_filename.c_str());
  TeeDevice my_tee(std::cout, fconfig);
  TeeStream cool_cout(my_tee);

  cool_cout << "Output to file and console during experiment run" << std::endl;

  return 0;
}

デバッグ中に境界線を越えるとTeeStream cool_cout(my_tee);、次の警告が表示されます。

warning: RTTI symbol not found for class 'boost::iostreams::stream<boost::iostreams::tee_device<std::ostream, std::basic_ofstream<char, std::char_traits<char> > >, std::char_traits<char>, std::allocator<char> >'
warning: RTTI symbol not found for class 'boost::iostreams::stream_buffer<boost::iostreams::tee_device<std::ostream, std::basic_ofstream<char, std::char_traits<char> > >, std::char_traits<char>, std::allocator<char>, boost::iostreams::output>'

オブジェクト cool_cout が検出されるたびに、警告が繰り返されます。これを修正するにはどうすればよいですか? もちろん、このコードを使用するプログラムは機能し、問題はありません。警告は無視されるべきではなく、RTTI シンボルについての知識を得る必要があります。(私は -f nortti でコンパイルできず、実行可能ファイルは、iostreams を使用するには rtti を確実に有効にする必要があると不平を言います)

4

1 に答える 1

5

注意すべき警告は、実際にプログラムを作成するコンパイラからのものです。エンド ユーザーはデバッガーを使用しないでください。バイナリー自体には影響しません。

gdb は問題を見つけることがありますが、警告の多くは、gdb がデバッグ シンボルを消費し、コンシューマー (gdb) にバグと防御があるためです。多くの場合、gdb の機能が低下するだけです。この場合、デバッガー内で利用できるそのクラスに関する情報は少なくなります。デバッグが難しくなりますが、アプリケーション自体に害はありません。

このエラーに対処するには、いくつかの選択肢があります。

  1. gdb の警告を無視して、そのまま続行してください。
  2. gdb のソースを入手し、問題を見つけてパッチを提出してください。きっと歓迎されると思います。
  3. 別のデバッガを使用してください。(ただし、私が見た代替品はすべて有料の製品です。)
  4. テンプレートを使用しないようにプログラムを書き直してください。gdb テンプレートの処理は、シンボル ルックアップの問題の大部分が存在する場所です。
于 2012-10-20T18:23:09.213 に答える