kaw
kawと申します。
Schemeはかなり前から興味を持っているのですが、なかなかモノになりません。
最近OpenBSDでGaucheがコンパイルできるようになったのが嬉しいです。
ヘタレなコーディングしかできませんが、よろしくです。
Gauche入りLive CD 2006/05/27 00:26:40 PDT
最新は、OpenBSD 4.0 + Gauche 0.8.7 です、どうぞご利用下さい。
httpdの雛型を書いてみる。
子プロセス起動による並行サーバ(の雛型)を書いてみたのですが、Memory faultで落ちてしまいます。(2004/05/24 15:53:53 PDT)
(ハイスペックマシンだと、なかなか再現しないかもしれません 2004/05/24 19:14:57 PDT)
ab -n1000 -c3 http://192.168.1.2:20080/index.html
$ gosh ./sampleserver.scm starting up server with port 20080 Parent: reading socket... Parent: 30055/1 child process forked Child: 30055/1 forked Parent: reading socket... Child: 23225/2 forked Parent: 23225/2 child process forked Parent: reading socket... Parent: 13056/3 child process forked : : : Parent: xxx/7 SIGCHLD caught Child: 13000/7 forked Child: 9478/xxx, Got ("GET" "/index.html" "HTTP/1.0") Child: 31911/xxx, Got ("GET" "/index.html" "HTTP/1.0") Child: 9478/6 http session done, exiting... Child: 13000/xxx, Got ("GET" "/index.html" "HTTP/1.0") Child: 31911/6 http session done, exiting... Child: 13000/7 http session done, exiting... Memory fault (core dumped) $
Gauche 0.7.4.2使用し、OpenBSD 3.5及びLinux 2.6.6で走らせた環境で発生しました。 プラットフォームに依存しない問題のようなのですが‥。
Linuxですと、以下の場所で落ちていました (2004/05/25 16:50:21 PDT)
kaw@nimbus5:~/Desktop/Scheme$ gdb /usr/local/bin/gosh core GNU gdb 5.2.1 Copyright 2002 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu"... Core was generated by `gosh sampleserver.scm'. Program terminated with signal 11, Segmentation fault. Reading symbols from /usr/local/lib/libgauche.so...done. Loaded symbols for /usr/local/lib/libgauche.so Reading symbols from /lib/libdl.so.2...done. Loaded symbols for /lib/libdl.so.2 Reading symbols from /lib/libcrypt.so.1...done. Loaded symbols for /lib/libcrypt.so.1 Reading symbols from /lib/libutil.so.1...done. Loaded symbols for /lib/libutil.so.1 Reading symbols from /lib/libm.so.6...done. Loaded symbols for /lib/libm.so.6 Reading symbols from /lib/libc.so.6...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /lib/ld-linux.so.2...done. Loaded symbols for /lib/ld-linux.so.2 Reading symbols from /usr/local/lib/gauche/0.7.4.2/i686-pc-linux-gnu/libnet.so...done. Loaded symbols for /usr/local/lib/gauche/0.7.4.2/i686-pc-linux-gnu/libnet.so #0 0x400338f9 in run_loop () at vm.c:789 789 e = e->up; (gdb) bt #0 0x400338f9 in run_loop () at vm.c:789 #1 0x400ed74c in __DTOR_END__ () from /usr/local/lib/libgauche.so (gdb) list 784 int off = SCM_VM_INSN_ARG1(code); 785 ScmEnvFrame *e = env; 786 787 for (; dep > 0; dep--) { 788 VM_ASSERT(e != NULL); 789 e = e->up; 790 } 791 VM_ASSERT(e != NULL); 792 VM_ASSERT(e->size > off); 793 val0 = ENV_DATA(e, off); (gdb)
...Schemeより先にCやgdbの使いかたを覚えなければならんのだろうか...?
- Shiro(2004/05/26 02:00:58 PDT): 確かにうちの環境でも再現しました。 再現性が悪いのでてこずりそうですが、どっかメモリを壊してるバグっぽいので 追ってみます。
- kaw (2004/05/26 07:11:22 PDT): 現象を確認頂けたようで、ありがとうございます。わたし自身はGaucheのコードをどうこうできるようなスキルはないのですが、何か新しいことが判明したらこのページで報告します。
- あと、OpenBSDの方はgdbでバックトレースを取っても落ちた箇所のソースが表示されません。コンパイルオプションは同じなのですが‥。もう一度コンパイルしなおしてみます。
- kaw (2005/02/21 04:03:41 PST): Gauche 0.83にて試したところ、現象が発生しなくなっています。すでに修正していただいたんでしょうか? それとも、Boehm GC あたりのバージョン変更により出なくなったのでしょうか?
- Shiro(2005/02/21 21:28:28 PST): 直接このために直したことはないんですが、 シグナルを受けるタイミングによってVMのレジスタの状態がおかしくなるバグを 2004/11に直しているのでそのせいかもしれません。