我正常编译并运行程序如下:
set(A_SRC a.hpp a.cpp)
当我添加第二个编译目标如下:
set(A_SRC a.hpp a.cpp b.hpp b.cpp)
它在执行Segmentation fault (core dumped)
期间导致SegFault,coredump没有关于原因的有价值的信息。
b.hpp没有在任何地方使用,b中的所有代码/函数都在一个单独的命名空间中。b.hpp与其中一个链接库有相似之处。
segfault的原因可能是什么?如何通过简单地编译更多的代码来导致SegFault?
更多信息JIC:
Stacktrace:
#0 0x00007f489ba27550 in ?? ()
#1 <signal handler called>
#2 0x00007f489ba27550 in ?? ()
#3 <signal handler called>
#4 0x00007f495daf87b1 in pthread_cond_timedwait@@GLIBC_2.3.2 ()
from /usr/lib/x86_64-linux-gnu/libpthread.so.0
#5 0x00007f465c8e9c66 in __gthread_cond_timedwait (__cond=0x55fdf3180b88,
__mutex=0x55fdf3180b60, __abs_timeout=0x7ffe36106dd0)
at /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:872
#6 0x00007f465c8eb676 in std::condition_variable::__wait_until_impl<std::chrono::duration<long, std::ratio<1l, 1000000000l> > > (this=0x55fdf3180b88, __lock=..., __atime=...)
at /usr/include/c++/9/condition_variable:188
#7 0x00007f465c8eab4a in std::condition_variable::wait_until<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > (this=0x55fdf3180b88,
__lock=..., __atime=...) at /usr/include/c++/9/condition_variable:121
#8 0x00007f465c8ea1c5 in std::condition_variable::wait_for<long, std::ratio<1l, 1000l> > (
this=0x55fdf3180b88, __lock=..., __rtime=...)
...
其他线程也没有帮助:
(gdb) info threads
Id Target Id Frame
* 1 Thread 0x7f495d78c740 (LWP 18) 0x00007f489ba27550 in ?? ()
2 Thread 0x7f4661aea700 (LWP 121) 0x00007f495d86f3bf in clock_nanosleep ()
from /usr/lib/x86_64-linux-gnu/libc.so.6
3 Thread 0x7f480bcac700 (LWP 138) 0x00007f495daf8376 in pthread_cond_wait@@GLIBC_2.3.2
() from /usr/lib/x86_64-linux-gnu/libpthread.so.0
4 Thread 0x7f48a1cc6700 (LWP 128) 0x00007f495d8a4aff in poll ()
from /usr/lib/x86_64-linux-gnu/libc.so.6
5 Thread 0x7f47bdc9f700 (LWP 145) 0x00007f495daf8376 in pthread_cond_wait@@GLIBC_2.3.2
() from /usr/lib/x86_64-linux-gnu/libpthread.so.0
6 Thread 0x7f4885cc1700 (LWP 130) 0x00007f495d8b2c90 in accept4 ()
from /usr/lib/x86_64-linux-gnu/libc.so.6
segfault的原因是什么?如何通过简单地编译更多的代码来导致SegFault?
这很奇怪,但可能您添加的额外源代码正在以某种方式执行代码。
也许是与全球化有关的东西。在过去的嵌入式系统工作中,全局变量分配动态内存,我遇到了一些问题。
C++是否为全局和类静态变量调用析构函数?
或者您正在使用隐式执行逻辑的预定义函数。例如DLLMain。我知道你在使用unix,但问题仍然存在。
尝试使用更高的警告级别进行编译。您的代码可能违反了类似ODR的C++规则。
或者使用像Valgrind这样的工具来帮助您调试问题。