[前][次][番号順一覧][スレッド一覧]

rails:3370

From: eiichi_maekawa@m...
Date: Tue, 26 Jan 2010 11:19:42 +0900
Subject: [rails:3370] 解決しました;; MySQLにDBIでアクセスすると、Segmentation faultが発生


前川です。
自己レスです。

libmysql.dll を、ruby.exeと同一のフォルダにコピーし、
解決できました。

libmysql.dllは、eclipseに同梱されている ・・/xampp/mysql/bin/ のものを使用し
ました。

Mysql5.1のbin/にあるlibmySQL.dllでは、Segmentation faultが生じます。

お騒がせしました。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

eiichi_maekawa@m... wrote on 2010/01/26 10:47:18:

>
> 前川です。
>
> rubyメーリングにも投稿しましたが、反応がありませんでした。
>
> mysqlのデータをdbiを使用して取得したいのですが、
> ("SELECT * FROM aplist")を実行すると、Segmentation faultが発生します。
>
> ググってみたら、
>
> http://rubyforge.org/tracker/index.php?
> func=detail&aid=26791&group_id=234&atid=967
>
> に、同様のレポートがありましたが、解決していないのでしょうか?
> どなたか、ご存知でしたら、ご教示ください。
>
> パソコンの設定で、発生したり、しなかったりする??
>
> テーブル名(show tables)、db名("show databases")の取得は、
> 問題なく実行できます。
>
> よろしくお願いします。
>
>
> バージョンは、以下です。
> C:\>ruby -v
> ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]
>
> MySQL;;5.1
>
> C:\>gem list --local
>
> *** LOCAL GEMS ***
>
> actionmailer (2.3.4)
> actionpack (2.3.4)
> activerecord (2.3.4)
> activeresource (2.3.4)
> activesupport (2.3.4)
> deprecated (2.0.1)
> linecache (0.43)
> mysql (2.8.1)
> rack (1.0.0)
> rails (2.3.4)
> rake (0.8.7)
> ruby-debug-base (0.10.3)
> ruby-debug-ide (0.4.5)
> sinatra (0.9.4)
> sqlite3-ruby (1.2.5)
>
> ソースコード
>
> #!D:/Ruby/bin/ruby.exe -Ks
>
> require "dbi"
>
> begin
>   #dbh = DBI.connect('DBI:Mysql:fbsys:a28341', 'dbuser01', 'dbkey')
>   dbh = DBI.connect("DBI:Mysql:fbsys:localhost", "root", "dbkey")
>   #sth = dbh.prepare("SHOW TABLES") #←OK
>   sth = dbh.prepare("SELECT * FROM aplist")
>   #sth = dbh.prepare("SHOW COLUMNS FROM aplist")
>   #sth = dbh.prepare('DESCRIBE aplist')
>   #sth = dbh.prepare("show databases") #OK
>   puts dbh
>   puts sth
>   sth.execute
>   puts 'count='+sth.rows.to_s #テーブル数のみ有効?
>
>   count = 0
>   sth.fetch { |row|
>     p row
>     count = count + 1
>   }
>   sth.finish
>   puts 'increment count='+count.to_s
> #DB例外発生時の処理
> rescue DBI::DatabaseError => e
>   p "An error occurred"
>   p "Error code: #{e.err}"
>   p "Error message: #{e.errstr}"
>   #切断漏れしないようにensureでdisconnectします。
> ensure
>   dbh.disconnect if dbh
> end
>
> デバッガでの実行結果
> すべて、step (s) で実行しました。
> #以下、デバッガでの実施結果 162行ほどあります。冗長とは思いましたが、
> #すべて、貼り付けました。
>
> D:\Apache2.2\htdocs\ruby_prg\em_ruby\em_db>ruby -r debug
> dbi_mysql_connect.rb
> Debug.rb
> Emacs support available.
>
> dbi_mysql_connect.rb:3:require "dbi"
> (rdb:1) l
> [-2, 7] in dbi_mysql_connect.rb
>    1
>    2
> => 3  require "dbi"
>    4
>    5  begin
>    6    #dbh = DBI.connect('DBI:Mysql:fbsys:a28341', 'dbuser01', 'dbkey')
>    7    dbh = DBI.connect("DBI:Mysql:fbsys:localhost", "root", "dbkey")
> (rdb:1) b 15
> Set breakpoint 1 at dbi_mysql_connect.rb:15
> (rdb:1) b
> Breakpoints:
>   1 dbi_mysql_connect.rb:15
>
> (rdb:1) l
> [8, 17] in dbi_mysql_connect.rb
>    8    #sth = dbh.prepare("SHOW TABLES") #←OK
>    9    sth = dbh.prepare("SELECT * FROM aplist")
>    10    #sth = dbh.prepare("SHOW COLUMNS FROM aplist")
>    11    #sth = dbh.prepare('DESCRIBE aplist')
>    12    #sth = dbh.prepare("show databases") #OK
>    13    puts dbh
>    14    puts sth
>    15    sth.execute
>    16    puts 'count='+sth.rows.to_s #テーブル数のみ有効?
>    17
> (rdb:1) c
> D:/Ruby/lib/ruby/1.8/rational.rb:78: `undefined method `gcd' for
> Rational(1, 2):Rational' (NoMethodError)
>         from D:/Ruby/lib/ruby/site_ruby/1.8/dbi.rb:39:in `require'
>         from D:/Ruby/lib/ruby/site_ruby/1.8/dbi.rb:39
>         from dbi_mysql_connect.rb:3:in `require'
>         from dbi_mysql_connect.rb:3
> D:/Ruby/lib/ruby/1.8/rational.rb:78:    gcd = num.gcd(den)
> (rdb:1) w
> --> #1 D:/Ruby/lib/ruby/1.8/rational.rb:78:in `reduce'
>     #2 D:/Ruby/lib/ruby/1.8/rational.rb:35:in `Rational'
>     #3 D:/Ruby/lib/ruby/1.8/date.rb:517
>     #4 D:/Ruby/lib/ruby/1.8/date.rb:230
> (rdb:1) c
> #<DBI::DatabaseHandle:0x3b2ea14>
> #<DBI::StatementHandle:0x3b2a450>
> Breakpoint 1, toplevel at dbi_mysql_connect.rb:15
> dbi_mysql_connect.rb:15:  sth.execute
> (rdb:1) w
> --> #1 dbi_mysql_connect.rb:15
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:108:
> cancel     # cancel before
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:147:
> sanity_check
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:372:
> raise InterfaceError, "Statement was already
>
> closed!" if @
> handle.nil?
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:372:
> raise InterfaceError, "Statement was already
>
> closed!" if @
> handle.nil?
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:374:
> params.each_key do |key|
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:148:
> @handle.cancel if @fetchable
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:148:
> @handle.cancel if @fetchable
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:149:
> @fetchable = false
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:109:
> sanity_check({:prepared => true })
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:372:
> raise InterfaceError, "Statement was already
>
> closed!" if @
> handle.nil?
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:372:
> raise InterfaceError, "Statement was already
>
> closed!" if @
> handle.nil?
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:374:
> params.each_key do |key|
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:375:
> case key
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:376:
> when :fetchable
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:378:
> when :executed
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:380:
> when :prepared
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:381:
> check_prepared
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:389:
> raise InterfaceError, "Statement wasn't prepared
>
> before."
> unless @prepared
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:389:
> raise InterfaceError, "Statement wasn't prepared
>
> before."
> unless @prepared
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:111:
if
> @convert_types
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:111:
if
> @convert_types
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:112:
> bindvars = DBI::Utils::ConvParam.conv_param
>
> (dbh.driver
> _name, *bindvars)
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/database.rb:18:
> return @driver_name.dup if @driver_name
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/database.rb:18:
> return @driver_name.dup if @driver_name
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/utils.rb:52:        params.collect {
> |param| DBI::TypeUtil.convert(driver_name, param) }
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:115:
> @handle.bind_params(*bindvars)
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/base_classes/statement.rb:75:
> bindvars.each_with_index {|val,i| bind_param
>
> (i+1, val,
>  nil) }
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/base_classes/statement.rb:76:
> self
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/handles/statement.rb:116:
> @handle.execute
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:33:            sql
=
> @prep_stmt.bind(@params)
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/sql/preparedstatement.rb:63:
> if @arg_index < args.size
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/sql/preparedstatement.rb:63:
> if @arg_index < args.size
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/sql/preparedstatement.rb:65:
> elsif @arg_index > args.size
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/sql/preparedstatement.rb:69:
> @unbound.each do |res_pos, arg_pos|
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbi/sql/preparedstatement.rb:73:
> @result.join("")
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:34:
> @mutex.synchronize {
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:35:
> @handle.query_with_result = true
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:36:
> @res_handle = @handle.query(sql)
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:37:
> @column_info = self.column_info
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:119:
> retval = []
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:121:
> return [] if @res_handle.nil?
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:121:
> return [] if @res_handle.nil?
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:123:
> unique_key_flag = MysqlField.const_get
>
> (:UNIQUE_KEY_FLAG)
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:124:
> multiple_key_flag = MysqlField.const_get
>
> (:MULTIPLE_KEY_FLAG)
>
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:125:
> indexed = (unique_key_flag | multiple_key_flag)
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:125:
> indexed = (unique_key_flag | multiple_key_flag)
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:130:
> @res_handle.fetch_fields.each {|col|
> (rdb:1) s
> D:/Ruby/lib/ruby/site_ruby/1.8/dbd/mysql/statement.rb:130: [BUG]
> Segmentation fault
> ruby 1.8.7 (2010-01-10 patchlevel 249) [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.
>
> D:\Apache2.2\htdocs\ruby_prg\em_ruby\em_db>
>
>
> statement.rb:130:の@res_handle.fetch_fields.each {|col|で、
> Segmentation Faultが生じています。
> どうすれば解決できるか、ご指導のほど、お願いします。
>
> 別の手法(とみたさんのmysqlを使用した場合)のサンプルコードでは、
> 問題なく、データが取れています。
>
> #!D:/Ruby/bin/ruby.exe
> #
> #MySQLへのアクセスサンプルプログラム
> # 2009/05/19 CODED BY E.MAEKAWA
> #
> #
> ################################################
>
>
> require "mysql" #MySQLライブラリ
> require "rubygems"
>
> mydb = Mysql.new('サーバ名','ユーザ名','パスワード','DB名')
> puts 'mydbの結果は'+ mydb.to_s
> #接続確認
> res = mydb.query('SELECT * from aplist')
> puts 'mydb.queryの結果は'+ res.to_s
> #結果確認
> puts '【データダンプ】'
> res.each do |row|
>   #puts row[0].to_s
>   puts row.to_s
>   puts row.length
> end
> #テーブル名 取得
> res = mydb.list_tables() #テーブル名を返す
>
> puts res.length #テーブル名の数(返されたデータ数)
> puts res #list_tablesの結果(テーブル名 arcd 等)
> puts '【each doの出力】'
> res.each do |name| #テーブル名の格納 res→nemeへ
>   puts name
> end
> puts '【flattenの出力】'
> resData = res.flatten #res を一次元の配列にする。
> puts resData
>
> puts 'テーブルの数'
> puts resData.length # 一次元配列になったデータの数
> puts 'テーブル名一覧'
> puts res.to_s
> #=begin
> res.each do |row|
>   #puts row[0].to_s
>   puts row.to_s
>   puts row.length
> end
>
> 了
>
> 冗長ではありますが、ご指導のほど、よろしくお願いします。
>
>
>
> --
> ML: rails@r...
> 使い方: http://QuickML.com/


--
ML: rails@r...
使い方: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]

      3369 2010-01-26 02:47 [eiichi_maekawa@m... ] MySQLにDBIでアクセスすると、Segmentation faultが発生
->    3370 2010-01-26 03:19 ┗[eiichi_maekawa@m... ] 解決しました;; MySQLにDBIでアクセスすると、Segmentation faultが発生