代码之家  ›  专栏  ›  技术社区  ›  Paul Wicks asgeo1

当到达gdb中的断点时,是否可以停止所有其他线程的执行?

  •  3
  • Paul Wicks asgeo1  · 技术社区  · 15 年前

    所以,一旦我在某个线程中遇到断点,是否可以停止其他线程,直到我继续?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Employed Russian    15 年前

    在所有停止模式(当前发布版本支持的唯一模式)中,GDB将在任何线程停止时(由于断点或信号)立即停止所有线程。

    当您继续停止的线程时,所有其他线程也将继续,除非您这样做。 set scheduler-locking on . 注意任何 step , next 等。 继续 当前(以及所有其他)线程(在适当位置设置临时断点后,例如在下一行上 下一个 命令)。

    也许您希望能够在不恢复所有其他线程的情况下单步停止线程?在那种情况下, 设置调度程序锁定 就是答案。

    注意:如果另一个线程持有一个锁,则打开调度程序锁定,并且当前线程也需要相同的锁,则程序将无限期等待。如果其中一个线程位于malloc/realloc内部,并且当前语句试图分配一些内存,则通常会出现这种情况。

    也别忘了 set scheduler-locking off 之前 continue ,否则只有当前线程才能进行任何转发。

        2
  •  4
  •   stefanB    15 年前

    当程序在gdb下因任何原因停止时,例如达到断点,所有执行线程都将停止,而不仅仅是当前线程。

    问题是,当您在一个线程中单步执行代码时,其他线程可能会执行多个步骤。另一个问题是,其他线程停止在语句中间,而不是在语句边界处,因此看起来可能有点混乱。

    除此之外,如果系统调用中的其他线程被阻塞,一旦“您的”线程停止,系统调用将提前返回,因此您将得到有趣的结果,除非您以检查此情况并在发出信号后重新启动阻塞调用的特定方式进行编码。

    您可以在中找到更多信息 Debugging with GDB - Section 5.4 Stopping and Starting Multi-thread Programs 可以在gdb网站的文档部分找到。

    编辑:看起来你想要的是不停模式。看起来像 this version 有第5.4.2节讨论不停止模式,版本 gnu site 没有。

        3
  •  1
  •   lothar    15 年前

    这是gdb的默认值。使能 Non-Stop Mode 使用 设置不停机 .