如何让我的程序在死亡时显示回溯/呼叫者?
我有一个问题,在一个宝石,是不是我的无限循环和需要知道的问题是汇报死亡时红宝石显示回溯
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”字符串,并且全部显示 –