2010年12月 9日

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

染谷と申します。

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

です。

私のコーディングに誤りがあるのでしょうか?

初めて出たメッセージですので、対処方法が
わかりません。

恐れ入りますが、何方かご教授ください。

宜しくお願いします。

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




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