gdb会立即停止所有线程吗?

时间:2012-07-01 17:48:43

标签: linux multithreading gdb

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

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并将其返回池中。

一旦进入成千上万个周期,我就会陷入断点 - 好吧,我明白可能是因为我有一些错误,我正在寻找。 什么不能恕我直言,当我在env-Msg变量上查看gdb(没有踩踏!)时,它不是零! Printf打印为零,我输入if子句,但gdb显示“正常”值。 我可以在5-7分钟内重现一次这种情况并且gdb始终显示出良好的价值? 如果这是竞争条件,当两个线程都基于超时时,如何在一个汇编程序命令中完全实现这一点?

1 个答案:

答案 0 :(得分:0)

  

gdb是否立即停止所有线程

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

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