【发布时间】:2017-11-27 11:17:11
【问题描述】:
是否可以从另一个线程获取一个线程的Kernel#caller 输出?或者甚至更好的是后台线程的主线程堆栈,这对我来说是一种分析器。
【问题讨论】:
标签: ruby multithreading profiling callstack
是否可以从另一个线程获取一个线程的Kernel#caller 输出?或者甚至更好的是后台线程的主线程堆栈,这对我来说是一种分析器。
【问题讨论】:
标签: ruby multithreading profiling callstack
有 Thread#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 转储以下信息(另请参阅示例输出):
所有线程的回溯
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
【讨论】: