1

優れた問題は次のとおりです。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のコードを読んで根本的な原因を見つけようとしています。

  1. ruby-debug-ideは、127.0.0.1でTCPServerバインドを開始し、ポート57000でリッスンするDebugThread(@control_thread)を開始しました。
  2. ruby-debug-ideは、クライアントがtcpサーバーに接続し、「開始」コマンドを送信するのを待機しています。run_prog_script
  3. できますtelnet 127.0.0.1 57000。デバッグスレッドは次のように述べています。127.0.0.1から接続しています...telnetに「start\n」という単語を入れると、rdebug-ideが実際のプログラムを起動します。
  4. Rubymineはそれに接続しておらず、「start」コマンドを送信していません。(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-commonslibを使用してローカルホストでソケット接続を開くことができないようです。これ以上掘り下げることはできません:(

ところで、以下のコマンドでシェルでルビーデバッグセッションを開始します:

rdebug-ide --port 51202 --path / to / my / script

ルビミンもソケットに接続できません。

*別のruby-debug-xxxgemを使用したり、ruby-debugなどの他のgemを削除したりする必要があると言わないでください。これらの解決策を試しました。*

私は以下のグループで試しました:

グループ1:

  • ルビミン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

私のラップトップはOSXLionを搭載したMacAirです

4

2 に答える 2

3

同じ問題がありました。すべての提案 (ruby-debug の削除、ライン キャッシュなど) を試しましたが、どれも機能しませんでした。私の場合、Macbook のホスト名は localhost に設定されていました。ホスト名を変更したところ、sudo scutil --set HostName newHostName完全に機能するようになりました。

于 2013-02-01T20:54:52.893 に答える
0

ローカル デバッグの代わりにリモート デバッガーを使用する必要があります。

まず、ローカル デバッグ エラーを比較します。

Error:

  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)

debug-commons-java'code を使用:

private void failWithInfo(ConnectException e) throws RubyDebuggerException {
    String info = debugTarget.isRemote()
            ? "[Remote Process at " + debugTarget.getHost() + ':' + debugTarget.getPort() + "]"
            : Util.dumpAndDestroyProcess(debugTarget);
    throw new RubyDebuggerException("Cannot connect to the debugged process at port "
            + debugTarget.getPort() + " in " + timeout + "s:\n\n" + info, e);
}

上記のエラー出力に debugTarget.getHost() が表示されませんが、リモートでデバッグするとホストが通知されます。

そこで、最も単純な Ruby スクリプト (test.rb) を作成します。

i = 10
begin
  puts "echo ok #{i}"
  i += 1
  sleep 1
end until i > 600

次に、デフォルト設定で Ruby mine でリモート デバッグ セッションを開始します。

  • リモートホスト: ローカルホスト
  • リモートポート: 1234
  • リモート ルート フォルダー: path/to/test
  • ローカル ポート: 26201
  • ローカル ルート フォルダー: path/to/test

ルビマインのショー例外が次のように見つかりました:

Error:

  Cannot connect to debugged process at port 54321 in 10s:

  [Remote Process at **localhost**:54321]

次に、リモート ホストを「127.0.0.1」に変更します。

そのため、Rubymine はホスト名として "localhost" を使用してデバッグ ターゲットに接続しようとすると思いますが、失敗しました。

debugTarget のホストが初期化されている場所を見つけようとしましたが、デバッグ コモンズ RubyDebuggerFactory でそれらのコードを取得しました。

private static RubyDebuggerProxy startDebugger(final Descriptor desc, final List<String> args, final int timeout)
        throws IOException, RubyDebuggerException {

   ...
    // 127.0.0.1 seemingly works with all systems and with IPv6 as well.
    // "localhost" and InetAddress.getLocalHost() have problems on some systems.
    // cf. http://www.netbeans.org/issues/show_bug.cgi?id=143273 for one case
    RubyDebugTarget target = new RubyDebugTarget(proxy, "127.0.0.1", desc.getPort(),
            pb.start(), desc.getDebuggeePath(), desc.getBaseDirectory());
    proxy.setDebugTarget(target);
    RubyDebuggerProxy.PROXIES.add(proxy);
    return proxy;
}

rubymine.jar を org.rubyforge.debugcommons.RubyDebuggerFactory 用に逆コンパイルします。混在していますが、以下を見つけることができます。

    RubyDebugTarget rubydebugtarget = new RubyDebugTarget(rubydebuggerproxy, "127.0.0.1", descriptor.getPort(), processbuilder.start(), descriptor.getDebuggeePath(), descriptor.getBaseDirectory());

rubymine は 127.0.0.1 に接続すると思いますが、十分な権限がないので、以下のコマンドで ruby​​ mine を起動してみます:

sudo /Applications/Rubymine.app/Contents/MacOSX/rubymine

それでも失敗するのは ruby​​mine のバグなので、私のようにひどい経験をした人は、リモートデバッガを使って回避してください。

Dennis Ushakovからのコンピュータ名について思い出させてくれてありがとう

于 2012-12-22T08:19:00.620 に答える