为什么添加要使用Cmake编译的cpp文件可能会导致程序执行过程中出现分段错误



我正常编译并运行程序如下:

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这样的工具来帮助您调试问题。

最新更新