gpt4 book ai didi

c++ - 如何诊断奇怪的竞争条件错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:13 24 4
gpt4 key购买 nike

我们正在跟踪的错误发生在特定的基于 VxWorks 的嵌入式环境中(供应商将内容修改为未知扩展并提供了大部分 VxWorks 内容的抽象层)。我们有两个任务以不同的优先级运行,大约每 100 毫秒执行一次。具有较高优先级的任务简单地对一个整数进行加法计数(这样它就可以做任何事情),而具有较低优先级的任务会创建一个字符串,如下所示:

std::string text("Some text");

请注意,这些任务之间没有任何共享状态。它们都专门对自动局部变量进行操作。

在每次运行中,每个任务都会执行一百次,因此出现竞争条件的概率更高。该应用程序可以正常运行几分钟,然后 CPU 负载从 5% 猛增到 100% 并保持不变。整个时间似乎都被创建字符串的任务占用了。到目前为止,我们无法在不使用 std::string 的情况下重现该行为。

我们使用 GCC 4.1.2 并在 VxWorks 5.5 上运行。该程序在 Pentium III 上运行。

我已经尝试分析那里发生了什么,但我无法使用调试器输入任何 string-methods,并且将 print-statements 添加到 basic-string 似乎不起作用(这是this question of mine 的背景)。我怀疑其中的某些东西会破坏堆栈,从而导调用源循环。我的问题是,旧的 VxWorks 版本中是否有任何已知错误可以解释这一点?如果没有,您是否有任何进一步的建议如何诊断?我可以得到反汇编和堆栈转储,但我没有任何解释经验。谁能provide some pointers

最佳答案

如果我记得的话,vxWorks 提供线程特定的内存位置(或者可能只有一个位置)。此功能允许您指定一个内存位置,该位置将被任务切换自动隐藏,以便每当线程在其上写入时,该值将跨任务切换保留。这有点像额外的寄存器保存/恢复。

GCC 使用其中一个特定于线程的内存位置来跟踪异常堆栈。即使您不以其他方式使用异常,也有一些情况(特别是 new,例如可能调用 std::string 构造函数)会隐式创建 try/catch 类似操作此堆栈的环境。在更旧版本的 gcc 上,我看到在名义上不使用任何异常处理的代码中乱七八糟。

在那种情况下,解决方案是使用 -fno-exceptions 进行编译以消除所有这些行为,之后问题就消失了。

关于c++ - 如何诊断奇怪的竞争条件错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9267979/

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