gdb - 使用 boost::iostreams 时未找到警告消息 RTTI 符号

标签 gdb eclipse-cdt rtti debug-symbols boost-iostreams

我使用 Boost::iostreams 同时写入我的控制台和文件。当我使用 eclipse 进行调试(当然是使用 gdb)时,我收到一条警告,提示我在 Boost::iostreams 中使用的其中一个类没有找到 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 进行编译,然后可执行文件提示 rtti 绝对应该启用以使用 iostreams)

最佳答案

您应该关注的警告来自编译器,它实际上是创建您的程序的原因。最终用户不应使用调试器,它对您的二进制文件本身没有影响。

虽然 gdb 有时会发现问题,但其中的许多警告是因为 gdb 消耗了调试符号,而使用者 (gdb) 有错误和防御。通常他们只是减少了 gdb 的功能。
在这种情况下,调试器中关于该类的信息较少。它使调试更加困难,但不会损害应用程序本身。

对于如何处理此错误,您有多种选择。

  • 忽略 gdb 中的警告并继续生活。
  • 获取 gdb 的源代码并尝试查找问题并提交补丁。我相信它会受到欢迎。
  • 使用不同的调试器。 (不过,我见过的所有替代品都是付费产品。)
  • 重写程序以不使用任何模板。 gdb 模板处理是大多数符号查找问题存在的地方。
  • 关于gdb - 使用 boost::iostreams 时未找到警告消息 RTTI 符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12986261/

    相关文章:

    c++ - 在 Mac OS X 上以多态方式捕获 -fno-rtti 共享库中的异常

    C++:模拟 RTTI

    c++ - 在 gdb 中显示参数包的值

    gdb - 为什么 gdb 拒绝加载我的共享对象以及验证操作是什么

    python - alpine linux上gdb调试python(3)进程,无法使用py-list

    c++ - 如何在 Eclipse CDT 中将静态库链接到静态库

    c++ - 如何在函数返回的 GDB 中设置断点?

    c++ - 通过 Eclipse CDT 访问 GDB

    build-process - Eclipse CDT - 在项目中构建子目录

    delphi - 具有指定值的枚举类型没有TypeInfo,为什么?