在Linux上附加并调试已经运行的Ruby脚本?

时间:2015-05-22 15:58:39

标签: ruby linux debugging

我在Linux上使用在终端窗口中运行的Ruby脚本(它位于一个带有一些睡眠超时的while循环中,并且在某些内容发生变化时可以正常工作。)

问题是,有时脚本似乎冻结并停止响应。一个典型的情况是我把它放在一夜之间。

如果我中断并重新启动它,脚本运行正常。

那么, 1)有没有办法附加到这个已经运行的ruby脚本的解释器,以找出它被卡住的地方?理想情况下,我会得到一个堆栈跟踪。

如果不能实时, 2)我怎样才能运行它以便下次冻结我可以得到一个堆栈?

1 个答案:

答案 0 :(得分:1)

我认为可能有更好的“红宝石方式”来解决这个问题。但是在attach to a running ruby process上进行谷歌搜索发现了一篇博客文章,其中提供了一些有用的建议,可以使用gdb在Linux上调试实时Ruby进程:Tools for Debugging Running Ruby Processes。这进一步链接到another blog post,其中包含一些有关使用gdb获取ruby堆栈跟踪的有用信息:

  1. 找到ruby脚本的PID,例如

    ps aux | grep -i <script_name.rb>
    
  2. 使用gdb附加到它:

    sudo gdb `which ruby` <pid>
    
  3. 在gdb中运行这些命令以获取Ruby回溯:

    (gdb) set $ary = (int)backtrace(-1)
    (gdb) set $count = *($ary+8)
    (gdb) set $index = 0
    (gdb) while $index < $count
    >  x/1s *((int)rb_ary_entry($ary, $index)+12)
    >  set $index = $index + 1
    >end
    
  4. 这让我接近,但是gdb在加载ruby符号时遇到错误,而另一个错误试图运行backtrace函数。当我弄清楚更多时,我会更新这个答案。随意提出其他建议。

    • 博客文章还链接了一组有趣的gdb recipes用于调试Ruby。