Boost :: program_options hanging on the arm "sometimes"

I am currently using boost::program_options to parse a configuration file on a BeagleBoard (ARM processor). My program is multithreaded and linked to boost 1.45 multithreaded libraries.

My program just hangs while parsing the configuration file, though

 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; 

The program freezes before printing "After adding parameters." If I run the program through gdb, stop it and trace back, it will just show that it was on the line before the comment "Never comes here." Top backtrace just has it in

 #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 

... (let me know if you want more)

Any thoughts? This program works fine on an x86 machine.

Edit: additional information, it seems this does not happen with optimization disabled (compiled with -O2, this will be pretty consistent).

Edit2: Further analysis shows that this still happens when optimization is disabled, -O0.

+8
c ++ boost arm boost-program-options
source share
1 answer

This could be a problem with how you create boost and your application. Mutex lock modes differ from each other if you compile for the thumb and without the thumb. Make sure you compile the boost application and library with the same thumb settings.

Here is an example of user-config.jam that I use to compile 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 ; 

Please note that in this example I did not compile with the thumb turned on.

+1
source share

All Articles