【问题标题】:Ruby display backtrace when killedRuby 被杀死时显示回溯
【发布时间】:2017-05-27 08:53:34
【问题描述】:

如何让我的程序在被杀死时显示回溯/调用者?
我有一个不属于我的 gem 中的无限循环问题,我需要知道问题出在哪里来报告它

def hello
  puts 'hello'
end

def test
  while true
    sleep 2
    hello
  end
end

test

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

【问题讨论】:

  • 我会试试at_exit { puts caller.inspect } 也许有帮助
  • 不,它不起作用,我仍然只在术语上显示“Killed”字符串,仅此而已
  • 你使用的是 sigterm 还是 sigkill (9) ?
  • 使用 htop 和 sigkill 选项。但如果可能的话,我希望它与 Windows 兼容(不知道它使用什么)
  • 为 Linux 说话。只有具有进程的真实或有效用户 ID 或 root 的用户才能向进程发送信号。因此,您的防病毒软件一切正常。

标签: ruby kill


【解决方案1】:

我猜你需要捕捉一个信号, 你试过了吗

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

【讨论】:

  • 这正是我要建议的 :) 这是 Ruby 的做法。
  • 不适用于 sigkill :/ (尝试在捕获信号后运行循环并使用 htop 发送 sigkill 信号)
【解决方案2】:

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

但是,您可以使用“父”进程来监视“子”并做出相应的反应SIGKILL signal Handler

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

我想防病毒有不同的工作方式来避免被杀死的问题

【讨论】:

  • 为 Linux 说话。只有具有进程的真实或有效用户 ID 或 root 的用户才能向进程发送信号。因此,您的防病毒软件一切正常。
【解决方案3】:

取自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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多