首次尝试使用pthreads创建多线程应用程序
我尝试使用gdb进行调试但遇到一些奇怪的意外行为
试图确定我或gdb是否有错误
情景:
info threads
gdb
目的的当前主题n
以进入线程fn中的下一行时,父线程(线程1)只是恢复并完成并且gdb退出。这是正确的行为吗?
如何逐行执行第二个线程中正在执行的线程fn代码?{/ 1}?
换句话说,即使线程2被gdb
确认为当前线程,当我点击gdb
时,它似乎相当于在父线程中点击n
,即父线程(线程1)只恢复执行,完成并退出。
关于如何使用c
调试多个线程而不知道当前的行为
我在emacs25中使用gdb,即gdb
答案 0 :(得分:2)
GDB的功能取决于您的设置以及您的系统(某些供应商会修补此区域)。
通常情况下,在全停模式下,当下级停止时,GDB会停止所有线程。这为您提供了“期望”的行为 - 您可以在线程之间自由切换,并查看每个线程中发生的情况。
当劣势继续时,包括通过next
或step
,GDB允许所有线程运行。所以,如果你的第二个线程没有以任何方式与你的第一个线程交互(没有锁等),你可能会看到它退出。
但是,您可以使用set scheduler-locking
控制此操作。将其设置为on
将使其只能恢复当前线程。并且,将其设置为step
将使step
(或我认为next
)只能恢复当前线程,但会让所有线程在{{1}上自由运行等等。
这里的默认模式是continue
,基本上是replay
,除非使用记录和重放模式。但是,Fedora GDB的默认值为off
;我不确定是否有其他发行版,但你可能想检查一下。
答案 1 :(得分:1)
是的,这是gdb的正确行为。您只调试当前活动的线程,其他线程正在幕后执行。考虑一下,你怎么会移动其他的东西呢?
但是你的代码有一个错误。在子线程完成之前,您的父线程不应退出。执行此操作的最佳方法是在退出之前在主线程中连接子线程。