有没有可能检查给定的ruby进程并查看它在哪里卡住了?包括方法、操作、文件、行号等信息。
使用 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
获取更多帮助。另请参阅:使用 ruby-debug 进行调试、ruby-debug gem 的键盘快捷键。
这种方法的缺点是没有像按一个魔法按钮一样随时引发调试器的功能,唯一的方法是在脚本内部引发异常,这将展示不同的代码块而不是挂起的代码块。
以下是一些其他想法:
debugger
语句,引发调试器并逐步执行。通过以下命令进行安装: 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 对象)。
sudo apt-get install gdb python-dev ncurses-dev && gem install gdb.rb
ps wuax | grep ruby
检查)。gdb -p PID
。另请参阅:使用 gdb 检查已挂起的 Ruby 进程、Ruby 的 GDB 包装器 以及 检查运行中的 Ruby 进程。
如果没有帮助,您可以尝试使用以下语法:strace
(Linux)/dtruss
(OS X):
sudo strace -fp <PID>
sudo dtruss -fp <PID>
或者使用可以跟踪库调用的ltrace
,与strace
系统调用不同。tcpdump
。 1 requests remaining
Page finished with true
Received 200 from "http://w.sharethis.com/share4x/js/st.60709d5fdf0c137e879e64f41b8a6606.js"
0 requests remaining
Started request to "http://w.sharethis.com/share4x/css/share.470030190b6a6bdc89365fcc74d3bf55.css"
Received 200 from "http://w.sharethis.com/share4x/css/share.470030190b6a6bdc89365fcc74d3bf55.css"
0 requests remaining
这启示我搜索我的代码库以查找ShareThis。我在该代码周围放置了一个if(Rails.env.test?)块,然后,瞧,我开始工作了。不得不在您的代码库中为测试环境放置条件语句是一个糟糕的解决方法...但它让我从这个愚蠢的问题中前进了...
希望这可以帮助到您。