2012-08-14 14 views
8

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.

+0

¿Puedes mostrar qué traza inversa imprime después de la # 2? –

+0

¿por qué tiene espacio en el nombre de la opción? –

+0

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

Respuesta

1

Esto podría ser un problema relacionado con la forma en que construyes boost y tu aplicación. Las implementaciones de bloqueo mutex son diferentes si compila para pulgar y sin pulgar. Asegúrese de compilar tanto la aplicación como la biblioteca de impulso con la misma configuración de pulgar.

He aquí un ejemplo user-config.jam utilizo para compilar boost:

if [ os.name ] = CYGWIN || [ os.name ] = NT 
{ 
    HOST_TAG = windows ; 
} 
else if [ os.name ] = LINUX 
{ 
    HOST_TAG = linux-x86 ; 
} 
else if [ os.name ] = MACOSX 
{ 
    HOST_TAG = darwin-x86 ; 
} 

modules.poke : NO_BZIP2 : 1 ; 
modules.poke : NO_GZIP : 1 ; 

LIB_ROOT = /home/user/lib ; 

NDK_ROOT = $(LIB_ROOT)/android-ndk-r8c ; 

LLVM_VERSION = 3.1 ; 
LLVM_NAME = llvm-$(LLVM_VERSION) ; 
LLVM_TOOLCHAIN_ROOT = $(NDK_ROOT)/toolchains/$(LLVM_NAME) ; 
LLVM_TOOLCHAIN_PREBUILT_ROOT = $(LLVM_TOOLCHAIN_ROOT)/prebuilt/$(HOST_TAG) ; 
LLVM_TOOLCHAIN_PREFIX = $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/bin/ ; 

TOOLCHAIN_VERSION = 4.6 ; 
TOOLCHAIN_NAME = arm-linux-androideabi-$(TOOLCHAIN_VERSION) ; 
TOOLCHAIN_ROOT = $(NDK_ROOT)/toolchains/$(TOOLCHAIN_NAME) ; 
TOOLCHAIN_PREBUILT_ROOT = $(TOOLCHAIN_ROOT)/prebuilt/$(HOST_TAG) ; 
TOOLCHAIN_PREFIX = $(TOOLCHAIN_PREBUILT_ROOT)/bin/arm-linux-androideabi- ; 

using clang : $(TOOLCHAIN_VERSION) : 
$(LLVM_TOOLCHAIN_PREFIX)clang : 
<compileflags>"-gcc-toolchain $(TOOLCHAIN_PREBUILT_ROOT)" 
<compileflags>"-isystem $(LLVM_TOOLCHAIN_PREBUILT_ROOT)/lib/clang/$(LLVM_VERSION)/include" 
<compileflags>"-isysroot $(NDK_ROOT)/platforms/android-9/arch-arm/usr/include" 
<compileflags>-std=gnu++11 
<compileflags>-stdlib=libc++ 
<compileflags>-fomit-frame-pointer 
<compileflags>-ffast-math 
<compileflags>"-target armv7-none-linux-androideabi" 
<compileflags>-march=armv7-a 
<compileflags>-mfloat-abi=softfp 
<compileflags>-mfpu=neon 
<compileflags>-DPAGE_SIZE=sysconf\\(_SC_PAGESIZE\\) 
<compileflags>-I$(NDK_ROOT)/boost/include 
<compileflags>-I$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(TOOLCHAIN_VERSION)/include 
<compileflags>-I$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(TOOLCHAIN_VERSION)/libs//armeabi-v7a/include 
<compileflags>-I$(NDK_ROOT)/platforms/android-9/arch-arm/usr/include 
<linkflags>-s 
<archiver>$(TOOLCHAIN_PREFIX)ar 
<ranlib>$(TOOLCHAIN_PREFIX)ranlib 
; 

Tenga en cuenta, que en este ejemplo, que no recogió con el pulgar habilitado.

+0

Resultó ser esto. Qué problema astuto y astuto diagnosticar. Gracias –

Cuestiones relacionadas