0

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

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();
....

就本期而言:其他线程每 100 毫秒从池中获取并填充 Env 结构(包括指向 Msg 的指针)。然后它通过 FIFO 发送 Env 指针。该线程处理 Env 并将其返回到池中。

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

4

1 回答 1

0

gdb 是否立即停止所有线程

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

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

于 2012-07-02T05:05:26.413 回答