Ruby被杀后显示回溯

时间:2017-05-27 08:53:35

标签: ruby kill

如何让我的程序在被杀时显示回溯/调用者?
我有一个问题,即宝石中的无限循环不是我的,需要知道报告问题的位置

def hello
  puts 'hello'
end

def test
  while true
    sleep 2
    hello
  end
end

test

在这个例子中,当一个kill信号发送到程序时,我想知道程序在做什么(显示调用者)
目前,我所显示的是" Killed"在输出

3 个答案:

答案 0 :(得分:1)

我猜你需要发出信号, 你试过吗

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

答案 1 :(得分:1)

无法捕获sigkill信号,因为它们被发送到内核而不是进程:https://major.io/2010/03/18/sigterm-vs-sigkill/

但是,你可以使用一个监视“孩子”的“父”程序,并做出相应的反应SIGKILL signal Handler

这意味着我无法显示回溯,我可能不得不使用日志文件或类似的东西。

我认为反病毒有不同的工作方式来避免被杀害的问题

答案 2 :(得分: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