ParseString にこの問題があることを確認し、修正した util.cpp を SVN にアップロードした。
string::npos == -1
unsigned int -1 (0xffffffff) と long unsigned int -1 (0xffffffffffffffff) を比較すると、unsigned int が 64 ビットに昇格され、0x00000000ffffffff != 0xffffffffffffffff となる。
マルッティ・マルミのメール(2010年3月5日 01:33 UTC)gdbでデバッグ中に取得した別のテストランのdebug.logを送ります。プログラムはデバッグ行「irc 8」の後にメモリーを食い始め、数秒以内に「terminate called after throwing an instance of ‘std::bad_alloc’」でクラッシュしました。
RecvUntilの中にあるようだが、まだ何が問題なのか分からない。考えられるのは、ソケットが大量の文字を受信している場合くらいだ。
このirc.cppを試してみてほしい。debug.logが急速に大きくなる可能性があるので、すぐに終了できるよう準備しておいてくれ。
サトシ・ナカモトのメール(2010年3月3日 17:15 UTC)debug.logを添付します
かなり絞り込めた。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日 12:32 UTC)getinfoに関係なくエラーが発生します。ThreadIRCSeedをコメントアウトしたところ、問題が解決しました。
getinfoをしなくても同じ現象が起きるか?
以下のCreateThreadsをコメントアウトして、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月3日 03:54 UTC)送ります。クラッシュ時のエラーメッセージを伝え忘れていました:
terminate called after throwing an instance of ‘std::bad_alloc’ what(): std::bad_alloc
debug.logを送ってもらえるか?
マルッティ・マルミのメール(2010年3月3日 01:50 UTC)dddデバッガーでbitcoindのビルドをデバッグしようとしましたが、まだうまくいっていません。いつもシステムのメモリーを全部使い切って最終的にクラッシュしてしまいます。最新の64ビット版bitcoindのビルドをもう一度送っていただけますか?自分のビルドの問題なのか確認したいです。