Re: Bitcoind

Actually, please try this instead, this is more correct:

void ParseString(const string& str, char c, vector<string>& 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?

Source: Published by Martti Malmi on GitHub in February 2024 as part of his testimony in the COPA v. Wright trial. The full correspondence archive is available at mmalmi.github.io/satoshi/.