在 gdb 的一个线程中使用 "finish",它永远不会 returns。这是否意味着线程卡住了?
Using "finish" in one thread in gdb, it never returns. Does that mean the thread is stuck?
我正在尝试调试线程问题。在大多数情况下,这很容易,但是对于这个问题,有些东西会卡住,我很难找到导致问题的线索。 (它发生在几个小时后,写日志打破了时间,所以......这很困难,因为我不能仅仅更改代码来帮助我找到罪魁祸首)。
今天,我在想:
点击Ctrl-C
我试图确定它是哪个线程:
thread 9
where
这看起来是个不错的选择。等待 FIFO 上数据的线程...
我决定输入以下内容来验证我的理论:
finish
程序又开始了,但是gdb一直没有停止...
我的想法是否正确,证明这个 FIFO 从未接收到任何数据,这就是我的进程卡住的地方? (即当接收到数据时,函数 returns)
Am I correct thinking that proves that this FIFO never receives any data
是的:如果你的描述是准确的,那么很可能是线程 9 卡在了等待数据中。
and that's where my process is stuck?
我们无法判断。等待 FIFO 的线程可能期望来自 外部 源的数据(拥有在单个进程内传输数据的 FIFO 有点不寻常且效率低下),并且如果线程的另一端FIFO 连接到其他进程,那么线程卡在那里的事实证明不了什么。
P.S。混合 FIFO 和线程导致挂起的常见方式之一是使用 fork
或其他创建子进程的函数——在多线程环境中使此类代码正确是非常困难的。
我正在尝试调试线程问题。在大多数情况下,这很容易,但是对于这个问题,有些东西会卡住,我很难找到导致问题的线索。 (它发生在几个小时后,写日志打破了时间,所以......这很困难,因为我不能仅仅更改代码来帮助我找到罪魁祸首)。
今天,我在想:
点击Ctrl-C
我试图确定它是哪个线程:
thread 9 where
这看起来是个不错的选择。等待 FIFO 上数据的线程...
我决定输入以下内容来验证我的理论:
finish
程序又开始了,但是gdb一直没有停止...
我的想法是否正确,证明这个 FIFO 从未接收到任何数据,这就是我的进程卡住的地方? (即当接收到数据时,函数 returns)
Am I correct thinking that proves that this FIFO never receives any data
是的:如果你的描述是准确的,那么很可能是线程 9 卡在了等待数据中。
and that's where my process is stuck?
我们无法判断。等待 FIFO 的线程可能期望来自 外部 源的数据(拥有在单个进程内传输数据的 FIFO 有点不寻常且效率低下),并且如果线程的另一端FIFO 连接到其他进程,那么线程卡在那里的事实证明不了什么。
P.S。混合 FIFO 和线程导致挂起的常见方式之一是使用 fork
或其他创建子进程的函数——在多线程环境中使此类代码正确是非常困难的。