From: WATANABE Tetsuya Date: 1998-06-24T09:16:49+09:00 Subject: [ruby-dev:3001] Re: experimental release 1.1b9_27 >>>>> "W" == WATANABE Tetsuya writes: W> しばらく ruby-1.1b9_25 を使ってみて、現象が起きないことを確認 W> してから(条件により違ってきたりするので)、 入力ファイルをでかいものにしたら ruby-1.1b9_25 でも 発生しました(eval.c はオリジナルもの)。ということで、 ruby-1.1b9_25 で起きないというのは私の確認不足でし た。 ------------------------------ $ /t/bin/ruby =hd.rb -n Xerr.txt-2 > /dev/null /home/tetsu/bin/hd.rb:77: [BUG] Segmentation fault ------------------------------ ------------------------------ #0 0x4007dc29 in __kill () #1 0x4004f5d9 in raise (sig=134888636) #2 0x808336d in posix_signal () #3 0xbfffe628 in ?? () #4 0x400b8840 in av_ () #5 0x400b8838 in av_ () #6 0x400b8830 in av_ () #7 0x400b8828 in av_ () #8 0x80ca608 in ?? () #9 0x39 in ?? () Cannot access memory at address 0x46747865. ------------------------------ いまのところ現象が確認できているスクリプトはこれだ けなので、お邪魔かもしれませんが添付します。 「特定の条件で必ず発生する」と、書けないのが面倒な ところなのです。入力ファイルが大きい場合は起きやす いです。起きるデータは必ず起きますけど、データのパ ターンではないようなのです。というのは、ソースコー ドにコメントを増やしたりするだけで、発生パターンが 変化してしまうので... (変だなぁ 私の環境だけかなぁ) ------------------------------ #! /usr/local/bin/ruby # /home/tetsu/src/ruby/toolbox/hd.rb # Created: February 22,1998 Sunday 18:39:06 # Author: tetsu(WATANABE Tetsuya) # $Id: hd.rb,v 1.16 1998/06/21 17:06:16 tetsu Exp tetsu $ # usage: hd.rb -byte -little -sE -0100 /vmlinuz | less # Thanks [ruby-list:8395] hd.rb 1.8 patch/鄭 明毅 require 'kconv' RCS_ID = %q$Id: hd.rb,v 1.16 1998/06/21 17:06:16 tetsu Exp tetsu $ def usage STDERR.print < 0 begin f.pos = offset rescue offset = 0 end end l_unpackformat = Unpackformat[$datasize][$endian] + '*' unpackformat = Unpackformat[$datasize][$endian] l_packformat = Unpackformat[$datasize][:little] + '*' packformat = Unpackformat[$datasize][:little] dumpformat = Dumpformat[$datasize] dumplastformat = Dumplastformat[$datasize] while $_ = f.read(16) and $_.length == 16 bin = $_.unpack(l_unpackformat) $_ = bin.pack(l_packformat) if $datasize != 1 and $byteswap printf(dumpformat, offset, *bin) print $_.tr("\000-\037\177", '.').bin_to_str, "\n" offset += 16 end if $_ and $_.length > 0 n = $_.length / $datasize left_byte = $_.length % $datasize bin = $_.unpack(unpackformat + n.to_s + 'a' + left_byte.to_s) if $datasize != 1 and $byteswap $_ = bin[0..n-1].pack(packformat + n.to_s) if left_byte > 0 $_ += format('%' + $datasize.to_s + 's', bin[-1].unpack('C*').reverse.pack('C*')) end end n.times {|i| bin[i] = format(dumplastformat, bin[i]) } if left_byte > 0 w = bin[-1].split('') if $byteswap w.reverse! end foo = '' w.each_index {|i| foo += format('%2.2x', w[i][0]) } bin[-1] = foo + if $byteswap '' else ' ' * ($datasize - left_byte) end end (16/$datasize - bin.size).times { bin.push(' ') } printf(dumpformat.gsub('x', 's'), format('%08x', offset), *bin) print $_.tr("\000-\037\177", '.').bin_to_str, "\n" end end Dumpformat = { 4 => '%08x %08x %08x %08x %08x ', 2 => '%08x ' + '%04x %04x %04x %04x ' * 2, 1 => '%08x ' + '%02x %02x %02x %02x ' * 4 } Dumplastformat = { 4 => '%8.8x', 2 => '%4.4x', 1 => '%2.2x' } Unpackformat = { 4 => { :big => 'N', :little => 'V' }, 2 => { :big => 'n', :little => 'v' }, 1 => { :big => 'C', :little => 'C' }, } $endian = :big $byteswap = false $datasize = 4 $no_kanji = false $kanji_chip = '' $in_kanji_code = Kconv::EUC $out_kanji_code = Kconv::EUC offset = 0 while $_ = ARGV[0] and /^-/ case ARGV.shift when /^-0([0-7]+)$/ offset = $1.oct when /^-0x([\da-fA-F]+)$/ offset = $1.hex when /^-(\d+)$/ offset = $1.to_i when '-byte' $datasize = 1 when '-short' $datasize = 2 when '-long' $datasize = 4 when '-big' $endian = :big when '-little' $endian = :little $byteswap = true when /^-[sen]+$/i if /n/i then $no_kanji = true else $in_kanji_code = if /s/ then Kconv::SJIS elsif /e/ then Kconv::EUC end $out_kanji_code = if /S/ then Kconv::SJIS elsif /E/ then Kconv::EUC end end else usage end end if $in_kanji_code == Kconv::EUC $kanji_re = /((?:[\241-\376][\241-\376])+)/n $kana_re = /((?:\216[\241-\337])+)/n $kanji_chip_re = /^[\216\241-\376]$/n else $kanji_re = /((?:[\201-\237\340-\357][\100-\176\200-\374])+)/n $kana_re = /([\241-\337]+)/n $kanji_chip_re = /^[\201-\237\340-\357]$/n end if ARGV.length == 0 hd(STDIN, offset) else while file = ARGV.shift f = File.open(file) hd(f, offset) f.close end end exit ------------------------------ -- WATANABE Tetsuya HP Japan e-mail tetsu@jpn.hp.com