I am just debugging a big project and and getting this error
*** glibc detected *** p_appmanager/obj/appmanager: corrupted double-linked list: 0x08325e18 **
I have tried to debug the code with the valgrind, but I am not much familiar with this tool. So I am dumping the logs here if you can find out anything from them please let me know.
Can anyone explain what the following error message could mean?
==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==
The "corrupted double-linked list" message is from the implementation of malloc/free that's within glibc (aka the heap). The heap has somehow become corrupted.
The error of double free or corruption in C++ means that our program somehow invokes the free() C++ object with an illegal pointer variable. When we use smart pointers such as shared_ptr, we must check because if we call the function get(), we are directly using the raw pointer.
In computer science, a doubly linked list is a linked data structure that consists of a set of sequentially linked records called nodes. Each node contains three fields: two link fields (references to the previous and to the next node in the sequence of nodes) and one data field.
It looks like a thread is printing data (char*
character data) that was already freed on the main (or another) thread.
More specificly, Parser::parse
builds a vector
of std::string
s.
EDIT As requested in the comment, this is what I read, with [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
And I noticed the other backtracecs all highlighted the same pattern.
Apparently, some thread(s) get started, and they are passed references (in)to these strings. However, since the vector is local to Parser::parse
(probably an automatic variable, or explicitely deleted), the references are no longer valid (e.g. at the time the strings are being streamed using std::ostream::operator<<(std::ostream&, const char*)
).
Sadly, the stack trace doesn't quite show what name/object module contains the offending line, but you can see it lives on a separate thread (due to the presence of start_thread
)
Edit Apparently, the thread(s) take a reference to the string
s (from the vector) because the thread is also trying to assign the strings to another string
.
This might indicate that the programmer was aware of the fact that the refence was not reliable and tries to copy it to a thread-local variable. Maybe it's just that there's a race condition involved and the string
s don't even live long enough for the local copy to work.
IOW. It would appear that a thread is being started as such:
#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"; }
Here, the same race condition occurs, as a reference to "soon-to-be-stale" data is passed to the thread:
async(some_background_worker, ref(data));
It crashes with bad_alloc
on my system (which is bogus, but perfectly fine Undefined Behaviour).
Like I said above, the std::string::assign calls might indicate the thread attempts to copy the data locally, like:
vector<string> local_copy(ref_data);
But that will still be a data race, because (without explicit synchronization) there is no guarantee that ref_data
is valid even at that point.
Fix it by moving the data into the thread instead:
int some_background_worker(vector<string> data); // and then, in parse(...): async(some_background_worker, std::move(data));
Now, on my system, it runs and prints
result of worker: 9 result of worker: 32389 result of worker: -42 result of worker: 42
fully as expected. See it running live at Coliru
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With