所以,只要我在某个线程中遇到断点,是否可以暂停其他线程直到我继续?
答案 0 :(得分:4)
当程序因任何原因(例如到达断点)停止在gdb下时,所有执行的线程都将停止,而不仅仅是当前线程。
问题在于,当您在一个线程中单步执行代码时,其他线程可能会执行多一步。另一个问题是其他线程停在语句的中间而不是语句边界,所以它可能看起来有点乱。
除此之外,一旦'你的'线程停止,如果在系统调用中阻塞了其他线程,系统调用将提前返回,因此除非你以检查这个并重新启动的方式进行特定编码,否则你将得到有趣的结果信号后的阻塞呼叫。
您可以在Debugging with GDB - Section 5.4 Stopping and Starting Multi-thread Programs 中找到更多信息,可以在gdb网站的“文档”部分找到。
编辑:看起来像你不停的模式。看起来this version的第5.4.2节讨论了非停止模式,即gnu site上的版本没有。
答案 1 :(得分:2)
在全停模式下(当前发布版本支持的唯一模式)GDB将在任何线程停止后立即停止所有线程(由于断点或信号)。
当您继续停止的线程时,除了执行set scheduler-locking on
之外,所有其他线程也将继续。请注意,step
,next
等任何继续当前(以及所有其他)线程(在适当的位置设置临时断点之后,例如在下一行next
命令)。
也许您希望能够在不恢复所有其他线程的情况下单步停止线程?在这种情况下,set scheduler-locking on
就是答案。
注意:如果另一个线程持有锁,则打开调度程序锁定,并且当前线程也需要相同的锁,程序将无限期地等待。如果其中一个线程在malloc / realloc中,并且当前语句尝试分配一些内存,则通常会出现这种情况。
另外请不要忘记set scheduler-locking off
之前的continue
,否则只有当前主题才能取得任何进展。
答案 2 :(得分:1)
这是GDB的默认设置。启用 Non-Stop Mode使用在上设置不间断。