首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gdb会立即停止所有线程吗?

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

Stack Overflow用户
提问于 2012-07-02 01:48:43
回答 1查看 165关注 0票数 0

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

代码语言:javascript
复制
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结构(包括指向消息的指针)。然后,它通过FIFO发送环境指针。此线程处理Env并将其返回到池。

在几十万个周期中,我会遇到一次断点--嗯,我知道这可能是因为我有一些bug,而这正是我正在寻找的。当我在gdb中查看(没有步进)时,什么都不能是IMHO!在Env-Msg变量上,它不是零!Printf输出0,我输入if子句,但gdb显示“正常”值。我可以在5-7分钟内重现一次情况,并且gdb总是显示良好的值?如果这是竞争条件,当两个线程都基于超时时,这怎么可能在一个汇编程序命令中呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-02 13:05:26

做gdb会立即停止所有线程

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

如果Env在两个线程之间共享,那么Env->Msg很可能在计算if条件时为NULL,但在GDB给出提示时变为非NULL

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11284317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档