3

ctrl-C を入力して (または SIGINT を送信して) デバッガーに入りたいと思います。デバッガーをインストールし(Ruby 1.9.3 を実行しています)、動作することを確認しました。これをセットアップ ファイルに追加しました (これは Padrino 用ですが、Rails でも同様であると想定しています)。

# file: config/boot.rb
Padrino.before_load do
  trap("SIGINT") { debugger } if Padrino.env == :development
end

...しかし、Ctrl-C を入力してもデバッガーは呼び出されません。実際、 に置き換えた場合debuggerputs "saw an interrupt!"Ctrl-C を入力しても印刷は行われません。

アップデート

Mike Dunlaveyからのこの提案に従って、デバッガー内から明示的に呼び出してみました。catch Interrupt

$ rdebug `which padrino` console
^Z^Z$HOME/usr/bin/padrino:9
require 'rubygems'
(rdb:1) catch Interrupt
Catch exception Interrupt.
(rdb:1) c
=> Loading development console (Padrino v.0.10.7)
=> Loading Application BlueDotAe
=> Loading Application Admin
irb(main):001:0>   C-c C-c^C
irb(main):001:0> 

喜びはありません -- 割り込みがデバッガに入りませんでした。

私は何が欠けていますか?

4

2 に答える 2

4

コンソールでの実行中に SIGINT をトラップしたい場合、短い答えは、IRB にモンキー パッチを適用しない限りできないということです。コンソールを使用するすべての Ruby アプリ (padrino、Rails など) は最終的に を呼び出しusr/lib/ruby/1.9.1/irb.rbIRB.startでは次のことを行います。

trap("SIGINT") do
  irb.signal_handle
end

...メインループに入る直前。これは、起動コードに入れている可能性のあるトラップ ("SIGINT") をオーバーライドします。

ただし、SIGINT をスクリプト ファイルにトラップする場合 (たとえば、Mike Dunlaveyの説明に従ってコードをプロファイリングする場合)、次のようなスクリプト ファイルを作成できます。

# File: profile_complex_operation.rb
trap("SIGINT") { debugger }
MyApp.complex_operation

次に、次のように呼び出します。

$ ruby profile_complex_operation.rb

ここで、^C を押す (または別のプロセスから SIGINT を送信する) と、デバッガーに入ります。

于 2013-03-07T20:21:40.990 に答える
1

Ruby 用の GDB ラッパー( GitHub )を使用してみてください。

次の方法で Linux にインストールします。

sudo apt-get install gdb python-dev ncurses-dev ruby-rvm
gem install gdb.rb

基本的な使い方:

require 'gdb'

# create a new GDB::Ruby instance and attach it to
# pid 12345
gdb = GDB::Ruby.new(12345)

# print the (ruby) backtrace of the remote process
gdb.backtrace.each { |line| puts line }

# show the current local variables, and their values
p gdb.local_variables

# evaluate arbitrary ruby code in the remote process
p gdb.eval('%(pid #{$$})')

# show how many instances of each class exist in the
# remote process
p gdb.object_space

# raise an exception in the remote process
gdb.raise Exception, "go boom!"

# close the connection to the remote process
gdb.quit

または、ハングしたプロセスをデバッグするには、次の方法でアタッチします。

rvmsudo gdb.rb PID

それから:

# in gdb get a ruby stacktrace with file names and line numbers
# here I'm filtering by files that are actually in my app dir
(gdb) ruby eval caller.select{|l| l =~ /app\//}

出典: gdb を使用してハングした ruby​​ プロセスを検査する

いくつかの代替案:

  • rbtrace - strace に似ていますが、ruby コード用です (使用法: rbtrace -p <PID> --firehose)。
  • strace/gdb を使用してプロセスをデバッグするのに役立つ tmm1 (gdb.rb の作成者) によるdebug.rbスクリプト。

以下も参照してください。

于 2015-08-01T18:16:27.030 に答える