c++ - 无论如何,是否允许一个应用程序线程在 GDB 中的断点处继续运行?

标签 c++ c gdb apache-zookeeper

在使用 Apache Zookeeper C 运行时库调试应用程序时,我在使用 GDB 中的默认全停止模式设置断点时遇到了问题。由于 Zookeeper 线程无法运行,服务器将使 session 超时,从而删除您可能已创建的任何临时 znode。使用不间断模式我可以防止这种情况发生,但我失去了能够检查任何非 Zookeeper 线程状态的便利。

GDB 中是否有一种方法可以指定一个(或多个)线程在遇到断点时继续在应用程序中运行,但其他线程将停止运行?这样我就可以检查我关心的线程的状态并忽略我想在后台运行的线程的状态。

编辑:这基本上是 not stopping all threads in gdb 的拷贝.那里使用具有不间断模式的后台命令的解决方案基本上解决了我的问题,因为我可以随时停止线程并异步重新启动它们,所以也许我们应该关闭这个。

最佳答案

事实证明,使用 Zookeeper 可以执行 hack,以便在 gdb 中中断 session 时继续进行。这个 hack 利用了 Zookeeper 和 gdb 的一些属性:

  • 您可以有多个具有相同 session ID 的 Zookeeper 客户端
  • gdb 不会在父断点处停止子进程
  • 您可以忽略子进程中的 gdb 信号而不影响父进程

基于此,解决方案变成了生成一个子进程,该子进程使用与父进程相同的客户端 ID 连接到 Zookeeper,并且什么都不做。然而,Zookeeper 客户端有 session 移动的概念,客户端每隔一段时间就会切换它们连接到的服务器。如果您有两个具有相同 session ID 的客户端,其中一个可能会移动,而另一个连接到不保持其 session 的服务器。为防止这种情况,子级必须仅连接到父级当前连接到的服务器。因此, parent 和 child 看起来像下面这样:

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 中禁用日志记录的一种未记录的方法。

关于c++ - 无论如何,是否允许一个应用程序线程在 GDB 中的断点处继续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5250277/

相关文章:

C 数组 - 最大数及其位置

c - GDB - 在单独的窗口中显示目标应用程序的输出

linux - 使用来自不同系统的 GDB 分析核心转储会给出 .dynamic 部分警告

c++ - 在 gdb 中跟踪对类实例/内存范围的写访问

c++ - C++ 和 OpenCV 中的 SSE 均值滤波器

进程是否可以请求正在运行的 shell 进程运行某些命令并接收该命令的标准输出?

c++ - 将文件中的值添加到双指针

c - 'printf("%-x", 2048);' 中的 (-) 符号有什么作用?

混合模板类和模板方法时出现 C++ 错误

c++ - 是否可以在不编写复制构造函数的情况下在 main 中的构造函数之间进行选择?