Segfault when running ICE tests
I sometimes get a segfault in the join
function when running the ICE tests:
Thread 1 "tests_ice" received signal SIGSEGV, Segmentation fault.
std::thread::join (this=0x5554558e6140) at /build/gcc-12-ALHxjy/gcc-12-12.3.0/build/x86_64-linux-gnu/libstdc++-v3/include/bits/std_thread.h:106
106 /build/gcc-12-ALHxjy/gcc-12-12.3.0/build/x86_64-linux-gnu/libstdc++-v3/include/bits/std_thread.h: No such file or directory.
(gdb) bt
#0 std::thread::join (this=0x5554558e6140) at /build/gcc-12-ALHxjy/gcc-12-12.3.0/build/x86_64-linux-gnu/libstdc++-v3/include/bits/std_thread.h:106
#1 0x000055555559e4e2 in dhtnet::test::IceTest::tearDown (this=0x555555904170) at /home/fsimon/dhtnet/tests/ice.cpp:139
#2 0x00005555555f73d5 in CppUnit::TestCaller<dhtnet::test::IceTest>::tearDown (this=0x555555904240) at /usr/include/cppunit/TestCaller.h:185
#3 0x00007ffff79854e6 in ?? () from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#4 0x00007ffff7985434 in CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) () from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#5 0x00007ffff797fa50 in CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) () from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#6 0x00007ffff7986be3 in CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#7 0x00007ffff798fbd2 in CppUnit::TestCase::run(CppUnit::TestResult*) () from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#8 0x00007ffff798584d in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) () from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#9 0x00007ffff798565d in CppUnit::TestComposite::run(CppUnit::TestResult*) () from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#10 0x00007ffff798584d in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) () from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#11 0x00007ffff798565d in CppUnit::TestComposite::run(CppUnit::TestResult*) () from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#12 0x00007ffff7986077 in CppUnit::TestResult::runTest(CppUnit::Test*) () from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#13 0x00007ffff798c6a5 in CppUnit::TestRunner::run(CppUnit::TestResult&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#14 0x00007ffff798f3a4 in CppUnit::TextTestRunner::run(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, bool, bool) ()
from /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#15 0x00005555555adcfb in main () at /home/fsimon/dhtnet/tests/ice.cpp:750
After using Valgrind (see attached file) and doing some experiments with gdb, I believe the problem is due to the fact that it's possible for the cv
condition variable in UPnPContext:shutdown()
to be destroyed before the call to cv.notify_one()
in UPnPContext::shutdown(cv)
(if the shutdown happened to time out).