Недетерминированный std :: system_error: what (): операция не разрешена - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь запустить свою программу, и раз в несколько запусков я получаю сообщение об ошибке:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted

Мой код доступен здесь: https://github.com/Qabrt/turnstiles

Выводы GDB:

Thread 31 "trivial_test" received signal SIGABRT, Aborted.
[Switching to thread 31 (Thread 0x7fff8a7fc700 (LWP 8716))]
#0  0x00007ffff6e7f83b in raise () from /lib64/libc.so.6
(gdb) bt
#0  0x00007ffff6e7f83b in raise () from /lib64/libc.so.6
#1  0x00007ffff6e81081 in abort () from /lib64/libc.so.6
#2  0x00007ffff78670e5 in __gnu_cxx::__verbose_terminate_handler ()
    at /var/tmp/portage/sys-devel/gcc-7.3.0-r3/work/gcc-7.3.0/libstdc++-v3/libsupc++/vterminate.cc:95
#3  0x00007ffff7864cb6 in __cxxabiv1::__terminate (handler=<optimized out>)
    at /var/tmp/portage/sys-devel/gcc-7.3.0-r3/work/gcc-7.3.0/libstdc++-v3/libsupc++/eh_terminate.cc:47
#4  0x00007ffff7864d01 in std::terminate ()
    at /var/tmp/portage/sys-devel/gcc-7.3.0-r3/work/gcc-7.3.0/libstdc++-v3/libsupc++/eh_terminate.cc:57
#5  0x00007ffff789243f in std::execute_native_thread_routine (__p=0x555555790f80)
    at /var/tmp/portage/sys-devel/gcc-7.3.0-r3/work/gcc-7.3.0/libstdc++-v3/src/c++11/thread.cc:91
#6  0x00007ffff7bbd96a in start_thread () from /lib64/libpthread.so.0
#7  0x00007ffff6f4d11f in clone () from /lib64/libc.so.6

g ++ - версия

g++ (Gentoo 7.3.0-r3 p1.4) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Я компилирую с флагом -lpthread:

/usr/bin/c++    -Wall -Wunused-function -Wwrite-strings -Wformat -Wformat-security -Wparentheses -Wsequence-point -Wno-system-headers -Werror -Winit-self  -g -O0 -fstack-protector-all -D_GLIBXX_DEBUG -D_GLIBXX_DEBUG_PEDANTIC  -rdynamic CMakeFiles/trivial_test.dir/trivial_test.cpp.o  -o trivial_test ../libturnstile_lib.a -lpthread

Как я могу получить больше информации о проблеме?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

После установки функций в noexcept я смог найти трассировку стека, показывающую мне, что я вызывал condition_variable :: wait () для unique_lock для мьютекса, которого не было. Просто объект Семафор, для которого я вызвал wait (), был нулевым. Отсюда системная ошибка с уникальным_блоком, как в https://en.cppreference.com/w/cpp/thread/unique_lock/lock

0 голосов
/ 17 января 2019

Сначала вам нужно выяснить, происходит ли ошибка от вашей функции, которая запускается std::thread или от std::thread. Если ваша функция выдает исключение, она будет перехвачена функцией запуска std::thread, и будет вызван терминатор. Если вы сделаете свою функцию noexcept, то terminate будет вызываться до того, как она будет перехвачена, и вы увидите, откуда она выбрасывается в трассировке стека (более поздние версии GCC не улавливают исключение, поэтому это происходит автоматически).

Если исключение исходит из самого std::thread, это означает, что ваша программа связалась с фиктивным определением pthread_create в libc.so.6 вместо реального в libpthread.so или libpthread.a

Используйте ldd, чтобы увидеть, ссылается ли ваша программа на общий libpthread.so или нет. Если это так, что-то не так с вашей цепочкой инструментов (вместо * слабый символ в libc.so следует использовать определение в libpthread.so). Если вы создаете статические ссылки, возможно, вам необходимо убедиться, что все символы из libpthread.a включены в вашу программу, например, используя:

-Wl,--whole-archive -pthread -Wl,--no-whole-archive

N.B. вы должны использовать -pthread, а не -lpthread, поскольку это позволяет GCC убедиться, что он находится в нужном месте в команде link.

...