gdb - mensaje de advertencia El símbolo RTTI no se encontró cuando se usa boost:: iostreams
eclipse-cdt debug-symbols (1)
Uso Boost :: iostreams para escribir simultáneamente en mi consola y un archivo. Cuando uso eclipse para depurar (con gdb por supuesto), recibo una advertencia que dice que el símbolo RTTI no se encuentra para una de las clases que estoy usando de Boost :: iostreams.
Aquí está el código mínimo para reproducir el problema.
#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;
}
Cuando cruce el TeeStream cool_cout(my_tee);
línea durante la depuración, recibo las siguientes advertencias:
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>''
Las advertencias se repiten cada vez que se encuentra el objeto cool_cout. ¿Cómo puedo solucionar esto? Por supuesto, los programas que usan este código funcionan y no tengo problemas con eso. Se supone que las advertencias no deben ignorarse y existe algún conocimiento sobre los símbolos RTTI que se deben obtener. (No puedo compilar con -f nortti, entonces el ejecutable se queja de que rtti definitivamente debería estar habilitado para usar iostiras)
Las advertencias de las que debería preocuparse provienen del compilador, que es lo que realmente crea su programa. Los usuarios finales no deberían usar un depurador, y no tiene ningún impacto en su propio binario.
Mientras que gdb a veces encuentra problemas, muchas de las advertencias son porque gdb consume símbolos de depuración, y el consumidor (gdb) tiene errores y defensas. A menudo simplemente reducen la funcionalidad de gdb. En este caso, hay menos información sobre esa clase disponible dentro del depurador. Hace que la depuración sea más difícil, pero no daña la aplicación en sí.
Tiene varias opciones de qué hacer con este error.
- Ignora la advertencia en gdb y continúa con la vida.
- Obtenga las fuentes de gdb y trate de encontrar el problema y envíe un parche. Estoy seguro de que sería bienvenido.
- Use un depurador diferente. (Sin embargo, todas las alternativas que he visto son productos pagados).
- Reescribe el programa para no usar ninguna plantilla. El manejo de la plantilla gdb es donde existe la mayoría de los problemas de búsqueda de símbolos.