Ruby отображает обратную трассировку, когда убит

Как мне заставить мою программу отображать backtrace / вызывающую сторону при смерти?
У меня есть проблема с бесконечным циклом в драгоценном камне, который не мой, и мне нужно знать, где проблема сообщить об этом

def hello
  puts 'hello'
end

def test
  while true
    sleep 2
    hello
  end
end

test

В этом примере, когда сигнал отмены посылается в программу, я хочу знать, что делает программа (отображение вызывающей стороны)
В настоящее время все, что я показываю, это "Убит" на выходе

3 ответа

Решение

Невозможно поймать сигналы sigkill, поскольку они отправляются ядру, а не процессу: https://major.io/2010/03/18/sigterm-vs-sigkill/

вы можете, однако, использовать "родительский" процесс, который отслеживает "детей" и соответственно реагирует на обработчик сигнала SIGKILL

Это означает, что я не могу отобразить обратную трассировку, мне, вероятно, придется использовать файл журнала или что-то в этом роде.

Я предполагаю, что у антивируса есть другой способ работать, чтобы избежать проблемы быть убитым

Я думаю, вам нужно поймать сигнал, вы пытались

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

Взято из https://robots.thoughtbot.com/using-gdb-to-inspect-a-running-ruby-process

В крайнем случае вы можете использовать gdb подключиться к запущенному процессу rubygdb </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
Другие вопросы по тегам