Поврежденный двойной список?

Я просто отлаживаю большой проект и получаю эту ошибку

*** glibc detected *** p_appmanager/obj/appmanager: corrupted double-linked list: 0x08325e18 **

Я попытался отладить код с valgrind, но я не очень хорошо знаком с этим инструментом. Поэтому я демпинг журналов здесь, если вы можете узнать что-нибудь из них, пожалуйста, дайте мне знать.

Может ли кто-нибудь объяснить, что может означать следующее сообщение об ошибке?

==2181== Invalid read of size 1
==2181==    at 0x402C658: strlen (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x40FCC2D: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x4359234 is 12 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
==2181== Invalid read of size 1
==2181==    at 0x402C663: strlen (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x40FCC2D: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x4359235 is 13 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
==2181== Invalid read of size 4
==2181==    at 0x402DA08: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x4106850: std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40D8CDF: std::basic_filebuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40FC9AA: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40FCC3D: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x4359234 is 12 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
==2181== Invalid read of size 2
==2181==    at 0x402DA60: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x4106850: std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40D8CDF: std::basic_filebuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40FC9AA: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40FCC3D: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x4359238 is 16 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
==2181== Invalid read of size 1
==2181==    at 0x402DA90: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x4106850: std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40D8CDF: std::basic_filebuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40FC9AA: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40FCC3D: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x435923a is 18 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
==2181== Invalid read of size 1
==2181==    at 0x402DA9C: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x4106850: std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40D8CDF: std::basic_filebuf<char, std::char_traits<char> >::xsputn(char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40FC9AA: std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x40FCC3D: std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x43f0936 is 14 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
stop tablet
==2181== Invalid read of size 1
==2181==    at 0x402C658: strlen (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x4108EF1: std::string::operator=(char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x45b2e14 is 12 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
==2181== Invalid read of size 1
==2181==    at 0x402C663: strlen (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x4108EF1: std::string::operator=(char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x45b2e15 is 13 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
==2181== Invalid read of size 1
==2181==    at 0x402DAEA: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x4108C7A: std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4108CF8: std::string::assign(char const*, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4108F05: std::string::operator=(char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x45b2e19 is 17 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
==2181== Invalid read of size 4
==2181==    at 0x402DB18: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x4108C7A: std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4108CF8: std::string::assign(char const*, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4108F05: std::string::operator=(char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x45b2e14 is 12 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
Success:: tablet process terminated Successfully.
CONSOLE>start tablet
Success:: tablet Process Created Successfully
CONSOLE>stop tablet
==2181== Invalid read of size 4
==2181==    at 0x402DA08: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x4108C7A: std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4108CF8: std::string::assign(char const*, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4108F05: std::string::operator=(char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x45dd8c4 is 12 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 
==2181== Invalid read of size 2
==2181==    at 0x402DA60: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x4108C7A: std::string::_M_replace_safe(unsigned int, unsigned int, char const*, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4108CF8: std::string::assign(char const*, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4108F05: std::string::operator=(char const*) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181==  Address 0x45dd8c8 is 16 bytes inside a block of size 21 free'd
==2181==    at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==2181==    by 0x410899A: std::string::_Rep::_M_destroy(std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==2181==    by 0x4071B37: void std::_Destroy_aux<false>::__destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x40717DC: void std::_Destroy<std::string*>(std::string*, std::string*) (in /usr/lib/libparser.so)
==2181==    by 0x4071041: void std::_Destroy<std::string*, std::string>(std::string*, std::string*, std::allocator<std::string>&) (in /usr/lib/libparser.so)
==2181==    by 0x407088A: std::vector<std::string, std::allocator<std::string> >::~vector() (in /usr/lib/libparser.so)
==2181==    by 0x406F497: Parser::parse(std::string) (in /usr/lib/libparser.so)
==2181==    by 0x40729E2: getMessage(int, Message**) (in /usr/lib/libparser.so)
==2181==    by 0x804CB99: fifoThread(void*) (in /home/cleanhands/SBISSW (2)/p_appmanager/obj/appmanager)
==2181==    by 0x4054D4B: start_thread (pthread_create.c:308)
==2181==    by 0x4269DDD: clone (clone.S:130)
==2181== 

Ответ 1

Похоже, что поток печатает данные (char* символьные данные), которые уже были освобождены в основном (или другом) потоке.

Более конкретно, Parser::parse создает a vector из std::string s.


РЕДАКТИРОВАТЬ В соответствии с запросом в комментарии, это то, что я читал, с [highlights]:

==2181== [Invalid read of size 1]
==2181== at 0x402C658: strlen (in /usr/lib/valgrind/vg...
==2181== by 0x40FCC2D: std::basic_ostream<char, std::c...
==2181== by 0x4054D4B: start_thread (pthread_create.c:...
==2181== by 0x4269DDD: clone (clone.S:130)
==2181== [Address 0x4359234] is 12 bytes inside [a block of size 21 free'd]
==2181== at 0x402ACFC: operator delete(void*) (in /usr...
==2181== by 0x410899A: std::string::_Rep::_M_destroy(s...
==2181== by 0x4071B37: void std::_Destroy_aux<false>::...
==2181== by 0x40717DC: void std::_Destroy<std::string*...
==2181== by 0x4071041: void std::_Destroy<std::string*...
==2181== by 0x407088A: std::vector<std::string, std::a... [::~vector()] (in /usr/lib/libparser.so
==2181== by 0x406F497: [Parser::parse(std::string)] (in /usr/lib/libparser.so
==2181== by 0x40729E2: getMessage(int, Message**) (in ...
==2181== by 0x804CB99: fifoThread(void*) (in /home/cle...
==2181== by 0x4054D4B: start_thread (pthread_create.c:...
==2181== by 0x4269DDD: clone (clone.S:130

И я заметил, что другие backtracecs все выделяют один и тот же шаблон.


По-видимому, некоторые потоки (-ы) запускаются, и они передаются ссылки (in) на эти строки. Однако, поскольку вектор является локальным для Parser::parse (вероятно, автоматическая переменная или явно удалена), ссылки более недействительны (например, в то время, когда строки передаются с использованием std::ostream::operator<<(std::ostream&, const char*)).

К сожалению, трассировка стека не совсем показывает, какой модуль имени/объекта содержит строку нарушения, но вы можете видеть, что она живет в отдельном потоке (из-за наличия start_thread)

Изменить. По-видимому, поток ссылаются на string (от вектора), потому что поток также пытается назначить строки другому string.

Это может означать, что программисту было известно о том, что подтверждение не было надежным и пытается скопировать его в локальную переменную потока. Может быть, это просто связано с состоянием гонки, а string даже не живет достаточно долго, чтобы локальная копия работала.

IOW. Похоже, что поток запускается как таковой:

#include <future>
#include <algorithm>
#include <sstream>
#include <iterator>
#include <iostream>

using namespace std;

// sample: return the largest integer value or 42
int some_background_worker(vector<string> const& ref_data)
{
    if (ref_data.empty()) return 42;

    vector<int> values(ref_data.size());
    transform(begin(ref_data), end(ref_data), begin(values), 
            [](string const& s) { return stoi(s); });
    return *max_element(begin(values), end(values));
}

struct Parser
{
    future<int> parse(string const& msg) const
    {
        istringstream iss(msg);
        istream_iterator<string> f(iss), l;

        const vector<string> data { f, l };

        // now dispatch a thread to do the work
        return async(some_background_worker, ref(data));
    }
};

int main() // mimicks your "fifoThread" function
{
    // we use a simple vector to stub your fifo queue:
    const std::vector<string> fifoQueue { "1 3 9 -1 2", "32389 3102 -34 -888", "-42 -889", "" };

    vector<future<int>> results;

    {
        Parser parser;
        for(auto& msg : fifoQueue)
            results.push_back(parser.parse(msg));
    }

    // all parser data has been throroughly destroyed, before we might even
    // start the workers
    for(auto& fut: results)
        std::cout << "result of worker: " << fut.get() << "\n";
}

Здесь возникает одно и то же условие гонки, так как ссылка на данные "скоро будущие" передается в поток:

async(some_background_worker, ref(data));

Он падает с bad_alloc в моей системе (что является фиктивным, но прекрасно прекрасным Undefined Поведением).

Как я уже говорил выше, вызовы std::string:: assign могут указывать, что поток пытается скопировать данные локально, например:

vector<string> local_copy(ref_data);

Но это будет еще, так как (без явной синхронизации) нет гарантии, что ref_data действительно даже в этой точке.


Исправьте его, переместив данные в поток:

int some_background_worker(vector<string> data);

// and then, in parse(...):
    async(some_background_worker, std::move(data));

Теперь в моей системе он запускается и печатает

result of worker: 9
result of worker: 32389
result of worker: -42
result of worker: 42

полностью, как ожидалось. Посмотрите, как он работает вживую в Coliru