gpt4 book ai didi

linux - gdb 是否立即停止所有线程?

转载 作者:太空宇宙 更新时间:2023-11-04 04:23:21 31 4
gpt4 key购买 nike

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

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 总是显示出良好的值(value)?如果这是竞争条件,那么当两个线程都基于超时时,如何在一个汇编程序命令中精确地实现这一点?

最佳答案

Does gdb stops ALL THREADS immediately

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

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

关于linux - gdb 是否立即停止所有线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11284317/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com