[ruby-list:47691] Re: プログラム実行時に「[BUG] Segmentation fault」
From:
染谷 康一 <kouichi_someya@...>
Date:
2010-12-12 07:39:39 UTC
List:
ruby-list #47691
再び、染谷です。
今度は、DLで組んでみましたが、またセグメンテーション・
フォルトが発生しました。
DLで組んだPGは、以下の通りです。
=== ここから =====================================================
require 'dl'
require 'dl/import'
module FelicaLib
extend DL::Importable
dlload 'felicalib.dll'
typealias 'uint8', 'unsigned char'
typealias 'uint16', 'unsigned int'
#typealias 'uint16', 'unsigned short int'
extern "pasori* pasori_open(char*)"
extern "void pasori_close(pasori*)"
extern "int pasori_init(pasori *)"
extern "felica *felica_polling(pasori *, uint16, uint8, uint8)"
extern "void felica_free(felica *)"
extern "void felica_getidm(felica *, uint8 *)"
extern "void felica_getpmm(felica *, uint8 *)"
extern "int felica_read_without_encryption02(felica *, int, int, uint8, ui
nt8 *)"
extern "felica * felica_enum_systemcode(pasori *)"
extern "felica * felica_enum_service(pasori *, uint16)"
POLLING_ANY = 0xffff
POLLING_EDY = 0xfe00 #-- システムコード: 共通領域 (Edy などが使
用)
POLLING_SUICA = 0x0003 #-- システムコード: サイバネ領域
SERVICE_EDY = 0x170f
SERVICE_SUICA_INOUT = 0x108f
SERVICE_SUICA_HISTORY = 0x090f
end
module FelicaLib
class << self
def felica_raw_values(systemcode, servicecode, little_endian = false)
values = []
buf = 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, buf
) == 0
row = buf.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
=== ここまで =====================================================
実行PGは、前メールと同じなので省略します。
実行したところ、前と同じメッセージが出てしまいました。
どこまで実行されたか確認するため、デバッグモードで
実行してみました。
出力結果は以下の通りです。
=== ここから =====================================================
C:\TEMP>ruby -d felica_dump.rb
"[DL] call pasori_open with [\"\"]"
"[DL] retval=#<DL::PtrData:0x28c3f00 ptr=0x2a429d0 size=0 free=0x0> args=[\"\"
]"
"[DL] call pasori_init with [#<DL::PtrData:0x28c3f00 ptr=0x2a429d0 size=0 free
=0
x0>]"
"[DL] retval=0 args=[#<DL::PtrData:0x28c3f00 ptr=0x2a429d0 size=0 free=0x0>]"
"[DL] call felica_polling with [#<DL::PtrData:0x28c3f00 ptr=0x2a429d0 size=0 f
re
e=0x0>, 3, 0, 0]"
"[DL] retval=nil args=[#<DL::PtrData:0x28c3f00 ptr=0x2a429d0 size=0 free=0x0>,
3
, 0, 0]"
"[DL] call felica_read_without_encryption02 with [nil, 2319, 0, 0, [nil, nil,
ni
l, nil]]"
(eval):5: [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.
=== ここまで =====================================================
felicalib.dllがいけないでしょうか?
組み方がいけないのでしょうか?
何方か、ご教授お願いします。
以上
----- Original Message -----
>Date: Fri, 10 Dec 2010 12:34:02 +0900
>From: 染谷 康一 <kouichi_someya@mbe.nifty.com>
>Subject: [ruby-list:47683] Re: プログラム実行時に「[BUG] Segmentation
> fault」
>To: ruby-list@ruby-lang.org (ruby mailing list)
>
>
>染谷です。
>
>なかむら(う)さん、ありがとうございます。
>
>Win32APIでポインタが使えなかったんですね。
>
>DLで組んでみます。
>
>ご教授、ありがとうございました。
>