ビットコイン・インスティテュート

Re: Bitcoind

実は、代わりにこちらを試してほしい。こちらの方がより正確だ:

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;
     }
}
サトシ・ナカモトのメール(2010年3月5日00:42 UTC)

util.cのParseStringに問題がある。「unsigned int」型とstr.nposの型であるsize_typeの間の非互換性が原因だと推測している。

2つの「unsigned int」を「size_type」に変更してみてほしい。

old: void ParseString(const string& str, char c, vector<string>& 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<string>& 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); }

マルッティ・マルミのメール(2010年3月5日00:09 UTC)

gdbでデバッグ中に取得した別のテストランのdebug.logを送ります。プログラムはデバッグ行「irc 8」の後にメモリーを食い始め、数秒以内にterminate called after throwing an instance of 'std::bad_alloc' でクラッシュしました。

サトシ・ナカモトのメール(2010年3月3日17:15 UTC)

RecvUntilの中で起きているが、まだ何が問題なのか分からない。考えられるのは、ソケットが大量の文字を受信している場合だ。

このirc.cppを試してみてほしい。debug.logが急速に大きくなる可能性があるので、すぐに停止できるようにしておいてほしい。

マルッティ・マルミのメール(2010年3月3日12:32 UTC)

debug.logを添付します。

サトシ・ナカモトのメール(2010年3月3日03:54 UTC)

かなり絞り込めた。debug.logにIRCの活動が一切出力されていないので、RecvUntilを通過できていないのだろう。目視では明らかな問題は見当たらない。ConnectSocketかRecvUntilのどちらかに問題があるはずだ。

添付のirc.cppとnet.cppで試して、debug.logを送ってほしい。

あるいは、gdbで実行してThreadIRCSeedをステップ実行することもできる。gdb —args bitcoin [switches] b ThreadIRCSeed run stepまたはuでステップオーバーしてルーチンから抜ける。

マルッティ・マルミのメール(2010年3月3日01:50 UTC)

getinfoに関係なくエラーが発生します。ThreadIRCSeedをコメントアウトしたら問題が解決しました。

サトシ・ナカモトのメール(2010年3月2日22:27 UTC)

getinfoを実行しなくても同じ現象が起きるかな?

以下に挙げるCreateThreadをコメントアウトして、その後1つずつ有効に戻していき、再び問題が発生するまで試してみてほしい。そうすればどのスレッドに問題があるか分かる。

net.cpp, under // Start threads CreateThread(ThreadIRCSeed, NULL) CreateThread(ThreadSocketHandler, NULL, true) CreateThread(ThreadOpenConnections, NULL) CreateThread(ThreadMessageHandler, NULL)

init.cpp: CreateThread(ThreadRPCServer, NULL);

マルッティ・マルミのメール(2010年3月2日19:36 UTC)

送ります。クラッシュ時のエラーメッセージを伝え忘れていました:

terminate called after throwing an instance of ‘std::bad_alloc’ what(): std::bad_alloc

サトシ・ナカモトのメール(2010年2月28日20:09 UTC)

debug.logを送ってもらえるかな?

マルッティ・マルミのメール(2010年2月28日04:12 UTC)

dddデバッガーでbitcoindのビルドをデバッグしようとしましたが、まだうまくいっていません。いつもシステムのメモリーを全部使い切って最終的にクラッシュしてしまいます。最新の64ビット版bitcoindのビルドをもう一度送っていただけますか? 自分のビルドの問題なのか確認したいです。

原典の外部ソース

https://mmalmi.github.io/satoshi/
2024年2月、COPA対ライト裁判の証言の一環としてGitHubで公開

他の外部ソース