命令用GDB挂起线程
command to suspend a thread with GDB
我对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
设置一个在遇到断点时执行的命令列表非常有用,例如,您可以快速打印感兴趣的值,然后继续执行。
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 如何在C++中挂起和恢复 POSIX 线程?
- C++多线程应用程序将永远挂起
- C++挂起线程,然后通过其他线程重新激活
- 为什么线程分离时程序挂起
- 多线程程序挂起条件等待
- 当一个线程希望执行或打印某个内容时,如何挂起其他线程
- C 11线程不起作用
- 为什么我的多线程应用程序挂起
- Win32 控制台代码在哪里运行?从多个线程使用时控制台挂起
- 挂起并序列化正在运行的线程
- QMutex ,如果线程在起作用,请在此处等待
- c++系统()挂起,使用netcat连接到不同线程中的套接字
- 程序基于用户输入创建多个线程不起作用(cin)
- C++11线程挂起锁定互斥对象
- 无法从挂起进程的独立线程中的管道中读取
- 我的线程工作不好,它给出了所有结果,最后没有一个接一个,GUI 在线程运行期间挂起?
- 套接字:客户端读取消息时多线程不起作用
- Poco::线程挂起在多个启动和加入快速连续
- Qt - 同步线程不起作用 - 线程停止但实际上不会停止,有时在不应该停止的时候停止