Ruby 被杀死时显示回溯
Ruby display backtrace when killed
如何让我的程序在被杀死时显示回溯/调用者?
我有一个 gem 中的无限循环问题,这不是我的问题,需要知道问题出在哪里才能报告它
def hello
puts 'hello'
end
def test
while true
sleep 2
hello
end
end
test
在这个例子中,当一个终止信号被发送到程序时,我想知道程序在做什么(显示调用者)
目前我得到的所有显示是 "Killed" 在输出
我想你需要捕捉信号,
你试过了吗
无法捕获 sigkill 信号,因为它们被发送到内核而不是进程:https://major.io/2010/03/18/sigterm-vs-sigkill/
但是,您可以使用 "parent" 进程来监视 "children" 并做出相应的反应 SIGKILL signal Handler
这意味着我无法显示回溯,我可能不得不使用日志文件或类似的东西。
我想杀毒软件有不同的工作方式来避免被杀死的问题
取自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
如何让我的程序在被杀死时显示回溯/调用者?
我有一个 gem 中的无限循环问题,这不是我的问题,需要知道问题出在哪里才能报告它
def hello
puts 'hello'
end
def test
while true
sleep 2
hello
end
end
test
在这个例子中,当一个终止信号被发送到程序时,我想知道程序在做什么(显示调用者)
目前我得到的所有显示是 "Killed" 在输出
我想你需要捕捉信号, 你试过了吗
无法捕获 sigkill 信号,因为它们被发送到内核而不是进程:https://major.io/2010/03/18/sigterm-vs-sigkill/
但是,您可以使用 "parent" 进程来监视 "children" 并做出相应的反应 SIGKILL signal Handler
这意味着我无法显示回溯,我可能不得不使用日志文件或类似的东西。
我想杀毒软件有不同的工作方式来避免被杀死的问题
取自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