命令用GDB挂起一个线程

时间:2011-04-17 22:56:47

标签: c++ c gdb pthreads

我对GDB有点新意。我希望有人可以帮助我做一些非常简单的事情,我使用过Google / docs,但我只是遗漏了一些东西。

人们使用GDB调试线程应用程序的“正常”方式是什么?我正在使用pthreads。我只想看一个线程 - 我看到的两个选项是

a)告诉调试器以某种方式附加到特定线程,这样步进不会导致在每个上下文切换上跳转线程

b)告诉调试器暂停/释放任何“不感兴趣”的线程

我更愿意去路线b) - 阅读GDB的帮助我没有看到这个命令,提示?

2 个答案:

答案 0 :(得分:9)

请参阅set scheduler-locking on的文档。

注意:如果你挂起其他线程,并且其中一个持有锁,并且如果你的有趣的线程在步进时需要锁定,那么你就会陷入僵局。

  

人们调试线程应用程序的“正常”方式是什么

你永远无法调试线程的正确性,你只能设计它。根据我的经验,大多数线程应用程序的调试都会进行断言,并在其中一个断言被违反时检查世界状态。

答案 1 :(得分:9)

首先,您需要使用以下命令启用多线程调试器行为。不知道为什么默认禁用它。

set target-async 1
set non-stop on

我个人将这些命令放入 .gdbinit 文件中。它们使您的每个命令仅应用于当前关注的线程。注意:线程可能正在运行,因此您必须暂停它。

要查看焦点线程,请执行thread

要切换到另一个线程,请附加线程的编号,例如thread 2

要查看包含其号码的所有主题info thread

要将命令应用于特定线程,请执行类似 thread apply threadnum命令的操作。例如。 thread apply 4 bt将backtrace命令应用于线程编号4. thread apply all continue继续所有暂停的线程。

虽然有一个小问题 - 许多命令需要暂停线程。我知道几种方法:

  • interrupt命令:中断线程执行,接受多个线程暂停,没有参数打破聚焦线程。
  • 在某处设置断点。请注意,您可以为特定线程设置断点,以便其他线程将忽略它,例如 break linenum thread threadnum 。例如。 break 25 thread 4

您也可以通过命令commands找到非常有用的you can set a list of commands to be executed when a breakpoint hit - 例如,你可以快速打印有趣的值,然后继续执行。