在 gdb 的一个线程中使用 "finish",它永远不会 returns。这是否意味着线程卡住了?

Using "finish" in one thread in gdb, it never returns. Does that mean the thread is stuck?

我正在尝试调试线程问题。在大多数情况下,这很容易,但是对于这个问题,有些东西会卡住,我很难找到导致问题的线索。 (它发生在几个小时后,写日志打破了时间,所以......这很困难,因为我不能仅仅更改代码来帮助我找到罪魁祸首)。

今天,我在想:

  1. 点击Ctrl-C

  2. 我试图确定它是哪个线程:

     thread 9
     where
    

    这看起来是个不错的选择。等待 FIFO 上数据的线程...

  3. 我决定输入以下内容来验证我的理论:

     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 或其他创建子进程的函数——在多线程环境中使此类代码正确是非常困难的。