1

我正在尝试运行我的程序,并且在几次运行中出现错误:

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

如何获得有关该问题的更多信息?

4

2 回答 2

2

在将函数设置为 noexcept 后,我​​能够找到堆栈跟踪,显示我在不存在的互斥锁上的 unique_lock 上调用 condition_variable::wait()。只是我调用 wait() 的 Semaphore 对象为空。因此在https://en.cppreference.com/w/cpp/thread/unique_lock/lock中由 unique_lock 抛出 system_error

于 2019-01-17T19:15:03.423 回答
1

首先,您需要确定错误是来自您正在运行的函数std::thread还是std::thread自身运行的函数。如果您的函数抛出异常,它将被std::thread启动器函数捕获,并终止将被调用。如果你创建你的函数noexcept,那么terminate它会在它被捕获之前被调用,你会在堆栈跟踪中看到它是从哪里抛出的(更高版本的 GCC 不会捕获异常,所以这会自动发生)。

如果异常来自std::thread自身,则意味着您的程序已链接到 in 的虚拟定义pthread_createlibc.so.6不是真正的 inlibpthread.solibpthread.a

用于ldd查看您的程序是否链接到共享libpthread.so。如果是这样,那么您的工具链有问题(libpthread.so应该使用中的定义而不是 中的弱符号libc.so)。如果您是静态链接,您可能需要确保所有符号libpthread.a都包含在您的程序中,例如通过使用:

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

请注意,您不应该使用-pthread-lpthread,因为这允许 GCC 确保将其放置在链接命令中的正确位置。

于 2019-01-17T15:29:29.073 回答