Summary: | При запуске gnucash: terminate called without an active exception: getrandom: ENOSYS | ||
---|---|---|---|
Product: | Branch p9 | Reporter: | Vitaly Lipatov <lav> |
Component: | boost-devel-headers | Assignee: | Vitaly Lipatov <lav> |
Status: | CLOSED WONTFIX | QA Contact: | qa-p9 <qa-p9> |
Severity: | normal | ||
Priority: | P5 | ||
Version: | не указана | ||
Hardware: | x86_64 | ||
OS: | Linux | ||
URL: | https://github.com/boostorg/uuid/issues/92 |
Description
Vitaly Lipatov
2020-02-10 18:17:31 MSK
Установка gnucash-3.7-alt1 (пересобраннного из Сизифа) ничего не дало: Thread 1 "gnucash" received signal SIGABRT, Aborted. __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50 50 return ret; (gdb) bt #0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50 #1 0x00007ffff6c10515 in __GI_abort () at abort.c:79 #2 0x00007ffff65a99d7 in __gnu_cxx::__verbose_terminate_handler () at ../../../../libstdc++-v3/libsupc++/vterminate.cc:95 #3 0x00007ffff65cd4d6 in __cxxabiv1::__terminate (handler=<optimized out>) at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:47 #4 0x00007ffff65cd511 in std::terminate () at ../../../../libstdc++-v3/libsupc++/eh_terminate.cc:57 #5 0x00007ffff6e58cab in gnc::GUID::create_random () at /usr/include/c++/8/ext/new_allocator.h:86 #6 0x00007ffff6ee6002 in guid_replace (guid=guid@entry=0x7a4400) at /usr/src/debug/gnucash-3.7/libgnucash/engine/guid.cpp:147 #7 0x00007ffff6f0b85d in qof_instance_init_data (inst=inst@entry=0x7a4450, type=type@entry=0x7ffff6f7d368 "Book", book=book@entry=0x7a4450) at /usr/src/debug/gnucash-3.7/libgnucash/engine/qofinstance.cpp:301 #8 0x00007ffff6f0435d in qof_book_init (book=0x7a4450) at /usr/src/debug/gnucash-3.7/libgnucash/engine/qofbook.cpp:135 Ну да, gnucash - падучее недоразумение. (Ответ для Andrey Cherepanov на комментарий #2) > Ну да, gnucash - падучее недоразумение. В данном случае это ядро openvz-2.6.32 и getrandom strace: getrandom(0x7ffd6ea4c6b0, 16, 0) = -1 ENOSYS (Функция не реализована) write(2, "terminate called after throwing "..., 48terminate called after throwing an instance of ') = 48 для тестовой программы #include <boost/uuid/uuid.hpp> // uuid class #include <boost/uuid/uuid_generators.hpp> // generators #include <boost/uuid/uuid_io.hpp> // streaming operators etc. #include <iostream> int main() { boost::uuids::uuid uuid = boost::uuids::random_generator()(); std::cout << uuid << std::endl; } #7 0x0000000000402c1b in void boost::exception_detail::throw_exception_<boost::uuids::entropy_error>(boost::uuids::entropy_error const&, char const*, char const*, int) () #8 0x000000000040292d in boost::uuids::detail::random_provider_base::get_random_bytes(void*, unsigned long) () #9 0x00000000004029bb in boost::uuids::random_generator_pure::operator()() () После отладки get_random_bytes выяснилось, что это библиотечная getentropy не работает: #include <unistd.h> #include <stdio.h> int main() { char buf[100]; int res = getentropy(buf,100); printf("getentropy result=%d\n", res); } strace: getrandom(0x7ffe6b1d76c0, 100, 0) = -1 ENOSYS (Функция не реализована) Подобная проблема была с python: https://bugzilla.altlinux.org/show_bug.cgi?id=33356 boost сейчас тоже не парится, если glibc >=2.25, использует getentropy: #elif BOOST_LIB_C_GNU >= BOOST_VERSION_NUMBER(2, 25, 0) && !defined(BOOST_UUID_RANDOM_PROVIDER_FORCE_POSIX) # define BOOST_UUID_RANDOM_PROVIDER_GETENTROPY # define BOOST_UUID_RANDOM_PROVIDER_NAME getentropy Ядро 2.6.32-ovz-el не поддерживается. Если в каком-то случае проблема будет актуальна, можно применять свою реализацию getrandom по аналогии с https://github.com/Etersoft/ignoreflock |