【问题标题】:Is there a way to use a keystroke to invoke the pry ruby gem?有没有办法使用击键来调用 pry ruby​​ gem?
【发布时间】:2014-10-15 14:04:12
【问题描述】:

我只是在想,如果能够运行一个程序,然后按一下键来调用 pry 和 debug,那该多好。也许那里有一个我不知道的在运行时动态注入 binding.pry 的 gem。如果没有,您将如何在即将执行的下一行 ruby​​ 脚本之前进行插入 binding.pry 的击键?

【问题讨论】:

  • 这怎么会发生?输入处理程序必须 - 必须 - 在与“主”代码不同的线程中运行,以便在程序运行时处理输入。你看过 gdb 吗?

标签: ruby pry


【解决方案1】:

假设是 POSIX 操作系统,您可以尝试在 ruby​​ 程序中添加信号处理程序。 ruby 文档甚至给出了您的用例示例:

.. 您的进程可能会捕获 USR1 信号并使用它来切换调试 (http://www.ruby-doc.org/core-2.1.3/Signal.html)

Signal.trap('USR1') do
  binding.pry
end

然后,发送信号:

kill -s SIGUSR1 [pid]

编辑:更完整的示例:application.rb

我上面的 naïve 建议会以ThreadError: current thread not owner 失败。这是一个使用全局 $debug 标志的更好示例。

#!/usr/bin/env ruby

require 'pry'

$debug = false
Signal.trap('USR1') do
  puts 'trapped USR1'
  $debug = true
end

class Application
  def run
    while true
      print '.'
      sleep 5
      binding.pry if $debug
    end
  end
end

Application.new.run

当 application.rb 在一个 shell 中的前台运行并且您从单独的 shell 发送 SIGUSR1 信号时,这似乎工作得最好。

在 Mac OS 10.9.5 中测试。 YMMV。

【讨论】:

  • 我收到了unsupported signal SIGUSR1 (ArgumentError)。不过,我正在运行 Cygwin。它应该至少部分符合 POSIX。当我在提示符下键入kill -l 时,30) SIGUSR1 是一个选项。另外,我无法理解将其放在哪里。我正在运行一个 Cucumber 测试套件。我把它扔进了hooks.rb 文件——如果这对你意味着什么!谢谢:)
  • 必须是我的设置...从irb 我输入Signal.list,我返回{"EXIT"=>0, "INT"=>2, "ILL"=>4, "ABRT"=>22, "FPE"=>8, "KILL"=>9, "SEGV"=>11, "TERM"=>15}。所以我只得到了所有 POSIX 信号的一个子集。
  • 为了好玩,看看您是否可以为自己的目的选择其中一个信号。但是,我不建议选择 INT、TERM 或 SEGV,而且您可能无法选择 KILL。
  • 第一次更新,我试过 SIGINT。它实际上确实有点工作,因为它让我进入了一个撬壳。它显然终止了我的进程。然后我意识到我没有从 cygwin shell 运行 irb 或 cucumber。当我从 cygwin 运行 irb 时,所有信号都可用。更多明天
  • 感谢您的编辑。我正要写,我认为需要更多!现在我正在考虑如何使用黄瓜套件来运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 2014-12-09
相关资源
最近更新 更多