【问题标题】:Does gdb stops ALL THREADS immediately?gdb 会立即停止所有线程吗?
【发布时间】:2012-07-01 17:48:43
【问题描述】:

我遇到了一个非常奇怪的情况,我无法解释。在代码中:

Env = Global.Queue2Ctrl.FIFO(100);//Wait for a msg for 100ms
if (Env == 0) continue; //Timeout
printf("i=%d %x\n",++i, (Env->Msg));
if (!Env->Msg)
  BreakP();
....

为了这个问题的目的:其他线程每 100ms 从池中获取并填充 Env 结构(包括指向 Msg 的指针)。然后它通过 FIFO 发送 Env 指针。 该线程处理 Env 并将其返回到池中。

在数十万个周期中,我会遇到断点 - 好吧,我知道如果我有一些我正在寻找的错误,那可能就是这样。 恕我直言,当我在 gdb 中查看(不踩!)Env-Msg 变量时,它不是零!!!! Printf 打印零,我输入 if 子句,但 gdb 显示“正常”值。 我可以在 5-7 分钟内重现这种情况,并且 gdb 总是显示出良好的价值? 如果这是竞速条件,当两个线程都基于超时时,如何在一个汇编程序命令中完全做到这一点?

【问题讨论】:

    标签: linux multithreading gdb


    【解决方案1】:

    gdb 是否立即停止所有线程

    没有。在 Linux 上,一旦一个线程收到 SIGTRAP(由于断点触发),GDB 必须停止所有其他线程(通过遍历 GDB 知道的线程列表,并向每个线程发送 SIGSTOP)。

    如果Env在两个线程之间共享,则Env->Msg很可能在评估if条件时成为NULL,但在GDB提示时变为非NULL

    【讨论】:

    • 太棒了!!!正是我要找的东西!!!我怀疑这一点,但 gdb 文档如此明确地指出所有线程的立即停止,以至于我感到困惑。非常感谢!!! Большое спасибо!!!
    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2021-05-08
    • 2018-03-12
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多