如何获得另一个线程的调用堆栈?

时间:2017-06-23 19:38:53

标签: ruby multithreading profiling callstack

是否可以从另一个线程获得一个线程的Kernel#caller输出?或者更好的是来自背景的主线程的堆栈,这对我来说可以作为一种分析器。

1 个答案:

答案 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