如何阻止线程在调试器断点处永久休眠?

时间:2018-08-17 15:26:22

标签: ruby

我正在调试一个Ruby应用程序,该应用程序具有一个为另一个进程提供心跳的线程。

心跳线非常简单:

while @continue
  socket.write("OK\n")
  sleep 5
end

我遇到的问题是,当调试器(byebug)在主进程中遇到断点时,心跳停止,并实际上杀死了我要调试的更广泛的应用程序。

我相信问题在于,当它在断点时进入睡眠状态时,它永远不会唤醒,直到调试器继续运行为止。

反正有没有阻止调试器全局阻止像这样从睡眠中唤醒的方法?

在这里可以使用on_debugger_stop\start回调的任何概念来告诉远程进程期望心跳暂停吗?

1 个答案:

答案 0 :(得分:1)

假设您正在使用MRI,并且您的实现看起来(或多或少)如下:

@continue = true
Thread.new do
  while @continue
    socket.write("OK\n")
    sleep 5
  end
end .join

# Debugging main thread
byebug  # e.g. Thread.list; Thread.list.last.terminate

您有2个并发线程。一切都应该正常工作。但是,您可以尝试一些解决方法(直到byebug得到修复):

  1. 创建子进程而不是线程(使用fork

    @continue = true
    @child_pid = fork do
      while @continue
        socket.write("OK\n")
        sleep 5
      end
    end
    
    # Debugging main thread
    byebug  # e.g. [Process.pid, @child_pid]; Process.kill('SIGHUP', @child_pid)
    
  2. 使用pry代替byebug

    @continue = true
    Thread.new do
      while @continue
        socket.write("OK\n")
        sleep 5
      end
    end .join
    
    # Debugging main thread
    binding.pry  # e.g. Thread.list; Thread.list.last.terminate
    

此外,请确保检查Ruby和Byebug版本的兼容性。也许当前版本中包含修复程序。我不知道任何调试器的启动或停止挂钩。

希望您会有所帮助。