著作一覧 |
籠るのですでにして11/20にしてしまう。
籠ると言えば
クマムシ?!―小さな怪物 (岩波 科学ライブラリー)(鈴木 忠)
釣られてしまったくまー。安いと思ったら112ページなのか。まさに小さな怪物。
Linux Am64版(2.6)でRailsをrequire後にInternalError(J2SEの例外クラス)でメッセージ:unknown exception がJVMのロード時かクラスのロード時にスローされるらしいのですが、手元のWin32およびLinux x86(2.4)では再現しません。 何か関連しそうな情報をお持ちの方、おいででしたらご教示して頂けませんか?
問題はRailsのrequireにあるのではないかと思われています。が、仮にRailsがいろいろ変えたとしても、Rjb::importで影響を受けそうなメソッドは無さそうなので皆目見当が付きません。たとえばdlに影響するとは思えないです(と書いてからちょっと気になる点もでてきたので、TODOしとこう。ずっと暗黙に呼ばれるjvm_loadの問題だと思っていたけどimportの過程かも知れない)。
#うまく動く例: Win32(x86) irb(main):001:0> require 'rubygems' => true irb(main):002:0> require_gem 'rails' => true irb(main):003:0> require_gem 'rjb' => true irb(main):004:0> require 'rjb' => true irb(main):005:0> Rjb::import 'junit.framework.Assert' => #<Rjb::Junit_framework_Assert:0x38b042c>
#だめな例 $ ruby -v ruby 1.8.5 (2006-08-25) [x86_64-linux-gnu] ... irb(main):001:0> require 'rubygems' => true irb(main):002:0> require_gem 'rails' => true irb(main):003:0> require_gem 'rjb' => true irb(main):004:0> require 'rjb' => true irb(main):005:0> Rjb::import 'junit.framework.Assert' InternalError: unknown exception from (irb):5:in `import' from (irb):5 irb(main):006:0> Rjb::import 'junit.framework.Assert' NoClassDefFoundError: junit/framework/Assert from (irb):6:in `import' from (irb):6 from :0
なおこの時のJavaは以下の通りです。
Win32 (OKな方) C:\>java -version java version "1.5.0_09" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_09-b01) Java HotSpot(TM) Client VM (build 1.5.0_09-b01, mixed mode, sharing) Linux(だめな方) $ java -version java version "1.5.0_09" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_09-b01) Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_09-b01, mixed mode)
ただし、同じ環境でも、rqeuire_gem 'rails'抜きだと期待通りの動作となるようです。とはいえ、RailsあってのRjbという側面があるので、対応可能なら対応したいというのがこちらの考えです。
#Amd64マシンをサーバー用途に買おうかなとはさすがに言えない。Vista実験マシンをデュアルブートにするべきか……(いつ?)
ジェズイットを見習え |
大学の計算サーバで Opteron + Linux-2.6.9 + Ruby 1.8.5 + J2SE 1.5.0_09 な環境でやってみましたが、require_gem 'rails' なしでも同様に InternalError: unknown_exception になります。<br>rjb は 1.0.2 です。取り急ぎお知らせまで。<br># 必要な情報があれば言っていただければ協力します
どうも情報ありがとうございます。助かります。<br>Amd64で、環境(Railsの有無)によって出たり出なかったりということは、ポインタ回りのバグがRjbにあってスタックを壊しているのだと思います(すみません。自分のメモになっています)。コードのどこかに32ビット確保した位置に64ビットコピーして後ろを壊してる箇所がありそうです。<br>とりあえず例外情報を得たいので、お手数ですが、irb内で<br>$VERBOSE = true<br>してInternalErrorの行の上に何が表示されるか教えて頂けませんか?
やってみました。こんな感じです。<br><br>% CLASSPATH=junit-4.0.jar irb<br>irb(main):001:0> require 'rubygems'<br>=> true<br>irb(main):002:0> require_gem 'rjb'<br>=> true<br>irb(main):003:0> require 'rjb'<br>=> true<br>irb(main):004:0> $VERBOSE = true<br>=> true<br>irb(main):005:0> Rjb::import 'junit.framework.Assert'<br>Exception in thread "main" java.lang.InternalError<br> at java.util.zip.Inflater.init(Native Method)<br> at java.util.zip.Inflater.<init>(Inflater.java:75)<br> at java.util.zip.ZipFile.getInflater(ZipFile.java:375)<br> at java.util.zip.ZipFile.getInputStream(ZipFile.java:320)<br> at java.util.zip.ZipFile.getInputStream(ZipFile.java:286)<br> at java.util.jar.JarFile.hasClassPathAttribute(JarFile.java:467)<br> at java.util.jar.JavaUtilJarAccessImpl.jarFileHasClassPathAttribute(JavaUtilJarAccessImpl.java:15)<br> at sun.misc.URLClassPath$JarLoader.getClassPath(URLClassPath.java:809)<br> at sun.misc.URLClassPath.getLoader(URLClassPath.java:293)<br> at sun.misc.URLClassPath.getResource(URLClassPath.java:160)<br> at java.net.URLClassLoader$1.run(URLClassLoader.java:192)<br> at java.security.AccessController.doPrivileged(Native Method)<br> at java.net.URLClassLoader.findClass(URLClassLoader.java:188)<br> at java.lang.ClassLoader.loadClass(ClassLoader.java:306)<br> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)<br> at java.lang.ClassLoader.loadClass(ClassLoader.java:251)<br> at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)<br>InternalError: unknown exception<br> from (irb):5:in `import'<br> from (irb):5<br><br>J2SE の標準クラスの import は問題ないようです。
えー、と思いもよらぬ結果にびっくりです。<br>本当にありがとうございます。確かに、rt.jarは圧縮してないのに対して、junit.jarは圧縮しています。<br>とりあえず、元のレポートに対しては取りあえずunjarしてから圧縮せずにjarして試すようにお願いしてみました。
http://www.mail-archive.com/java-linux@java.blackdown.org/msg15762.html<br>これか。libzipのバージョン違いみたいだ。
>I was able to change the error<br>quite a bit. Now it fails after starting the JVM because the current<br>stack is corrupt.<br>上のやり取り読むと、やっぱりRjbのバグっぽいな。bug-paradeにも無いし。
こちらでも unjar して無圧縮でjarを作成してみたところ例外が出なくなりました。<br>で、他にもこんなことすればいけました。<br><br>% LD_LIBRARY_PATH=/opt/jdk1.5.0_09/jre/lib/amd64/server:/opt/jdk1.5.0_09/jre/lib/amd64<br>% LD_PRELOAD=/opt/jdk1.5.0_09/jre/lib/amd64/libzip.so CLASSPATH=junit-4.0.jar irb<br>irb(main):001:0> require 'rubygems'<br>=> true<br>irb(main):002:0> require_gem 'rjb'<br>=> true<br>irb(main):003:0> require 'rjb'<br>=> true<br>irb(main):004:0> Rjb::import 'junit.framework.Assert'<br>=> #<Rjb::Junit_framework_Assert:0x2a962fe778><br><br>やはり共有ライブラリの競合問題でしょうか。<br>取り急ぎお知らせまで。
どうも追試ありがとうございます。<br>LD_*の設定についても元のレポートを送ってくれた人に知らせます。<br>情報が錯綜していることと(元のレポートくれた人はrailsをrequireしなければエラーとならないと言っている/Googleで見つけたやり取りではLD_PRELOADでも解決しないと言っている―ただ、どちらも実際にどうやったのかが見えない)、自分で64ビットRjbのテストをしていないので不安感があることから共有ライブラリの競合と結論はできないのですが、多分当たりのようですね。<br>ありがとうございます。