当程序因任何原因停止,例如到达断点时,在gdb下所有的线程都会停止,而不仅仅是当前线程。问题在于,当你在一个线程中逐步执行代码时,其他线程可能会执行多个步骤。另一个问题是,其他线程在语句中间而不是在语句边界停止,所以看起来有点乱。此外,一旦“你”的线程停止,如果其他线程被阻塞在系统调用中,系统调用将会过早返回,所以除非你特别编写代码来检查这一点并在信号后重新启动阻塞调用,否则你会得到奇怪的结果。你可以在gdb网站的文档部分中找到 Debugging with GDB - Section 5.4 Stopping and Starting Multi-thread Programs 中的更多信息。编辑:看起来 Non-stop 模式是你想要的,这个 版本 有一个讨论 Non-stop 模式的第5.4.2节,而 GNU 站点 上的版本没有。
在所有停止模式下(当前版本仅支持此模式),当任何线程停止(由于断点或信号)时,GDB将停止所有线程。当您继续停止的线程时,除非您执行set scheduler-locking on,否则所有其他线程也将继续。请注意,任何step、next等命令都会“继续”当前线程(并因此继续所有其他线程)(在适当位置设置临时断点,例如对于next命令,在下一行)。也许您想要单步执行已停止的线程而不恢复所有其他线程?在这种情况下,set scheduler-locking on就是答案。注意:如果另一个线程持有锁定,您打开了调度程序锁定,并且您当前的线程还需要相同的锁定,则您的程序将无限期等待。这经常发生在其中一个线程内部使用malloc/realloc,并且您当前的语句尝试分配一些内存。在continue之前也不要忘记set scheduler-locking off,否则只有当前线程会取得任何进展。