From: mmalmi@cc.hut.fi Date: Fri, 05 Mar 2010 03:33:34 +0200 To: Satoshi Nakamoto Subject: Re: Bitcoind Great! Works fine now. > Actually, please try this instead, this is more correct: > > void ParseString(const string& str, char c, vector& v) > { > string::size_type i1 = 0; > string::size_type i2; > loop > { > i2 = str.find(c, i1); > if (i2 == str.npos) > { > v.push_back(str.substr(i1)); > return; > } > v.push_back(str.substr(i1, i2-i1)); > i1 = i2+1; > } > } > > > > Satoshi Nakamoto wrote: >> It's in util.c ParseString. I'm guessing the problem is >> incompatibility between the type "unsigned int" and the type of >> str.npos, which is size_type. >> >> Try changing the two "unsigned int"s to "size_type". >> >> old: >> void ParseString(const string& str, char c, vector& v) >> { >> unsigned int i1 = 0; >> unsigned int i2; >> do >> { >> i2 = str.find(c, i1); >> v.push_back(str.substr(i1, i2-i1)); >> i1 = i2+1; >> } >> while (i2 != str.npos); >> } >> >> new: >> void ParseString(const string& str, char c, vector& v) >> { >> size_type i1 = 0; >> size_type i2; >> do >> { >> i2 = str.find(c, i1); >> v.push_back(str.substr(i1, i2-i1)); >> i1 = i2+1; >> } >> while (i2 != str.npos); >> } >> >> >> mmalmi@cc.hut.fi wrote: >>> Here's another test run debug.log I got when debugging with gdb. >>> The program started eating memory after the debug line "irc 8" and >>> within a few seconds crashed with "terminate called after >>> throwing an instance of 'std::bad_alloc'". >>> >>>> It's in RecvUntil, but I still can't see anything wrong with it. The >>>> only thing I can think of is if the socket is receiving a spew of >>>> characters. >>>> >>>> Try this irc.cpp. debug.log may grow rapidly so be ready to kill it. >>>> >>>> mmalmi@cc.hut.fi wrote: >>>>> debug.log attached >>>>> >>>>>> That narrows it down a lot. It didn't print any IRC activity in >>>>>> debug.log, so I guess it couldn't have gotten past the RecvUntil. >>>>>> Eyeballing it I don't see anything obvious. I guess it would have to >>>>>> be either in ConnectSocket or RecvUntil. >>>>>> >>>>>> Try it with the attached irc.cpp and net.cpp and send me the debug.log. >>>>>> >>>>>> Or you could run it in gdb and step through ThreadIRCSeed >>>>>> gdb --args bitcoin [switches] >>>>>> b ThreadIRCSeed >>>>>> run >>>>>> step >>>>>> or u to step over and up out of routines. >>>>>> >>>>>> mmalmi@cc.hut.fi wrote: >>>>>>> I get the error regardless of the getinfo. Commenting out >>>>>>> ThreadIRCSeed fixed the problem. >>>>>>> >>>>>>>> Does it still do it if you didn't do getinfo? >>>>>>>> >>>>>>>> You could comment out the CreateThreads listed below, then re-enable >>>>>>>> them one at a time until it does it again. Then we would know which >>>>>>>> thread the problem is in. >>>>>>>> >>>>>>>> net.cpp, under // Start threads >>>>>>>> CreateThread(ThreadIRCSeed, NULL) >>>>>>>> CreateThread(ThreadSocketHandler, NULL, true) >>>>>>>> CreateThread(ThreadOpenConnections, NULL) >>>>>>>> CreateThread(ThreadMessageHandler, NULL) >>>>>>>> >>>>>>>> init.cpp: >>>>>>>> CreateThread(ThreadRPCServer, NULL); >>>>>>>> >>>>>>>> mmalmi@cc.hut.fi wrote: >>>>>>>>> Here goes. I forgot to mention the crash error message: >>>>>>>>> >>>>>>>>> terminate called after throwing an instance of 'std::bad_alloc' >>>>>>>>> what(): std::bad_alloc >>>>>>>>> >>>>>>>>>> Could you send me the debug.log? >>>>>>>>>> >>>>>>>>>> mmalmi@cc.hut.fi wrote: >>>>>>>>>>> I tried debugging my build of bitcoind with ddd debugger, >>>>>>>>>>> but didn't have much success yet. It always ends up >>>>>>>>>>> taking all the system's memory and finally crashes. >>>>>>>>>>> Could you please send me again the latest 64 bit build >>>>>>>>>>> of bitcoind, so I can see if the problem is about my >>>>>>>>>>> build? >>>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>> >>>>> >>>>> >>> >>> >>> >> >>