是否可以从另一个线程获得一个Kernel#caller
输出或者更好的是从后台堆栈主线程,这对我来说是一种分析器。
最佳答案
有Thread#backtrace方法可获取某些线程的函数backtrace:
https://ruby-doc.org/core-2.4.1/Thread.html#method-i-backtracebacktrace
→数组单击以切换源
返回目标线程的当前回溯。
例如,检查这个项目:https://github.com/frsyuki/sigdump(它将显示ruby和jruby的回溯和一些内存使用信息)sigdump
-简而言之:javavmforruby的sigquit(使用signal显示ruby进程的stacktrace而不重新启动它)。
... 只要发送sigcont信号,就会将回溯和内存配置文件转储到/tmp/sigdump-.log文件。
sigdump转储以下信息(另请参阅示例输出):
所有线程的回溯
https://github.com/frsyuki/sigdump/blob/master/lib/sigdump.rb
dump_all_thread_backtrace(io)
...
Thread.list.each do |thread|
dump_backtrace(thread, io)
...
def self.dump_backtrace(thread, io)
status = thread.status
if status == nil
status = "finished"
elsif status == false
status = "error"
end
io.write " Thread #{thread} status=#{status} priority=#{thread.priority}\n"
if thread.backtrace
thread.backtrace.each {|bt|
io.write " #{bt}\n"
}
end
io.flush
nil
end