corrupted double-linked list?

62,809

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::strings.


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 strings (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 strings 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

Share:
62,809

Related videos on Youtube

Amit Bhaira
Author by

Amit Bhaira

Let's dig a little bit.

Updated on July 30, 2020

Comments

  • Amit Bhaira
    Amit Bhaira over 3 years

    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== 
    
  • Amit Bhaira
    Amit Bhaira over 10 years
    Thank you very much. You have pinpointed the exact location where the corruption is occurring. "More specificly, Parser::parse builds a vector of std::strings."
  • Amit Bhaira
    Amit Bhaira over 10 years
    but what makes you say that, I mean can you electorate those message to me so that next time I don't need your help.
  • sehe
    sehe over 10 years
    @AmitBhaira I've edited the answer showing how I read the backtraces, with [highlights] showing the things that trigger my analysis. So, in fairness, it was valgrind pinpointing the source of the corruption :)
  • Amit Bhaira
    Amit Bhaira over 10 years
    agree, but to read valgrind's output also require another set of skills , so thanks number 2 :)

Related