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

4

当我在某个线程中设置断点时,是否可能暂停其他线程直到我继续?

3个回答

4
当程序因任何原因停止,例如到达断点时,在gdb下所有的线程都会停止,而不仅仅是当前线程。
问题在于,当你在一个线程中逐步执行代码时,其他线程可能会执行多个步骤。另一个问题是,其他线程在语句中间而不是在语句边界停止,所以看起来有点乱。
此外,一旦“你”的线程停止,如果其他线程被阻塞在系统调用中,系统调用将会过早返回,所以除非你特别编写代码来检查这一点并在信号后重新启动阻塞调用,否则你会得到奇怪的结果。
你可以在gdb网站的文档部分中找到 Debugging with GDB - Section 5.4 Stopping and Starting Multi-thread Programs 中的更多信息。
编辑:看起来 Non-stop 模式是你想要的,这个 版本 有一个讨论 Non-stop 模式的第5.4.2节,而 GNU 站点 上的版本没有。

此答案中的不准确之处:
  • 非停止模式是Paul Wicks想要的相反;他要求默认行为。
  • 对于在系统调用中被阻塞的“其他”线程,当“您”的线程停止时,系统调用不会返回(尽管当您继续时,系统调用可能会返回)。
- Employed Russian

4
在所有停止模式下(当前版本仅支持此模式),当任何线程停止(由于断点或信号)时,GDB将停止所有线程。
当您继续停止的线程时,除非您执行set scheduler-locking on,否则所有其他线程也将继续。请注意,任何stepnext等命令都会“继续”当前线程(并因此继续所有其他线程)(在适当位置设置临时断点,例如对于next命令,在下一行)。
也许您想要单步执行已停止的线程而不恢复所有其他线程?在这种情况下,set scheduler-locking on就是答案。
注意:如果另一个线程持有锁定,您打开了调度程序锁定,并且您当前的线程还需要相同的锁定,则您的程序将无限期等待。这经常发生在其中一个线程内部使用malloc/realloc,并且您当前的语句尝试分配一些内存。
continue之前也不要忘记set scheduler-locking off,否则只有当前线程会取得任何进展。

1

这是GDB的默认设置。要启用非停止模式,请使用set non-stop on


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接