Reputation: 1692
This sounds like a fairly trivial question, but I've been struggling with it for ages, abandoning Ruby and coming back to it. I am a Java/Eclipse person trying to learn Ruby, and so I would like to debug jRuby/Rails using some Eclipse plugin, on my Win 7, 64-bit computer. How come it is so hard? I could not find a step-by-step instruction (e.g. install this plug-in, this version of jRuby, install these gems, tweak these settings). In the absence of that, I am doing hit-and-miss, and everything I do seems to result in bizarre errors.
At this point in time, I am trying to use EasyEclipse (is it a good choice?). I found that the default installation (into Program Files) is not a good idea and installed it at a path with no spaces; same with jRuby. I installed two debug gems (from the top of my head, gem install ruby-debug and gem install ruby-debug-ide), then did "gem update". I am running the latest stable version of EasyEclipse and jRuby.
I am able to run a Ruby program. However, when I put on a breakpoint and try debug, debugger gets stuck at "Launching(95%)" and Console shows:
ruby 1.9.3 debugger listens on port 52188 undefined method `critical=' for Thread:Class
That, when I turn on "Use ruby-debug library" library in preferences, I get this:
Fast Debugger (ruby-debug-ide 0.4.18, ruby-debug-base 0.10.3.2) listens on 127.0.0.1:52819
Hello, world!
Hello, world!2
Hello, world!3
Context.java:407:in `contextCopyLocals': java.lang.NoSuchMethodError: org.jruby.runtime.DynamicScope.getEvalScope()Lorg/jruby/runtime/DynamicScope;
from Context.java:284:in `frame_locals'
from Context$INVOKER$i$1$0$frame_locals_DBG.gen:-1:in `call'
from JavaMethod.java:347:in `call'
from CachingCallSite.java:326:in `cacheAndCall'
from CachingCallSite.java:170:in `call'
from CallOneArgNode.java:57:in `interpret'
from LocalAsgnNode.java:123:in `interpret'
from NewlineNode.java:105:in `interpret'
from BlockNode.java:71:in `interpret'
from ASTInterpreter.java:74:in `INTERPRET_METHOD'
from InterpretedMethod.java:139:in `call'
from CachingCallSite.java:306:in `cacheAndCall'
from CachingCallSite.java:136:in `call'
from CallNoArgNode.java:60:in `interpret'
from NewlineNode.java:105:in `interpret'
from IfNode.java:118:in `interpret'
from NewlineNode.java:105:in `interpret'
from IfNode.java:116:in `interpret'
from NewlineNode.java:105:in `interpret'
from BlockNode.java:71:in `interpret'
from ASTInterpreter.java:112:in `INTERPRET_BLOCK'
from Interpreted19Block.java:206:in `evalBlockBody'
from Interpreted19Block.java:157:in `yield'
from Block.java:142:in `yield'
from RubyArray.java:1610:in `eachCommon'
from RubyArray.java:1617:in `each'
from RubyArray$INVOKER$i$0$0$each_DBG.gen:-1:in `call'
from CachingCallSite.java:143:in `callBlock'
from CachingCallSite.java:154:in `callIter'
from CallNoArgBlockNode.java:64:in `interpret'
from NewlineNode.java:105:in `interpret'
from ASTInterpreter.java:112:in `INTERPRET_BLOCK'
from Interpreted19Block.java:206:in `evalBlockBody'
from Interpreted19Block.java:157:in `yield'
from Block.java:142:in `yield'
from RubyContinuation.java:107:in `enter'
from RubyKernel.java:1261:in `rbCatch19Common'
from RubyKernel.java:1254:in `rbCatch19'
from RubyKernel$INVOKER$s$rbCatch19_DBG.gen:-1:in `call'
from CachingCallSite.java:177:in `callBlock'
from CachingCallSite.java:188:in `callIter'
from FCallOneArgBlockNode.java:34:in `interpret'
from NewlineNode.java:105:in `interpret'
from BlockNode.java:71:in `interpret'
from WhileNode.java:131:in `interpret'
from NewlineNode.java:105:in `interpret'
from BlockNode.java:71:in `interpret'
from RescueNode.java:222:in `executeBody'
from RescueNode.java:117:in `interpret'
from ASTInterpreter.java:74:in `INTERPRET_METHOD'
from InterpretedMethod.java:139:in `call'
from CachingCallSite.java:306:in `cacheAndCall'
from CachingCallSite.java:136:in `call'
from CallNoArgNode.java:60:in `interpret'
from NewlineNode.java:105:in `interpret'
from BlockNode.java:71:in `interpret'
from ASTInterpreter.java:74:in `INTERPRET_METHOD'
from InterpretedMethod.java:268:in `call'
from CachingCallSite.java:366:in `cacheAndCall'
from CachingCallSite.java:238:in `call'
from FCallThreeArgNode.java:40:in `interpret'
from NewlineNode.java:105:in `interpret'
from BlockNode.java:71:in `interpret'
from ASTInterpreter.java:74:in `INTERPRET_METHOD'
from InterpretedMethod.java:268:in `call'
from CachingCallSite.java:366:in `cacheAndCall'
from CachingCallSite.java:238:in `call'
from CallThreeArgNode.java:61:in `interpret'
from NewlineNode.java:105:in `interpret'
from ASTInterpreter.java:74:in `INTERPRET_METHOD'
from InterpretedMethod.java:112:in `call'
from InterpretedMethod.java:126:in `call'
from RubyClass.java:722:in `finvoke'
from Helpers.java:486:in `invoke'
from RubyBasicObject.java:367:in `callMethod'
from DebugEventHook.java:566:in `callAtLine'
from DebugEventHook.java:553:in `callAtLine'
from DebugEventHook.java:190:in `processEvent'
from DebugEventHook.java:97:in `eventHandler'
from EventHook.java:30:in `event'
from Ruby.java:2882:in `callEventHooks'
from ASTInterpreter.java:239:in `callTraceFunction'
from NewlineNode.java:101:in `interpret'
from BlockNode.java:71:in `interpret'
from ASTInterpreter.java:103:in `INTERPRET_CLASS'
from ASTInterpreter.java:280:in `evalClassDefinitionBody'
from ClassNode.java:138:in `interpret'
from NewlineNode.java:105:in `interpret'
from RootNode.java:129:in `interpret'
from ASTInterpreter.java:121:in `INTERPRET_ROOT'
from Ruby.java:834:in `runInterpreter'
from Ruby.java:2674:in `loadFile'
from ExternalScript.java:66:in `load'
from LoadService.java:359:in `load'
from Debugger.java:137:in `load'
from RubyDebugger.java:207:in `debug_load'
from RubyDebugger$INVOKER$s$0$2$debug_load_DBG.gen:-1:in `call'
from DynamicMethod.java:225:in `call'
from DynamicMethod.java:221:in `call'
from CachingCallSite.java:366:in `cacheAndCall'
from CachingCallSite.java:238:in `call'
from FCallThreeArgNode.java:40:in `interpret'
from LocalAsgnNode.java:123:in `interpret'
from NewlineNode.java:105:in `interpret'
from BlockNode.java:71:in `interpret'
from ASTInterpreter.java:74:in `INTERPRET_METHOD'
from InterpretedMethod.java:182:in `call'
from CachingCallSite.java:326:in `cacheAndCall'
from CachingCallSite.java:170:in `call'
from CallOneArgNode.java:57:in `interpret'
from NewlineNode.java:105:in `interpret'
from BlockNode.java:71:in `interpret'
from RootNode.java:129:in `interpret'
from ASTInterpreter.java:121:in `INTERPRET_ROOT'
from Ruby.java:834:in `runInterpreter'
from Ruby.java:2674:in `loadFile'
from ExternalScript.java:66:in `load'
from LoadService.java:359:in `load'
from RubyKernel.java:1081:in `loadCommon'
from RubyKernel.java:1073:in `load19'
from RubyKernel$INVOKER$s$0$1$load19_DBG.gen:-1:in `call'
from DynamicMethod.java:209:in `call'
from DynamicMethod.java:205:in `call'
from CachingCallSite.java:326:in `cacheAndCall'
from CachingCallSite.java:170:in `call'
from FCallOneArgNode.java:36:in `interpret'
from NewlineNode.java:105:in `interpret'
from BlockNode.java:71:in `interpret'
from RootNode.java:129:in `interpret'
from ASTInterpreter.java:121:in `INTERPRET_ROOT'
from Ruby.java:834:in `runInterpreter'
from Ruby.java:842:in `runInterpreter'
from Ruby.java:673:in `runNormally'
from Ruby.java:518:in `runFromMain'
from Main.java:390:in `doRunFromMain'
from Main.java:279:in `internalRun'
from Main.java:221:in `run'
from Main.java:201:in `main'
What's going on?
I suppose I could keep googling and trying finding my way in the dark, but I've spent so much time doing it already, and surely someone has accomplished the trivial task of debugging jRuby in Eclipse before me? Help!
Upvotes: 7
Views: 3927
Reputation: 3328
Download the Eclipse Dynamic Languages Toolkit - Ruby Development Tools. Import your ruby on rails project. Check that your Gemfile references:
gem 'ruby-debug'
Then go to windows -> preferences, and do two things:
Then in the run configuration, main tab, under "ruby script" the launch script is bin/rails
, and in the arguments tab server --debugger
. The interpreter tab should point to JRuby.bat
Go to run -> run and give it about 30 seconds to load the JVM, the ruby environment, and hook everything in. Then check your http://localhost:3000/
To start debug execution then type debugger
in the place you want to start the debugger.
It all starts off looking something like this:
Upvotes: 2