2017-05-27 12 views
0

死んだときにバックトレース/呼び出し元を表示するにはどうすればよいですか?
私は、私のものではなく、問題はキル信号がプログラムの開発に送信されたときに、このexempleでRubyでバックトレースが表示されない場合

def hello 
    puts 'hello' 
end 

def test 
    while true 
    sleep 2 
    hello 
    end 
end 

test 

それを報告している場所を知る必要がある宝石で無限ループに問題があります私は、私はあなたが信号をキャッチする必要があると思います私が表示されますすべての出力

+1

私は '多分それは私はまだのみ、 – slowjack2k

+0

はありません、それは動作しません –

+0

感謝をしようとするのに役立ちますat_exitは{caller.inspectを置く}'しようとするだろうその用語に表示された "Killed"文字列を取得してください。 –

答えて

1

彼らは、カーネルではなくプロセスに送信されるとSIGKILLシグナルをキャッチすることはできません:あなたは、しかし、「子供」を見て「親」プロセスを使用することができますhttps://major.io/2010/03/18/sigterm-vs-sigkill/

し、それに応じて反応しますSIGKILL signal Handler

これはバックトレースを表示できないことを意味します。おそらく、ログファイルなどを使用する必要があります。

私はアンチウイルスは

+0

Linux用です。プロセスまたはルートの実ユーザIDまたは実効ユーザIDを持つユーザだけがプロセスにシグナルを送信できます。だから、すべてのことがあなたのアンチウィルスソフトウェアにとっては大丈夫です。 – slowjack2k

1

に「殺した」されているものプログラムの開発は、どのような(発信者を表示)やっ現在
を知りたい あなたは

https://gist.github.com/sauloperez/6592971を試してみました

+0

それはまさに私が提案しようとしていたものです:)それはRubyのやり方です。 – zee

+0

はsigkillでは動作しません:/(シグナル捕捉後にループを実行し、htopでsigkillシグナルを送信してみてください) –

1

は、あなたの実行中のルビープロセスに接続するためにgdbを使用することができます最後の手段としてhttps://robots.thoughtbot.com/using-gdb-to-inspect-a-running-ruby-process

から撮影殺されるの問題を避けるために、作業の別の方法があるとし gdb </path/to/ruby> <PID>

# inside ~/.gdbinit 
define redirect_stdout 
    call rb_eval_string("$_old_stdout, $stdout = $stdout, 
    File.open('/tmp/ruby-debug.' + Process.pid.to_s, 'a'); $stdout.sync = true") 
end 

define ruby_eval 
    call(rb_p(rb_eval_string_protect($arg0,(int*)0))) 
end 
関連する問題