表面问题是: rubymine 可以运行 ruby 程序,但不能调试它们,也不能远程调试,我得到:
>> DIALOG: Connecting to debugger using 10 seconds
大约 10 秒后
>> DIALOG: Cannot connect to the debugged process at port 57000 [a random port]
>>> Dumping and destroying...
>>> Error Output:
>>> Fast Debugger(ruby-debug-ide 0.4.17.beta14, ruby-debug-base19 0.11.30.pre10) listens on 127.0.0.1:57000
>> Please try increase timeout settings...(a long bullshit)
我尝试通过阅读 ruby-debug-ide 和 ruby-debug-base19 代码找到根本原因,发现:
- ruby-debug-ide 已经启动了一个 DebugThread(@control_thread),它将在 127.0.0.1 上启动一个 TCPServer 绑定并监听端口 57000。
- ruby-debug-ide 正在等待客户端连接到 tcp 服务器并向他发送“启动”命令
run_prog_script
- 我可以
telnet 127.0.0.1 57000
,然后调试线程说:从 127.0.0.1 连接...如果我在 telnet 中输入一个单词 'start\n',rdebug-ide 将启动我的真实程序。 - Rubymine 没有连接到它并发送“开始”命令。(因为我在idea.log中没有找到任何输出)
我深入研究了idea.log:
Fast Debugger (ruby-debug-ide 0.4.17.beta14, ruby-debug-base 0.11.30.pre10) listens on 127.0.0.1:59598
at org.rubyforge.debugcommons.RubyDebuggerProxy.a(RubyDebuggerProxy.java:647)
at org.rubyforge.debugcommons.RubyDebuggerProxy.d(RubyDebuggerProxy.java:619)
at org.rubyforge.debugcommons.RubyDebuggerProxy.getCommandSocket(RubyDebuggerProxy.java:381)
at org.rubyforge.debugcommons.RubyDebuggerProxy.b(RubyDebuggerProxy.java:151)
at org.rubyforge.debugcommons.RubyDebuggerProxy.attach(RubyDebuggerProxy.java:112)
at org.jetbrains.plugins.ruby.ruby.debugger.impl.RubyDebugProcess.attachToProxy(RubyDebugProcess.java:190)
然后我阅读了 debug-commons 代码(不如 rubymine 准确,我参考https://github.com/ruby-debug/debug-commons-java/blob/master/src/org/rubyforge/debugcommons/RubyDebuggerProxy.java
private Socket attach() throws RubyDebuggerException {
int port = debugTarget.getPort();
String host = debugTarget.getHost();
Socket socket = null;
for (int tryCount = (timeout*2), i = 0; i < tryCount && socket == null; i++) {
try {
socket = new Socket(host, port);
...
}
}
}
似乎 rubymine 无法使用 debug-commons lib 在 localhost 打开套接字连接,我无法挖掘更多:(
顺便说一句,即使我们通过以下命令在 shell 中启动 ruby 调试会话:
rdebug-ide --port 51202 -- path/to/my/script
rubymine 也无法连接到套接字。
*不要告诉我我应该使用另一个 ruby-debug-xxx gem 或者删除一些其他的 gem,比如 ruby-debug,我已经尝试过这些解决方案。*
我尝试过以下组:
第一组:
- 红宝石4.0.3
- ruby-debug-base19-0.11.29
- ruby-debug-ide-0.4.16
组2:
- 红宝石4.5.x
- ruby-debug-base19-0.11.30.pre10
- ruby-debug-ide-0.4.17.beta14
我的笔记本电脑是带有 OSX Lion 的 mac air