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

时间:2009-05-13 07:05:26

标签: multithreading debugging gdb

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

3 个答案:

答案 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之外,所有其他线程也将继续。请注意,stepnext等任何继续当前(以及所有其他)线程(在适当的位置设置临时断点之后,例如在下一行next命令)。

也许您希望能够在不恢复所有其他线程的情况下单步停止线程?在这种情况下,set scheduler-locking on就是答案。

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

另外请不要忘记set scheduler-locking off之前的continue,否则只有当前主题才能取得任何进展。

答案 2 :(得分:1)

这是GDB的默认设置。启用 Non-Stop Mode使用上设置不间断。