From: Minero Aoki Date: 2002-11-03T12:13:47+09:00 Subject: [ruby-dev:18619] Re: racc segv revisited あおきです。 In mail "[ruby-dev:18617] Re: racc segv revisited" "Akinori MUSHA" wrote: >  その後 SMP な FreeBSD/alpha マシンでかなり時間を割いて調べている > のですが、 rdinlineparser.ry を racc に通すと、 rb_reg_search() が すみません。忘れてました。 >  1.6.8 リリースまでになんとかしたいところですが、どうも煮詰まって > しまったので、幾分かでもヒントを出し合う形になればと思い、中間報告 > しておきます。 こちらも当面わかっていることを書いておきます。 どうも不確実なことばかりなのが申し訳ないのですけど。 * 症状が確認されている環境 1. FreeBSD/Alpha 4.4RELEASE gcc 2.95.3 20010315 (release) [FreeBSD] CFLAGS = -O -pipe -mcpu=ev56 -fPIC 2. NetBSD 1.5.3_ALPHA/alpha ruby-1.6.6nb1 3. NetBSD 1.5.2 alpha (ただし chroot で環境を作っているのでカーネルは 1.5ZA) gcc 2.95.3 20010315 (release) (NetBSD nb1) 4. FreeBSD/Alpha 4.4RELEASE (自機) gcc 2.95.3 ruby 1.6.7 CFLAGS = -pipe -g * NetBSD では 1.5.2 が× 1.5ZA は○ * 1.5.2 → 1.5ZA での crtbegin.o crtend.o ld.elf_so あたりの 変更 (詳細はわからないが ELF まわりの変更らしい) を 1.5.2 に 適用すると直る? しかし 1.5.3 でも再発したらしいので これは外れの可能性が高い。 * Linux/Alpha では起きない * 最近の ruby 1.7 にすると落ちない (偶然か?) * 落ちる個所の output.rb:261 周辺だけ切り出しても落ちない (これも偶然?) * Racc の拡張ライブラリは関係ない (いま外して再確認した) 家でいま取ったスタックトレースも付けます。 Program received signal SIGSEGV, Segmentation fault. 0x12008ccd4 in init_regs (regs=0x120104268, num_regs=538832760) at regex.c:3468 3468 regs->beg[i] = regs->end[i] = -1; (gdb) bt #0 0x12008ccd4 in init_regs (regs=0x120104268, num_regs=538832760) at regex.c:3468 #1 0x12008cdf0 in ruby_re_match (bufp=0x1200760ac, string_arg=0x3 , size=301842456, pos=0, regs=0x11fdc5d8) at regex.c:3563 #2 0x12008c878 in ruby_re_search (bufp=0x120075fd4, string=0x11fdc018 "\220\n\n \001", size=538156328, startpos=1, range=10240, regs=0x1200a0a90) at regex.c:3259 #3 0x1200760ac in rb_reg_search (re=0, str=4833033184, pos=0, reverse=0) at re.c:614 #4 0x1200a0a90 in rb_str_index_m (argc=4, argv=0x0, str=23) at string.c:679 #5 0x1200195f8 in call_cfunc (func=0x1203052c0, recv=4835005152, len=0, argc=1, argv=0x12001a6b8) at eval.c:4257 #6 0x12001a3a0 in rb_call0 (klass=11, recv=4834540896, id=4831886128, argc=3, argv=0x11ffb7f0, body=0x11fdc548, nosuper=539132400) at eval.c:4394 #7 0x12001b064 in rb_call (klass=0, recv=4834686432, mid=261, argc=0, argv=0x1ffffffff, scope=538832960) at eval.c:4614 #8 0x120012a14 in rb_eval (self=4832976792, n=0x0) at eval.c:2526 #9 0x120013b38 in rb_eval (self=4833823296, n=0x1202853f0) at eval.c:2690 #10 0x120010c24 in rb_eval (self=4835358720, n=0x16025d978) at eval.c:2025 #11 0x1200170c4 in rb_yield_0 (val=4833129024, self=4833036904, klass=4831942176, acheck=301856800) at eval.c:3622 #12 0x1200174b0 in rb_yield (val=0) at eval.c:3710 #13 0x1200b9a04 in rb_ary_each (ary=4833129024) at array.c:630 #14 0x120019620 in call_cfunc (func=0, recv=0, len=0, argc=0, argv=0x0) at eval.c:4260 (以下略) 落ちてるところは同じですが、こっちは num_regs も変な値になって ます。引数の文字列もおかしい。……というように、とにかく全面的 に変すぎです。#3 の re=0 なんか、本当にこの値ならその時点で 落ちないとまずいし。 ------------------------------------------------------------------- 青木峰郎