2012-08-14 13 views
8

वर्तमान में मैं boost::program_options उपयोग कर रहा हूँ BeagleBoard (एआरएम आधारित प्रोसेसर) पर एक विन्यास फ़ाइल को पार्स करने पर लटका हुआ है। मेरा कार्यक्रम बहु-थ्रेडेड है और boost 1.45 multithreaded पुस्तकालयों के खिलाफ जुड़ा हुआ है।बढ़ावा :: program_options हाथ "कभी-कभी"

मेरे कार्यक्रम जब विन्यास फ़ाइल को पार्स हालांकि

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; 

कार्यक्रम को प्रिंट "विकल्प जोड़ने के बाद" से पहले लटका लटका रहा है। यदि मैं gdb के माध्यम से प्रोग्राम चलाता हूं तो इसे रोकता हूं और पीछे की ओर ट्रेस करता है, यह दिखाता है कि यह "यहां कभी नहीं मिलता" टिप्पणी से पहले लाइन पर था। पश्व-अनुरेखन के शीर्ष बस

#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 

पर यह है ...

किसी भी विचार (मुझे पता है आप और अधिक चाहते हैं, तो भी नहीं)? इस कार्यक्रम के एक x86 मशीन

संपादित करें पर ठीक काम करता है: अधिक जानकारी, इस अनुकूलन बंद (-O2 इस काफी लगातार हो जाएगा के साथ संकलित) के साथ होने की नहीं लगती।

EDIT2: आगे के विश्लेषण से पता चलता है कि यह अभी भी अनुकूलन बंद, -O0 के साथ होता है।

+0

आप क्या पश्व-अनुरेखन प्रिंट # 2 के बाद दिखा सकते हैं? –

+0

इसमें विकल्प नाम में जगह क्यों है? –

+0

देखें कि कौन सा धागा ताला पकड़ रहा है, और देखें कि वह धागा वर्तमान में क्या कर रहा है। आपने कचरे के साथ अपने लॉक को ओवरराइट भी किया होगा और/या अनियंत्रित लॉक संरचना का उपयोग कर रहे हैं। – PlasmaHH

उत्तर

1

इस तरह आप को बढ़ावा देने के लिए और अपने आवेदन का निर्माण से संबंधित एक समस्या हो सकती है। यदि आप अंगूठे के बिना और अंगूठे के बिना संकलित करते हैं तो म्यूटेक्स लॉक कार्यान्वयन अलग होते हैं। सुनिश्चित करें कि आप एक ही अंगूठे सेटिंग्स के साथ एप्लिकेशन और बूस्ट लाइब्रेरी दोनों संकलित करें।

यहाँ एक उदाहरण user-config.jam मैं 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 
; 

ध्यान दें, कि इस उदाहरण में, मैं अंगूठे को सक्षम करने पर संकलन नहीं किया।

+0

चालू करें यह यह साबित हुआ। निदान करने के लिए क्या एक चुस्त भयावह समस्या है। धन्यवाद –

संबंधित मुद्दे