事实证明,使用 Zookeeper,您可以执行一个 hack,以允许会话在 gdb 中中断时继续。这个黑客利用了 Zookeeper 和 gdb 的一些属性:
- 您可以拥有多个具有相同会话 ID 的 Zookeeper 客户端
- gdb 不会在父断点处停止子进程
- 您可以忽略子进程中的 gdb 信号而不影响父进程
基于此,解决方案变成了生成一个子进程,该子进程使用与父进程相同的客户端 ID 连接到 Zookeeper,并且不执行任何其他操作。然而,Zookeeper 客户端具有会话移动的概念,客户端每隔一段时间就会切换它们所连接的服务器。如果您有两个具有相同会话 ID 的客户端,其中一个可能会移动,而另一个连接到不保留其会话的服务器。为了防止这种情况,孩子必须只连接到父母当前连接的服务器。因此,父母和孩子如下所示:
Parent(zh):
host = zookeeper_get_connected_host(zh)
client_id = zoo_client_id(zh)
if fork == 0
exec child host client_id
end
Child(host, client_id):
ignore SIGINT
zh = zookeeper_init(host, client_id)
while(true)
sleep
end
我使用 libzookeeper_mt-0.3.3 对此进行了测试,它的工作原理与描述的一样。当您执行此 hack 时,Zookeeper 日志中开始出现一些令人沮丧的问题。如果您不能忽略日志,可以按如下方式将其关闭:
zoo_set_debug_level((ZooLogLevel)0);
这是 Zookeeper 中禁用日志记录的一种无证方式。