From: Koji Arai Date: 1998-12-21T00:48:59+09:00 Subject: [ruby-dev:3876] Re: ruby-1.1c9 install 中に SEGV 新井です。 ruby-1.1c9 をEWS48にインストールしている最中に Segmentation Faultする件です。調査に進展があったの で報告します。 まず、以下の再現スクリプトで再現します。 while gets from = $_.chomp if FileTest.readable?(from) $stderr.print from, " -> ", "/tmp/hoge", "\n" end end このスクリプト(hoge.rb)で、 locate / | ruby hoge.rb などと大量にファイルパスを与えると再現しました。 ただし、再現するのはEWS4800 R9.1のみで、R11.2やLinuxでは このスクリプトでは再現しませんでした。 これをデバッガ(dbx)で追いかけたところ st.c:st_lookup()の133行目の 124 int 125 st_lookup(table, key, value) 126 st_table *table; 127 register char *key; 128 char **value; 129 { 130 int hash_val; 131 register st_table_entry *ptr; 132 133 hash_val = do_hash(key, table); 134 135 FIND_ENTRY(table, ptr, hash_val); do_hash()で、tableが指す領域が (/usr/bin/dbx) 0x598890/10c 00598890: '/' 'h' 'o' 'm' 'e' '/' 'a' 'r' 'a' 'i' などとただの文字列になっているのが原因でした。 さらに、この領域が渡される原因を追いかけたところ、 eval.cのrb_eval()の1983行目で 1975 case NODE_CALL: 1976 { 1977 VALUE recv; 1978 int argc; VALUE *argv; /* used in SETUP_ARGS */ 1979 TMP_PROTECT; 1980 1981 BEGIN_CALLARGS; 1982 recv = rb_eval(self, node->nd_recv); 1983 SETUP_ARGS(node->nd_args); 1984 END_CALLARGS; SETUP_ARGS()で argv[1] -> "->" argv[2] -> "/tmp/hoge" argv[3] -> "\n" となっているところで、argv[1] の値が (dbx) argv[1]/4X 00504180: 00000007 0053cca0 00000004 00567ac0 (dbx) 0x567ac0/10x 00567ac0: 202d 3e20 0000 0000 0000 0009 0000 0000 00567ad0: 0a00 7ad8 (dbx) 0x567ac0/10c 00567ac0: ' ' '-' '>' ' ' ' ' ' ' ' ' から、 (dbx) 0x00504180/4X 00504180: 00000000 00504168 00000004 00567ac0 ^^^^^^^^ ^^^^^^^^ と値が壊されているためです。このようになるのは、 SETUP_ARGS()の中でargv[3]にstr_new3()で"\n" が割り 当てられるときです。 もう少し追いかけたところ、str_new3()の中でgc_gc()が呼ばれ 844 gc_mark_trap_list(); 845 846 gc_sweep(); 847 dont_gc--; 848 } 849 846行目 gc_sweep()で、 585 gc_sweep() 586 { 609 610 while (p < pend) { 611 if (!(p->as.basic.flags & FL_MARK)) { 612 if (p->as.basic.flags) obj_free((VALUE)p); 613 p->as.free.flag = 0; 614 p->as.free.next = nfreelist; 615 nfreelist = p; 616 n++; 617 } 614 p->as.free.next = nfreelist; 613行目が実行されたときに 0x504810 (argv[1]の指す先)が、00000007から00000000 に書き変わってました。 (dbx) n; 0x00504180/4X [.block207:613 ,0x4310fc] p->as.free.flag = 0; 00504180: 00000007 0053cca0 00000004 00567ac0 (dbx) n; 0x00504180/4X [.block207:614 ,0x431108] p->as.free.next = nfreelist; 00504180: 00000000 0053cca0 00000004 00567ac0 つまり、 (dbx) p p 0x504180 となってしまったためです。(というか、FL_MARK が付 いていなかったためかも) 1.1c9には、 [ruby-dev:3688] Re: ruby 1.1c9 released [ruby-dev:3712] Re: [BUG?] fork(2) and read(2) [ruby-dev:3721] Re: new delegator [ruby-dev:3733] Re: about ext/{tk,tcltklib}/Makefile [ruby-dev:3749] Error message in dln.c(Win32) [ruby-dev:3765] Re: new delegator [ruby-list:11125] [BUG] exec [ruby-list:11131] Re: tk.rb: font name [ruby-list:11154] Re: tk.rb: font name [ruby-list:11172] sample/cal.rb [ruby-list:11197] Re: ruby-pcap [ruby-list:11251] Re: variable $0 [ruby-list:11287] Re: require error? [ruby-list:11329] Re: How to use GTK::timeout? [ruby-list:11331] Re: How to use GTK::timeout? の修正をいれてます。(いれなくても、同現象が再現します) 1.1d0は、まだインストールもしてません。 どなたか以上の現象から原因が分かる人いません?