命令用GDB挂起一个线程

stu*_*uck 12 c c++ gdb pthreads

我是GDB的新手.我希望有人能帮助我做一些非常简单的事情,我已经使用了Google/docs,但我只是遗漏了一些东西.

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

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

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

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

Emp*_*ian 11

请参阅文档set scheduler-locking on.

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

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

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

  • 有没有办法只冻结一个线程?我只看到关/开的选项 (2认同)

Hi-*_*gel 9

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

set target-async 1
set non-stop on
Run Code Online (Sandbox Code Playgroud)

我个人将这些命令放入.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-例如,所以你可能会快速打印有趣的值,然后继续执行.