解决方法
使用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 Ruby和Inspecting a live Ruby process.
>其他可以提供帮助的库/工具包括:debugger,crash-watch,memprof,rack-perftools_profiler.
如果没有任何帮助,您可以使用以下语法尝试:strace(Linux)/ dtruss(OS X):
sudo strace -fp <PID> sudo dtruss -fp <PID>
如果您认为这是一个网络问题,请使用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 Processes和Debugging 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