tyr*_*731 5 c c++ gdb apache-zookeeper
在使用 Apache Zookeeper C 运行时库调试应用程序时,我在 GDB 中使用默认的全停止模式设置断点时遇到了问题。由于 Zookeeper 线程无法运行,服务器将使会话超时,从而删除您可能创建的任何临时 znode。使用不间断模式我可以防止这种情况发生,但我失去了能够检查任何非 Zookeeper 线程状态的便利。
GDB 中是否有一种方法可以指定当遇到断点时一个(或多个)线程将继续在应用程序中运行,但其他线程将停止运行?这样我就可以检查我关心的线程的状态,而忽略那些我想在后台运行的线程的状态。
编辑:这本质上是不停止 gdb 中所有线程的重复。在非停止模式下使用后台命令的解决方案基本上解决了我的问题,因为我可以随时停止线程并异步重新启动它们,所以也许我们应该关闭这个。
事实证明,使用 Zookeeper 可以执行一种 hack,以便允许会话在 gdb 中断时继续进行。这个 hack 利用了 Zookeeper 和 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
Run Code Online (Sandbox Code Playgroud)
我使用 libzookeeper_mt-0.3.3 对此进行了测试,它的工作原理如下。当您进行此黑客攻击时,Zookeeper 日志中会开始出现一些令人沮丧的内容。如果您无法忽略日志,可以按如下方式将其关闭:
zoo_set_debug_level((ZooLogLevel)0);
Run Code Online (Sandbox Code Playgroud)
这是 Zookeeper 中禁用日志记录的一种未记录的方法。