実は、代わりにこちらを試してほしい。こちらの方がより正確だ:
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
& 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
マルッティ・マルミのメール(2010年3月5日 00:09 UTC)& 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); } gdb でデバッグ中に取得した別のテストランの debug.log を送ります。プログラムはデバッグ行「irc 8」の後にメモリーを食い始め、数秒以内に
サトシ・ナカモトのメール(2010年3月3日 17:15 UTC)terminate called after throwing an instance of 'std::bad_alloc'でクラッシュしました。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 をしなくても同じ現象が起きるか?
以下の 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月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 のビルドをもう一度送ってもらえるか?自分のビルドの問題なのか確認したい。