检查为什么ruby脚本挂起

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

是否可以检查给定的红宝石过程并查看它挂在哪里?哪种方法,操作,文件,行号等

解决方法

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)或断点(例如组成调试器的行).

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

> c表示继续(到下一个异常,断点或行:调试器),
> n代表下一行,
> w /在哪里显示帧/调用堆栈,
> l显示当前代码,
>猫来展示捕捉点.
> h获取更多帮助.

另见:Debugging with ruby-debug,Key shortcuts for ruby-debug gem.

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

以下是其他一些想法:

>将调试器语句添加到代码中,引发调试器并逐步执行.
>改用Pry调试器(参见:GitHub).

通过以下方式安装:gem install pry,运行方式:pry或add as require’prey’.
>尝试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对象).

>通过以下方式安装:sudo apt-get install gdb python-dev ncurses-dev&& gem install gdb.rb
>在Unix / OS X上按下Ctrl T挂起进程以检查PID和正在做什么(或通过ps wuax | grep ruby​​检查).
>通过以下方式附加到流程:gdb -p PID.

另见:using gdb to inspect a hung ruby process,GDB wrapper for RubyInspecting a live Ruby process.
>其他可以提供帮助的库/工具包括:debugger,crash-watch,memprof,rack-perftools_profiler.

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

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

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

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

也可以看看:

> How do I debug Ruby scripts?
> How do I configure ruby to enter the debugger on Ctrl-C (SIGINT)?
> How do I use the keyboard to break into ruby-debug running a rails app?
> Is there a way to use a keystroke to invoke the pry ruby gem?
> Debugging Stuck Ruby Processes – What to do Before You Kill -9
> Tools for Debugging Running Ruby ProcessesDebugging Ruby Tools
> Debugging Rails Applications
> The right way to deal with frozen processes on Unix
> Debugging Ruby-applications in Unix by Sergii Boiko
> Debugging using Ruby Debugger在JumpstartLab
> ruby-debug in 30 seconds (we don’t need no stinkin’ GUI!)
> How to debug stuck Ruby processes

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...