2010年12月10日

[ruby-list:47680] Re: プログラム実行時に「[BUG] Segmentation fault」

それはRubyのバグか使用している拡張ライブラリのバグでしょう。

felicalibはdllなども含まれていますか?

2010/12/9 染谷 康一 <kouichi_someya@xxxxx>:
> 染谷と申します。
>
> FelicaLibを使用するプログラムの実行で

> 以下のメッセージが出力されました。
>
> == ここから =============================================
> C:\TEMP>felica_dump.rb
> C:\TEMP/felicalib.rb:54: [BUG] Segmentation fault
> ruby 1.8.7 (2010-08-16 patchlevel 302) [i386-mswin32]
>
>
> This application has requested the Runtime to terminate it in an unusual way.
> Please contact the application's support team for more information.
> == ここまで =============================================
>
> 実行環境は、以下の通りです。
> OS:WindowsXP
> Ruby:Ruby-1.8.7(p302)
>
> felicalib.rbの内容ですが、以下の通りです。
>
> == ここから =============================================
> require 'Win32API'
>
> module FelicaLib
> dllname = 'felicalib.dll'
>
> $pasori_open = Win32API.new(dllname, 'pasori_open', 'P', 'P')
> $pasori_close = Win32API.new(dllname, 'pasori_close', 'P', 'V')
> $pasori_init = Win32API.new(dllname, 'pasori_init', 'P', 'I')
> $felica_polling = Win32API.new(dllname, 'felica_polling', %w(P I I I), 'P'
> )
> $felica_free = Win32API.new(dllname, 'felica_free', 'P', 'V')
> $felica_getidm = Win32API.new(dllname, 'felica_getidm', %w(P P), 'V')
> $felica_getpmm = Win32API.new(dllname, 'felica_getpmm', %w(P P), 'V')
> $felica_read_without_encryption02 = Win32API.new(dllname, 'felica_read_wit
> hout_encryption02', %w(P I I I P), 'I')
> $felica_enum_systemcode = Win32API.new(dllname, 'felica_enum_systemcode',
> 'P', 'P')
> $felica_enum_service = Win32API.new(dllname, 'felica_enum_service', %w(P I
> ), 'P')
>
> POLLING_ANY = 0xffff
> POLLING_EDY = 0xfe00
> POLLING_SUICA = 0x0003
> SERVICE_EDY = 0x170f
> SERVICE_SUICA_INOUT = 0x108f
> SERVICE_SUICA_HISTORY = 0x090f
> #SERVICE_SUICA = 0x090f
>
> def pasori_open(str = nil)
> $pasori_open.call(str)
> end
>
> def pasori_close(pasori)
> $pasori_close.call(pasori)
> end
>
> def pasori_init(pasori)
> $pasori_init.call(pasori)
> end
>
> def felica_polling(pasori, systemcode, rfu, timeslot)
> $felica_polling.call(pasori, systemcode, rfu, timeslot)
> end
>
> def felica_free(felica)
> $felica_free.call(felica)
> end
>
> def felica_getidm(felica, buf)
> $felica_getidm.call(felica, buf)
> end
>
> def felica_getpmm(felica, buf)
> $felica_getpmm.call(felica, buf)
> end
>
> def felica_read_without_encryption02(felica, servicecode, mode, addr, buf)
> $felica_read_without_encryption02.call(felica, servicecode, mode, addr
> , buf)
> end
>
> def felica_enum_systemcode(pasori)
> $felica_enum_systemcode.call(pasori)
> end
>
> def felica_enum_service(pasori, systemcode)
> $felica_enum_service.call(pasori, systemcode)
> end
>
> module_function :pasori_open, :pasori_close, :pasori_init, :felica_polling, :f
> elica_free
> module_function :felica_getidm, :felica_getpmm, :felica_read_without_encry
> ption02
> module_function :felica_enum_systemcode, :felica_enum_service
> end
>
> module FelicaLib
> class << self
> def felica_raw_values(systemcode, servicecode, little_endian = false)
> values = []
> b = Array.new(4)
> psr = pasori_open ""
> pasori_init(psr)
> flc = felica_polling(psr, systemcode, 0, 0)
> i = 0
> while felica_read_without_encryption02(flc, servicecode, 0, i, b) == 0
> row = b.to_a('I')
> data = ""
> row.size.times do |j|
> if little_endian
> 4.times { |k| data += sprintf("%02x", (row[j].to_i >> (8 *
> k)) & 0xff) }
> else
> data += sprintf("%08x", row[j].to_i & 0xffffffff)
> end
> end
> yield data if block_given?
> values << data
> i += 1
> end
> pasori_close(psr)
> values
> end
> end
> end
> ※コメント行削除してあります。
> == ここまで =============================================
>
> このfelicalib.rbの54行目は、
>
> def pasori_init(pasori)
> $pasori_init.call(pasori)  <=この行です。
> end
>
> です。
>
> 私のコーディングに誤りがあるのでしょうか?
>
> 初めて出たメッセージですので、対処方法が
> わかりません。
>
> 恐れ入りますが、何方かご教授ください。
>
> 宜しくお願いします。
>
>
>

--
Shota Fukumori a.k.a. @sora_h - http://codnote.net/


投稿者 xml-rpc : 2010年12月10日 07:19
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/100631
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。