1

次のコードでは、最後の行でセグメンテーション違反が発生します

require 'rubygems'
gem 'mysql'
gem 'dbi'
require 'dbi'
require 'mysql'

dsn = "DBI:Mysql:DATABASE:www.HOST.net" # redacted
dbh = DBI.connect(dsn, "USERNAME", "PASSWORD") # redacted

sth = dbh.execute("select  * from TABLE where numeric_value is not null limit 10;") # redacted

問題を引き起こしているのは間違いなく最後の行です。次の行の print ステートメントは実行されません。

このような単純な試みが失敗する理由を誰か知っていますか?

違いが生じる場合に備えて、これをWindowsで実行しています。

4

2 に答える 2

1

これは、DBI のバージョン、Mysql gem、mysql のバージョン、ruby のバージョンなど、いくつでもかまいません。

残念ながら、Ruby は Windows の第一級市民ではなく、すべての構成が Windows で広範囲にテストされていません。

まず、VM でデバッグを有効にして、segfault が発生している場所と理由に関する詳細情報を使用してこの問題を再現します。-d オプションを VM に渡します。そこから、解決策を探す場所に関する詳細情報が得られることを願っています。

VMのパッチレベルを確認することをお勧めします

ruby --version

DBIとMysqlのレベルもチェックします

  # if you are using gems
  gem list --local 

Mysql へのアクセス方法を切り替えることもできます。ActiveRecord は、独自のコードを使用して mysql に接続します。これは、より広範囲にテストされています。最善の解決策ではないかもしれませんが、除外すべきではありません。

于 2009-01-12T17:08:37.497 に答える
0

このコードでセグメンテーション違反が発生する理由がわかりません。

たとえば、配列の境界を超えた場合、コードを実行するか、上書きしたメモリにアクセスしようとするまで、実際にはセグメンテーション違反が発生しない可能性があります。したがって、プロセスが頻繁にアクセスしなかった領域にプロセスが所有するメモリにのみ書き込みを行った場合、システムがセグフォールトする前に数日間実行される可能性があります。

于 2009-01-12T16:54:01.177 に答える