2017-05-27 69 views
0

如何讓我的程序在死亡時顯示回溯/呼叫者?
我有一個問題,在一個寶石,是不是我的無限循環和需要知道的問題是彙報死亡時紅寶石顯示回溯

def hello 
    puts 'hello' 
end 

def test 
    while true 
    sleep 2 
    hello 
    end 
end 

test 

在本例中,當一個kill信號發送到PROGRAMM,我想知道是什麼做什麼的PROGRAMM(顯示主叫)
目前我得到的顯示是在輸出

+1

我會嘗試'at_exit {把caller.inspect}'也許可以幫助 – slowjack2k

+0

會嘗試感謝 –

+0

沒有,它不工作,我仍然只有得到一個「Killed」字符串,並且全部顯示 –

回答

1

這是不可能趕上SIGKILL信號,它們被髮送到內核,而不是過程:https://major.io/2010/03/18/sigterm-vs-sigkill/

你可以,但是,使用一個「父」的過程,名錶的「孩子」,並做出相應的反應SIGKILL signal Handler

這意味着我無法顯示回溯,我可能必須使用日誌文件或類似的東西。

我想反病毒有工作,以避免被殺害

+0

針對linux。只有具有進程或根的實際或有效用戶標識的用戶才能向進程發送信號。所以,對於您的防病毒軟件,每一件事都是好事。 – slowjack2k

1

我想你需要捕捉的信號「封殺」, 你嘗試

https://gist.github.com/sauloperez/6592971

+0

這正是我要建議的:)這是Ruby的做法。 – zee

+0

無法與sigkill一起工作:/(嘗試在信號捕獲後發送一個循環併發送帶htop的sigkill信號) –

1

https://robots.thoughtbot.com/using-gdb-to-inspect-a-running-ruby-process

作爲最後的手段,您可以使用gdb連接到您運行Ruby進程的問題以不同的方式 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