是否可以从另一个线程获得一个线程的Kernel#caller
输出?或者更好的是来自背景的主线程的堆栈,这对我来说可以作为一种分析器。
答案 0 :(得分:0)
有线程#backtrace方法来获取某些线程的函数回溯:
https://ruby-doc.org/core-2.4.1/Thread.html#method-i-backtrace
backtrace
→数组点击以切换来源返回目标线程的当前回溯。
对于用法示例,请检查此项目:https://github.com/frsyuki/sigdump(它将显示ruby和jruby的回溯和一些内存使用信息)
sigdump
- 简而言之:用于Ruby的Java VM的SIGQUIT(使用信号显示Ruby进程的堆栈跟踪而不重新启动它)。...只是发送SIGCONT信号会将回溯和内存配置文件转储到/tmp/sigdump-.log文件。
sigdump转储以下信息(另请参见示例输出):
所有线程的Backtrace
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