8

現在boost::program_options、BeagleBoard (ARM ベースのプロセッサ) で構成ファイルを解析するために使用しています。私のプログラムはマルチスレッドで、boost 1.45 multithreadedライブラリに対してリンクされています。

ただし、構成ファイルを解析するときにプログラムがハングするようです

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 を介してプログラムを実行すると、停止してバック トレースを実行すると、「Never gets here」コメントの前の行にあったことが示されます。バックトレースの上部にはそれがあります

#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 でも発生することがわかります。

4

1 に答える 1

1

これは、ブーストとアプリケーションのビルド方法に関連する問題である可能性があります。サム用にコンパイルする場合とサムなしでコンパイルする場合では、mutex ロックの実装が異なります。アプリケーションとブースト ライブラリの両方を同じサム設定でコンパイルしてください。

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
;

この例では、thumb を有効にしてコンパイルしていないことに注意してください。

于 2013-01-20T16:24:52.453 に答える