【问题标题】:How do I get a call stack of another thread?如何获取另一个线程的调用堆栈?
【发布时间】:2017-11-27 11:17:11
【问题描述】:

是否可以从另一个线程获取一个线程的Kernel#caller 输出?或者甚至更好的是后台线程的主线程堆栈,这对我来说是一种分析器。

【问题讨论】:

    标签: ruby multithreading profiling callstack


    【解决方案1】:

    有 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
    

    【讨论】:

    • 或者检查这个:itreallymatters.net/post/29549982905/…(以及关于thread#backtrace:“这个方法存在于1.9中。对于旧的Ruby版本,有一个不同的解决方案,它不是那么好,因为它可以工作仅适用于当前线程。")
    猜你喜欢
    • 2018-09-22
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    相关资源
    最近更新 更多