损坏的双链表
corrupted double-linked list?
我只是在调试一个大项目并收到此错误
*** 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==
看起来像一个线程正在打印已经在主(或其他(线程上释放的数据(char*
字符数据(。
更具体地说,Parser::parse
构建了 std::string
s 的vector
。
编辑 按照评论中的要求,这是我阅读的内容,带有 [ highlights]
:
==2181==
[Invalid read of size 1
]
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==
]
==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
Parser::parse
std::ostream::operator<<(std::ostream&, const char*)
我注意到其他回溯都突出显示了相同的模式。
显然,一些线程开始了,它们被传递给这些字符串的引用(in(。但是,由于向量是start_thread
的局部(可能是自动变量,或显式删除(,因此引用不再有效(例如,在使用string
流式传输字符串时(。
可悲的是,堆栈跟踪并没有完全显示哪个名称/对象模块包含违规行,但您可以看到它存在于单独的线程上(由于存在string
(
编辑 显然,线程引用string
s(来自矢量(,因为线程还试图将字符串分配给另一个bad_alloc
。
这可能表明程序员知道引用不可靠,并尝试将其复制到线程局部变量。也许只是涉及竞争条件,ref_data
甚至没有足够的寿命让本地副本工作。
低。似乎线程正在这样启动:
#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));
它在我的系统上CC_52崩溃(这是假的,但完全没问题 未定义的行为(。
就像我上面说的,std::string::assign 调用可能表示线程尝试在本地复制数据,例如:
vector<string> local_copy(ref_data);
但这仍然是一场数据竞赛,因为(没有明确的同步(即使在那时也无法保证CC_53是有效的。
通过将数据移动到线程中来修复它:
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
完全符合预期。观看它在科里鲁的现场运行
- 为什么C中的通用链表中存储的数据已损坏
- 为什么链表中的数据在嵌套函数中会更改/损坏?
- 第一次运行程序时出现损坏的双链表错误,后续运行正常
- glibc 损坏了 RHEL 5 中的双链表
- 中的错误:双链表0xb2808cf8 C++损坏
- C++glibc检测到损坏的双链表错误C++
- 链表实现的堆栈损坏
- glibc 检测小箱链表已损坏
- 链表中C++内存损坏
- C++:glibc检测到损坏的双链表:0x08f8f148
- 我的双向链表中的查找函数损坏
- 我将如何在不损坏列表的情况下删除链表中的节点
- 损坏的双链表
- C++:损坏的双链表和内存损坏
- C++ Linux 中的双链表损坏
- c++ - Smallbin双链表损坏
- 当我在调用append后立即实例化Node时,链表会损坏
- 损坏的双链表:0x0804d0c0 (c++)
- std::map<K, V>.clear() 在损坏的双链表中崩溃
- 机器相关的损坏的双链表错误