如何讓我的程序在死亡時顯示回溯/呼叫者?
我有一個問題,在一個寶石,是不是我的無限循環和需要知道的問題是彙報死亡時紅寶石顯示回溯
def hello
puts 'hello'
end
def test
while true
sleep 2
hello
end
end
test
在本例中,當一個kill信號發送到PROGRAMM,我想知道是什麼做什麼的PROGRAMM(顯示主叫)
目前我得到的顯示是在輸出
如何讓我的程序在死亡時顯示回溯/呼叫者?
我有一個問題,在一個寶石,是不是我的無限循環和需要知道的問題是彙報死亡時紅寶石顯示回溯
def hello
puts 'hello'
end
def test
while true
sleep 2
hello
end
end
test
在本例中,當一個kill信號發送到PROGRAMM,我想知道是什麼做什麼的PROGRAMM(顯示主叫)
目前我得到的顯示是在輸出
這是不可能趕上SIGKILL信號,它們被髮送到內核,而不是過程:https://major.io/2010/03/18/sigterm-vs-sigkill/
你可以,但是,使用一個「父」的過程,名錶的「孩子」,並做出相應的反應SIGKILL signal Handler
這意味着我無法顯示回溯,我可能必須使用日誌文件或類似的東西。
我想反病毒有工作,以避免被殺害
針對linux。只有具有進程或根的實際或有效用戶標識的用戶才能向進程發送信號。所以,對於您的防病毒軟件,每一件事都是好事。 – slowjack2k
我想你需要捕捉的信號「封殺」, 你嘗試
這正是我要建議的:)這是Ruby的做法。 – zee
無法與sigkill一起工作:/(嘗試在信號捕獲後發送一個循環併發送帶htop的sigkill信號) –
從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
我會嘗試'at_exit {把caller.inspect}'也許可以幫助 – slowjack2k
會嘗試感謝 –
沒有,它不工作,我仍然只有得到一個「Killed」字符串,並且全部顯示 –