2012-08-14 5 views
8

Momentan verwende ich boost::program_options, um eine Konfigurationsdatei auf dem BeagleBoard (ARM-basierter Prozessor) zu parsen. Mein Programm ist multi-threaded und mit den boost 1.45 multithreaded Bibliotheken verbunden.boost :: program_options hängt am arm "manchmal"

Mein Programm scheint nur zu hängen, wenn die Konfigurationsdatei Parsing obwohl

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; 

Das Programm hängt vor dem Druck aus „Nach dem Hinzufügen von Optionen“. Wenn ich das Programm über gdb laufen lasse, höre es auf und mache eine Rückverfolgung, es zeigt nur an, dass es in der Zeile vor dem "Nie kommt hier" -Kommentar ist. Die Oberseite des Backtrace hat es gerade bei

#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 

... (lassen Sie mich wissen, wenn Sie mehr wollen)

Irgendwelche Gedanken? Dieses Programm funktioniert gut auf einem x86-Rechner

Bearbeiten: Weitere Informationen, dies scheint nicht mit Optimierungen aus (kompiliert mit -O2 das wird ziemlich konsequent auftreten) passieren.

Edit2: Weitere Analyse zeigt, dass dies immer noch mit Optimierungen aus, -O0 passiert.

+0

Können Sie zeigen, was Backtrace nach # 2 druckt? –

+0

Warum hat es Platz in Optionsname? –

+0

Schauen Sie, welcher Thread die Sperre hält und schauen Sie, was dieser Thread gerade macht. Möglicherweise haben Sie auch Ihre Sperre mit "Müll" überschrieben und/oder verwenden die nicht initialisierte Sperrstruktur. – PlasmaHH

Antwort

1

Dies könnte ein Problem im Zusammenhang mit dem Aufbau von Boost und Ihrer Anwendung sein. Die Mutex-Lock-Implementierungen unterscheiden sich, wenn Sie für den Daumen und ohne Daumen kompilieren. Stellen Sie sicher, dass Sie die Anwendung und die Boost-Bibliothek mit den gleichen Daumeneinstellungen kompilieren.

Hier ist ein Beispiel user-config.jam ich boost kompilieren:

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 
; 

Beachten Sie, dass in diesem Beispiel habe ich nicht mit dem Daumen aktiviert kompilieren.

+0

Es stellte sich heraus, dass dies zu sein. Was für ein hinterhältiges hinterhältiges Problem zu diagnostizieren. Vielen Dank –

Verwandte Themen