gpt4 book ai didi

ruby - 检查为什么 ruby​​ 脚本挂起

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:10 26 4
gpt4 key购买 nike

有时我的规范可能会挂起,我必须终止相应的 ruby​​ 进程。当我运行用 capybara 和 webkit 驱动程序编写的集成规范时,这很常见。

是否可以检查给定的 ruby​​ 进程并查看它卡在哪里?哪个方法、操作、文件、行号等

最佳答案

tl;博士

使用 gdb(例如 Linux):

  • echo 'call (void)rb_backtrace()' | gdb -p $(pgrep -f ruby​​)

或使用 lldb(例如 OS X):

  • echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -f ruby​​)

您可以使用调试库调试 Ruby 脚本。

如果脚本是从 shell 执行的,这可以通过将脚本的第一行 ( shebang ) 更改为:

#!/usr/bin/env ruby -rdebug

或将其运行为:

ruby -rdebug my_script.rb

加载调试器后,您可以设置一些断点或通过键入 c 继续执行来运行应用程序。

然后调试器会自动中断任何异常(例如 Ctrl+C)或断点(例如包含 debugger 的行)。

然后每次显示调试器控制台时,您可以选择:

  • c 用于继续(到下一个异常、断点或行:debugger),
  • n 为下一行,
  • w/where 显示帧/调用堆栈,
  • l 显示当前代码,
  • cat 显示捕获点。
  • h 获取更多帮助。

另请参阅:Debugging with ruby-debugKey shortcuts for ruby-debug gem

这种方法的缺点是没有神奇的按钮来按需引发调试器,除了在脚本中引发异常,这将显示不同的代码块而不是挂起的代码块。

这里有一些其他的想法:

  • debugger 语句添加到您的代码中,启动调试器并逐步进行。
  • 改用 Pry 调试器(参见:GitHub)。

    安装方式:gem install pry,运行为:pry 或添加为 require 'pry'

  • 尝试 lldb 调试器(旨在取代 gdb),它可以附加到当前正在运行的进程。

    示例(将 PID 替换为您的进程 ID):

    $ lldb -p PID
    (lldb) bt all
    * thread #1: tid = 0x11d68a, 0x00007fff86c71716 libsystem_kernel.dylib`__psynch_cvwait + 10
    * frame #0: 0x00007fff86c71716 libsystem_kernel.dylib`__psynch_cvwait + 10
    frame #1: 0x00007fff838a9c3b libsystem_pthread.dylib`_pthread_cond_wait + 727
    frame #2: 0x0000000100241aad libruby.2.0.0.dylib`native_cond_wait + 29

    另一个显示实时运行的 ruby​​ 脚本回溯的示例(在其 tty 上):

    echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -f ruby)
  • 或者使用 gdb(您可以通过以下方式扩展它:gdb.rb,它可以显示 ruby​​ 对象)。

    1. 安装方式:sudo apt-get install gdb python-dev ncurses-dev && gem install gdb.rb
    2. 在 Unix/OS X 上,在挂起的进程上按 Ctrl+T 以检查 PID 和正在执行的操作(或通过 ps wuax | grep ruby​​ 检查)。
    3. 通过以下方式附加到进程:gdb -p PID

    另请参阅:using gdb to inspect a hung ruby processGDB wrapper for RubyInspecting a live Ruby process

  • 其他可以提供帮助的库/工具包括:debuggercrash-watchmemprofrack-perftools_profiler

如果没有任何帮助,您可以简单地尝试:strace (Linux)/dtruss (OS X),语法如下:

sudo strace -fp <PID>
sudo dtruss -fp <PID>

或者 ltrace,它可以跟踪库调用而不是 strace 系统调用。

如果您认为这是网络问题,请使用 tcpdump

另见:

关于ruby - 检查为什么 ruby​​ 脚本挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13406370/

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