2012-08-14 34 views
8

Şu anda BeagleBoard (ARM tabanlı işlemci) üzerinde bir yapılandırma dosyası ayrıştırmak için boost::program_options kullanıyorum. Programım çok iş parçacıklı ve boost 1.45 multithreaded kitaplıklarına bağlı.boost :: program_options "bazen" kolunda kilitleniyor

Programım sadece

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; 

programı "seçenekleri ekledikten sonra" dışarı yazdırmadan önce asılı olsa yapılandırma dosyası ayrıştırılırken askıda gibi görünüyor. Eğer programı gdb ile çalıştırırsam durdurur ve bir geri izler yaparsam, "Asla buraya gelmez" yorumundan önce satırda olduğunu gösterir. backtrace üst sadece

#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 

adresten var ...

Herhangi düşünceler (daha fazlasını isterseniz bana bildirin)? Bu program bir x86 makinasında düzgün çalışıyor.

Düzenleme: Daha fazla bilgi, bu, en iyi duruma getirme işlemleriyle gerçekleşmez (-O2 ile derlenmiş, bu oldukça tutarlı bir şekilde gerçekleşir).

Edit2: Daha fazla analiz, bunun hala optimizasyonlar kapalıyken gerçekleştiğini ortaya çıkarır, -O0.

+0

# 2'den sonra backtrace çıktılarını gösterebiliyor musunuz? –

+0

Seçenek adında neden boşluk var? –

+0

Hangi iş parçacığının kilit tuttuğunu görün ve bu iş parçacığının şu anda ne yaptığına bakın. Ayrıca, kilidinizi çöp kutusuna yazdırabilir ve/veya başlatılmamış kilit yapısı kullanıyor olabilirsiniz. – PlasmaHH

cevap

1

Bu, desteğinizi ve uygulamanızı nasıl oluşturduğunuzla ilgili bir sorun olabilir. Başparmak için ve parmaksız olarak derlerseniz, mutex kilit uygulamaları farklıdır. Hem uygulama hem de destek kitaplığını aynı başparmak ayarlarıyla derlediğinizden emin olun.

İşte boost derlemek için kullandığımız bir örnek user-config.jam var:

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 
; 

Not, yani bu örnekte, ben etkinleştirilmiş başparmak ile derlemek vermedi.

+0

Bunun böyle olduğu ortaya çıktı. Teşhis için ne kadar sinsi bir problem. Teşekkürler –

İlgili konular