我正在调试一个Ruby应用程序,该应用程序具有一个为另一个进程提供心跳的线程。
心跳线非常简单:
while @continue
socket.write("OK\n")
sleep 5
end
我遇到的问题是,当调试器(byebug)在主进程中遇到断点时,心跳停止,并实际上杀死了我要调试的更广泛的应用程序。
我相信问题在于,当它在断点时进入睡眠状态时,它永远不会唤醒,直到调试器继续运行为止。
反正有没有阻止调试器全局阻止像这样从睡眠中唤醒的方法?
在这里可以使用on_debugger_stop\start
回调的任何概念来告诉远程进程期望心跳暂停吗?
答案 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得到修复):
创建子进程而不是线程(使用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)
使用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版本的兼容性。也许当前版本中包含修复程序。我不知道任何调试器的启动或停止挂钩。
希望您会有所帮助。