gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:13 29 4
gpt4 key购买 nike

我在 Linux 上使用在终端窗口中运行的 Ruby 脚本(它位于一个 while 循环中,有一些 sleep 超时,并且在某些事情发生变化时工作。)

问题是,有时脚本似乎卡住并停止响应。一个典型的情况是,如果我让它静置一整夜。

如果我中断并重新启动它,脚本可以正常工作。

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

如果不能即时运行,2)我如何运行它以便下次它卡住时我可以获得堆栈?

最佳答案

我认为可能有更好的“ruby 方法”来解决这个问题。但是在 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

这让我很接近,但是 gdb 在加载 ruby​​ 符号时遇到错误,并且在尝试运行 backtrace 函数时遇到另一个错误。当我弄清楚更多时,我会更新这个答案。欢迎提出其他建议。

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

关于ruby - 附加到并调试 Linux 上已经运行的 Ruby 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30401143/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com