DBI 및 MySQL의 이상한 루비 분할 결함
-
22-07-2019 - |
문제
다음 코드는 마지막 줄에 분할 오류를 제공합니다.
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
문제를 일으키는 마지막 줄입니다. 다음 줄의 인쇄 문은 실행되지 않습니다.
왜 그런 간단한 시도가 실패할지 아는 사람이 있습니까?
차이가있는 경우 Windows에서 이것을 실행하고 있습니다.
해결책
DBI 버전, MySQL GEM, MySQL 버전 및 Ruby 버전에서는 여러 가지가 될 수 있습니다.
불행히도 Ruby는 Windows의 일류 시민이 아니며 모든 구성이 광범위하게 테스트되지 않습니다.
먼저 VM에서 디버깅을 활성화하여 Segfault가 어디에서 발생하는지에 대한 자세한 정보를 통해이 문제를 재현하십시오. -D 옵션을 VM으로 통과하십시오. 거기에서 솔루션을 찾을 위치에 대한 더 많은 정보가 있기를 바랍니다.
나는 당신의 VM의 패치 레벨을 확인할 것을 제안합니다.
ruby --version
또한 DBI의 레벨을 확인하고 MySQL
# if you are using gems
gem list --local
MySQL에 액세스하는 방법을 전환 할 수 있으며 ActiveRecord는 자체 코드를 사용하여 MySQL에 연결하여보다 광범위하게 테스트됩니다. 최상의 솔루션은 아니지만 배제해서는 안됩니다.
다른 팁
이 코드에서 왜 Segfault를 받고 있는지 모르겠습니다.
예를 들어, 배열의 한계를 오버런하면 코드를 실행하거나 덮어 쓰는 메모리에 액세스하려고 할 때까지 실제로 segfault가 될 수 있습니다. 따라서 프로세스가 자주 액세스하지 않은 영역에서 소유 한 메모리에만 작성된 경우 며칠 전에 실행되는 시스템을 가질 수 있습니다.
제휴하지 않습니다 StackOverflow