On Wed, Aug 02 2017, "Sebastian Reitenbach" <[email protected]> 
wrote:
> Hi,
>
> I have one amd64 machine now on post clang, now running sysutils/facter with:
> facter -p
>
> to also evaluate the puppet facts, it bails out on me as like:
>
> 2017-08-01 23:56:58.825508 WARN  puppetlabs.facter - Could not initialize 
> locale, even with LC_* variables cleared. Continuing without localization 
> support
> 2017-08-01 23:57:03.604949 FATAL puppetlabs.facter - unhandled exception: 
> ctype_byname<char>::ctype_byname failed to construct for C
>
> With my minimal C++ knowledge, I found "catch throw" in gdb, and figured that 
> the 'C' comes from the
> name of the locale, so I set environment and ran it like with:
>
> 2017-08-01 23:56:58.825508 WARN  puppetlabs.facter - Could not initialize 
> locale, even with LC_* variables cleared. Continuing without localization 
> support
> 2017-08-01 23:57:03.604949 FATAL puppetlabs.facter - unhandled exception: 
> boost::too_many_args: format-string referred to less arguments than were 
> passed
>
> However, 'catch throw' does seem to end up always at the same spot in the 
> program, so I see where
> the unhandled exception is not handled, but where is it actually caused?
> With my little C++ knowledge, I don't seem to see it:
>
> LANG=C LC_ALL=C egdb /usr/local/bin/facter  
> GNU gdb (GDB) 7.12.1
> Copyright (C) 2017 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "x86_64-unknown-openbsd6.1".
> Type "show configuration" for configuration details.
> For bug reporting instructions, please see:
> <http://www.gnu.org/software/gdb/bugs/>.
> Find the GDB manual and other documentation resources online at:
> <http://www.gnu.org/software/gdb/documentation/>.
> For help, type "help".
> Type "apropos word" to search for commands related to "word"...
> Reading symbols from /usr/local/bin/facter...done.
> (gdb) catch throw
> Catchpoint 1 (throw)
> (gdb) r -p 
> Starting program: /usr/local/bin/facter -p
> Catchpoint 1 (exception thrown), __cxa_throw (thrown_object=0x17eb74b24a80, 
> tinfo=0x17eba8d5cc80 <typeinfo for std::runtime_error>, dest=0x17eba8b0f790 
> <std::runtime_error::~runtime_error()>)
>     at /usr/src/lib/libcxxabi/src/cxa_exception.cpp:223
> 223         __cxa_eh_globals *globals = __cxa_get_globals();
> (gdb) bt
> #0  __cxa_throw (thrown_object=0x17eb74b24a80, tinfo=0x17eba8d5cc80 <typeinfo 
> for std::runtime_error>, dest=0x17eba8b0f790 
> <std::runtime_error::~runtime_error()>)
>     at /usr/src/lib/libcxxabi/src/cxa_exception.cpp:223
> #1  0x000017eb7705728c in std::__1::collate_byname<char>::collate_byname 
> (this=0x17ebd07b1b60, name=..., refs=<optimized out>) at 
> /usr/src/lib/libcxx/src/locale.cpp:662
> #2  0x000017eb77053643 in std::__1::locale::__imp::__imp 
> (this=0x17ec13f9b200, name=..., refs=<optimized out>) at 
> /usr/src/lib/libcxx/src/locale.cpp:210
> #3  0x000017eb77056844 in std::__1::locale::locale (this=0x7f7ffffd2900, 
> name=0x7f7ffffd2a21 "C") at /usr/src/lib/libcxx/src/locale.cpp:509
> #4  0x000017eb41e9d09a in 
> boost::locale::impl_std::std_localization_backend::loadable 
> (this=0x17eb58725500, name=...) at libs/locale/src/std/std_backend.cpp:152
> #5  0x000017eb41e9c457 in 
> boost::locale::impl_std::std_localization_backend::prepare_data 
> (this=0x17eb58725500) at libs/locale/src/std/std_backend.cpp:98
> #6  0x000017eb41e9ace8 in 
> boost::locale::impl_std::std_localization_backend::install 
> (this=0x17eb58725500, base=..., category=1, type=1) at 
> libs/locale/src/std/std_backend.cpp:164
> #7  0x000017eb41e0f2e1 in 
> boost::locale::localization_backend_manager::impl::actual_backend::install 
> (this=0x17eb311d2c00, l=..., category=1, type=1)
>     at libs/locale/src/shared/localization_backend.cpp:145
> #8  0x000017eb41dfdeec in boost::locale::generator::generate 
> (this=0x7f7ffffd3bd8, base=..., id=...) at 
> libs/locale/src/shared/generator.cpp:141
> #9  0x000017eb41dfd5fb in boost::locale::generator::generate 
> (this=0x7f7ffffd3bd8, id=...) at libs/locale/src/shared/generator.cpp:116
> #10 0x000017eb93708624 in boost::locale::generator::operator() 
> (this=0x7f7ffffd3bd8, id=...) at 
> /usr/local/include/boost/locale/generator.hpp:202
> #11 0x000017eb9370704c in leatherman::locale::get_locale (id=..., domain=..., 
> paths=...) at 
> /home/ports/pobj/amd64/leatherman-1.0.0/leatherman-1.0.0/locale/src/locale.cc:48
> #12 0x000017ebc99ef748 in setup_logging_internal (os=..., use_locale=true) at 
> /home/ports/pobj/amd64/facter-3.7.0/facter-3.7.0/lib/src/logging/logging.cc:20
> #13 0x000017ebc99eea0e in facter::logging::setup_logging (os=...) at 
> /home/ports/pobj/amd64/facter-3.7.0/facter-3.7.0/lib/src/logging/logging.cc:64
> #14 0x000017e915502b98 in main (argc=2, argv=0x7f7ffffd93e8) at 
> /home/ports/pobj/amd64/facter-3.7.0/facter-3.7.0/exe/facter.cc:136
>
> If someone has a cluebat or can point me into the right direction, I'm all 
> ears. 
> The only thing I can see, that leatherman, as well as boost is involved, and 
> that all circles around LOCALE settings.

Well, /usr/src/lib/libcxx/src/locale.cpp:662 looks like the offending line.

IIUC libcxx wants to use xlocale support, but we don't implement that in
libc.  libcxx/include/support/xlocale/__nop_locale_mgmt.h contains empty
stubs that do build, but fail at runtime.

Even this simple program fails at runtime:

  #include <locale>
  int main() { std::locale s(""); }

> So, when building facter, telling it that leatherman doesn't support locale, 
> fixes the problem, but I don't think that this is a proper solution.
> So if someone has a pointer to the above, let me know.

I guess xlocale support should be fixed (implemented?), but this may not
be trivial.  You may need a workaround for facter in the meantime.

> Sebastian
>
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/sysutils/facter/Makefile,v
> retrieving revision 1.46
> diff -u -p -u -r1.46 Makefile
> --- Makefile  26 Jul 2017 22:45:30 -0000      1.46
> +++ Makefile  1 Aug 2017 22:22:42 -0000
> @@ -8,7 +8,7 @@ DISTNAME =            facter-${VERSION}
>  SHARED_LIBS +=       facter                    3.1 # 3.2
>  PKGSPEC =            facter->=3.0,<4.0
>  CATEGORIES =         sysutils
> -REVISION =           0
> +REVISION =           1
>  
>  MAINTAINER =         Sebastian Reitenbach <[email protected]>
>  
> @@ -40,6 +40,7 @@ LIB_DEPENDS =               devel/boost>=1.58 \
>  BUILD_DEPENDS =              devel/gettext-tools
>  
>  CONFIGURE_ARGS+=     
> -DFACTER_RUBY="${LOCALBASE}/lib/libruby${MODRUBY_BINREV}.so" \
> +                     -DLEATHERMAN_USE_LOCALES:Bool=No \
>                       
> -DRUBY_LIB_INSTALL="${PREFIX}/lib/ruby/vendor_ruby/${MODRUBY_REV}" \
>                       -DWITHOUT_JRUBY:Bool=Yes
>
>


-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to