命令用GDB挂起线程

command to suspend a thread with GDB

本文关键字:线程 挂起 GDB 命令      更新时间:2023-10-16

我对GDB有点陌生。我希望有人能帮我做一些应该很简单的事情,我已经使用了Google/docs,但我只是错过了一些东西。

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

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

b)告诉调试器挂起/释放任何'不感兴趣'的线程

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

参见set scheduler-locking on的文档。

注意:如果你挂起其他线程,如果其中一个线程持有锁,如果你的感兴趣的线程在步进时需要锁,你就会死锁。

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

你永远不能调试线程的正确性,你只能在。根据我的经验,大多数线程应用的调试都是放入断言,并在其中一个断言被违反时检查世界的状态。

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

set target-async 1
set non-stop on

我个人把这些命令放在中。gdbinit文件。它们使您的每个命令仅应用于当前聚焦的线程。注意:线程可能正在运行,所以你必须暂停它。

查看焦点线程执行thread

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

查看所有线程及其编号,请参阅info thread

要将命令应用到特定线程,发出类似thread apply threadnum command的命令。例如,thread apply 4 bt将对编号为4的线程应用回溯命令。thread apply all continue继续所有暂停的线程

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

  • interrupt命令:中断线程的执行,接受一个线程的数目来暂停,不带参数地中断被聚焦的线程。
  • 设置某个断点。请注意,您可以为特定线程设置断点,以便其他线程忽略它,例如break linenum thread threadnum。例:break 25 thread 4 .

您可能还会发现,通过命令commands设置一个在遇到断点时执行的命令列表非常有用,例如,您可以快速打印感兴趣的值,然后继续执行。