检查为什么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表示继续(到下一个异常,断点或行:调试器), 另见:Debugging with ruby-debug,Key shortcuts for ruby-debug gem. 这种方法的缺点是没有魔术按钮来按需提升调试器,除了在脚本中引发异常,它将显示不同的代码块而不是挂起代码. 以下是其他一些想法: >将调试器语句添加到代码中,引发调试器并逐步执行. 通过以下方式安装:gem install pry,运行方式:pry或add as require’prey’. 示例(将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(您可以通过以下方式扩展它: >通过以下方式安装:sudo apt-get install gdb python-dev ncurses-dev&& gem install gdb.rb 另见:using gdb to inspect a hung ruby process,GDB wrapper for Ruby和Inspecting a live Ruby process. 如果没有任何帮助,您可以使用以下语法尝试:strace(Linux)/ dtruss(OS X): sudo strace -fp <PID> sudo dtruss -fp <PID> 或者 如果您认为这是一个网络问题,请使用tcpdump. 也可以看看: > How do I debug Ruby scripts? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |