2017-05-27 72 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