Actualmente estoy usando boost::program_options
para analizar un archivo de configuración en el BeagleBoard (procesador basado en ARM). Mi programa tiene varios subprocesos y está vinculado con las bibliotecas boost 1.45 multithreaded
.boost :: program_options se cuelga en el brazo "a veces"
Mi programa sólo parece colgar al analizar el archivo de configuración, aunque
namespace po = boost::program_options;
po::options_description desc("Options");
uint32_t option1=0;
std::vector<std::string> optionsString;
std::cout<<"Before adding options"<<std::endl;
desc.add_options()
("option1",
po::value<uint32_t>(&option1), "...")
("finaloption",
po::value<std::vector<std::string> >(&optionsString)->multitoken(), "string of options");
//Never gets here
std::cout<<"After adding options"<<std::endl;
po::variables_map vm;
std::cout<<"Starting program"<<std::endl;
El programa se bloquea antes de imprimir "Después de añadir opciones". Si ejecuto el programa a través de gdb, deténgalo y haga un rastreo hacia atrás que solo muestra que estaba en la línea antes del comentario "Nunca llega aquí". La parte superior de la traza simplemente lo tiene en
#0 ??
#1 __lll_lock_wait lowlevellock.c:47
#2 __pthread_mutex_lock pthread_mutex_lock.c:61
#3 in boost::shared_ptr<boost::program_options::option_description>* std::__uninitialized_move_a<boost::shared_ptr<boost::program_options::option_description>*, boost::shared_ptr<boost::program_options::option_description>*, std::allocator<boost::shared_ptr<boost::program_option::option_description> > >(boost::shared_ptr<boost::program_optionns::option_description>*, boost::shared_ptr<boost::program_options::option_description>*, std::allocator<boost::shared_ptr<boost::program_options::option_description> >&)() from /usr/local/lib/libboost_program_options-mt.so.1.45.0
#4 in std::vector<boost::shared_ptr<boost::program_options::option_description>, std::allocator<boost::shared_ptr<boost::program_options::option_description> > >::_M_insert_aux(__gnu_cxx::__normal_iterator<boost::shared_ptr<boost::program_options::option_description>, std::vector<boost::shared_ptr<boost::program_options::option_description>, std::allocator<boost::shared_ptr<boost::program_options::option_description> const&)() from /usr/local/lib/libboost_program_options-mt.so.1.45.0
#5 in boost::program_options::options_description::add(boost::shared_ptr<boost::program_options::option_description>)() from /usr/local/lib/libboost_program_options-mt.so.1.45.0
... (quiero saber si quieres más)
¿Alguna idea? Este programa funciona bien en una máquina x86
Editar: información adicional, esto no parece ocurrir con las optimizaciones desactivadas (compilado con -O2 esto ocurrirá de manera bastante consistente).
Edit2: El análisis posterior revela que esto todavía ocurre con las optimizaciones desactivadas, -O0.
¿Puedes mostrar qué traza inversa imprime después de la # 2? –
¿por qué tiene espacio en el nombre de la opción? –
Mira qué hilo está sujetando el bloqueo, y mira qué hilo está haciendo actualmente. Es posible que también haya sobrescrito su bloqueo con basura y/o esté utilizando una estructura de bloqueo no inicializada. – PlasmaHH