From: WATANABE Tetsuya Date: 2007-05-18T00:37:26+09:00 Subject: [ruby-dev:30791] 1.9 coredump 渡辺哲也です。 ruby 1.9.0 (2007-05-17 patchlevel 0) [i686-linux] 上で core して落ちますので報告します。 ------------------------------ $ ./ruby-1.9.0 -Ke /tmp/j.rb *.c *.h */*.c zsh: 29641 segmentation fault (core dumped) ./ruby-1.9.0 -Ke /tmp/j.rb *.c *.h */*.c ------------------------------ -Ke はなくても core します。 gdb の backtrace は string.c tr_setup_table ででているのですが、どうも 不安定のようです。(string.c tr_setup_table そのものは以前と同じようで すので) ------------------------------ #0 0x080a884b in tr_setup_table (str=1080892200, table=0xbf800150 "\200", init=1) at string.c:3144 3144 tr.p = RSTRING_PTR(str); tr.pend = tr.p + RSTRING_LEN(str); (gdb) bt #0 0x080a884b in tr_setup_table (str=1080892200, table=0xbf800150 "\200", init=1) at string.c:3144 #1 0x080a8d6b in rb_str_count (argc=1, argv=0x40309024, str=1080892240) at string.c:3384 #2 0x080bd325 in call_cfunc (func=0x80a8d06 , recv=1080892240, len=1080892200, argc=1, argv=0x7) at call_cfunc.ci:36 #3 0x080bb4a4 in th_eval (th=0x814fef0, initial=0) at insns.def:1279 #4 0x080bcc76 in th_eval_body (th=0x814fef0) at vm.c:1620 #5 0x080bd15f in rb_thread_eval (th=0x814fef0, iseqval=1076863380) at vm.c:1826 #6 0x080be51d in yarvcore_eval_iseq (iseq=1076863380) at yarvcore.c:97 #7 0x080be5ba in yarvcore_eval_parsed (node=0x402fa1d0, file=1076863420) at yarvcore.c:129 #8 0x08059057 in ruby_exec_internal () at eval.c:210 #9 0x08059087 in ruby_exec () at eval.c:223 #10 0x080590bd in ruby_run () at eval.c:242 #11 0x08056abd in main () at main.c:47 #12 0x400d9c1f in __libc_start_main () from /lib/i686/libc.so.6 ------------------------------ ------------------------------ #0 0x080a890c in tr_setup_table (str=0, table=0xbf800170 '\001' ..., init=1) at string.c:3160 3160 buf[c & 0xff] = !cflag; (gdb) bt #0 0x080a890c in tr_setup_table (str=0, table=0xbf800170 '\001' ..., init=1) at string.c:3160 #1 0x080a8d6b in rb_str_count (argc=1, argv=0x40309024, str=1080892240) at string.c:3384 #2 0x080bd325 in call_cfunc (func=0x80a8d06 , recv=1080892240, len=0, argc=1, argv=0x406d1b30) at call_cfunc.ci:36 #3 0x080bb4a4 in th_eval (th=0x814fef0, initial=0) at insns.def:1279 #4 0x080bcc76 in th_eval_body (th=0x814fef0) at vm.c:1620 #5 0x080bd15f in rb_thread_eval (th=0x814fef0, iseqval=1076863380) at vm.c:1826 #6 0x080be51d in yarvcore_eval_iseq (iseq=1076863380) at yarvcore.c:97 #7 0x080be5ba in yarvcore_eval_parsed (node=0x402fa1d0, file=1076863420) at yarvcore.c:129 #8 0x08059057 in ruby_exec_internal () at eval.c:210 #9 0x08059087 in ruby_exec () at eval.c:223 #10 0x080590bd in ruby_run () at eval.c:242 #11 0x08056abd in main () at main.c:47 #12 0x400d9c1f in __libc_start_main () from /lib/i686/libc.so.6 ------------------------------ 再現スクリプト ------------------------------ require 'nkf' while gets("\n") l = $_ break if l.count("\n") > 1 l = NKF.nkf('-Se', l) if l =~ /SIGV/ end end ------------------------------ 再現スクリプトのどの行も最小限必要そうです。処理量関係ではないか? とは思うのですが。 再現方法 ------------------------------ $ cd ruby-1.9 系ソースのトップ $ ./ruby 再現スクリプト *.c *.h */*.c ------------------------------ strace の結果ではほぼ毎回 win32/win32.c で起きているようなのですが、単 純に処理量と思われます。win32/win32.c のファイル一つでは起きません。 確認したシステムは ------------------------------ Vine Linux 3.2 glibc-2.3.3-3vl1.3 Vine Linux 4.1 glibc-2.3.4-2vl3 ------------------------------ です。 Ruby のソースコードレベルのものを扱って気が付いたのですが、いつごろか らか? というのははっきりしません。普段から使っているスクリプトで起きた のですが、扱う量に依存しているようなので、はっきりしませんです。すいま せん。