【发布时间】:2015-05-09 10:37:15
【问题描述】:
我有一个 ruby 脚本,显然是正确的,有时 会停止工作(可能是通过 pg gem 调用 Postgresql)。问题是它冻结但不会产生任何错误,所以我看不到行号,我总是必须使用puts "ok1"、puts "ok2" 等来隔离行,然后查看脚本停止的位置。
有没有更好的方法来查看正在执行的当前行(不更改脚本)?也许是当前的堆栈?
【问题讨论】:
我有一个 ruby 脚本,显然是正确的,有时 会停止工作(可能是通过 pg gem 调用 Postgresql)。问题是它冻结但不会产生任何错误,所以我看不到行号,我总是必须使用puts "ok1"、puts "ok2" 等来隔离行,然后查看脚本停止的位置。
有没有更好的方法来查看正在执行的当前行(不更改脚本)?也许是当前的堆栈?
【问题讨论】:
您可以调查ruby-debug 一个项目,该项目已经为多个不同版本的 ruby 重写了多次,应该允许您逐行执行代码。在很多情况下,我个人更喜欢 printf 调试。此外,如果我必须对您的问题进行绝对随机的猜测,我可能会调查您是否在数据库中遇到了争用条件和/或死锁。
【讨论】:
ruby-debug,但不幸的是,在脚本运行时无法看到当前行正在执行。唯一的方法是在某处设置断点,但这不是我想要的。我只是想运行脚本并在某个时间打印正在执行的当前行,无论它是什么。
set_trace_func 的建议对我有用。转储每个正在执行的调用与进程正在执行的每个系统调用的 strace 输出混合,并设法追踪有问题的代码行。如果它有效,它并不愚蠢。