Bizarre erreur de segmentation de ruby ??avec DBI et MySQL
-
22-07-2019 - |
Question
Le code suivant indique une erreur de segmentation sur la dernière ligne
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
C'est certainement la dernière ligne à l'origine du problème: une instruction print sur la ligne suivante n'est jamais exécutée.
Quelqu'un sait-il pourquoi une tentative aussi simple échouerait?
J'utilise ceci sous Windows, au cas où cela ferait une différence.
La solution
Cela peut être un nombre quelconque de choses, de la version de DBI à la gem Mysql, de la version de mysql à la version de ruby.
Malheureusement, ruby ??n’est pas un citoyen de première classe sous Windows, pas plus que toutes les configurations n’ont été testées.
Activez tout d’abord le débogage sur votre machine virtuelle pour reproduire ce problème avec davantage d’informations sur l’emplacement et la raison du segfault. Passez l'option -d à la machine virtuelle. J'espère que vous aurez ensuite plus d'informations sur l'endroit où chercher la solution.
Je vous suggère de vérifier le niveau de correctif de votre machine virtuelle
.ruby --version
Je vérifierais également le niveau de DBI et Mysql
# if you are using gems
gem list --local
Vous pouvez également changer le mode d’accès à Mysql, ActiveRecord utilise son propre code pour se connecter à mysql, qui est testé de manière plus approfondie. Peut ne pas être la meilleure solution mais ne doit pas l'exclure.
Autres conseils
Je ne sais pas pourquoi vous obtenez une erreur de segmentation dans ce code.
Il est possible, par exemple, que si vous dépassez les limites du tableau, vous ne puissiez pas réellement commettre d'erreur de segmentation tant que vous n'avez pas essayé d'exécuter le code ou d'accéder à la mémoire que vous avez écrasée. Vous pouvez donc disposer d’un système fonctionnant plusieurs jours avant les erreurs de segmentation s’il écrit uniquement en mémoire le processus en question dans une zone à laquelle il n’a pas souvent accès.