1

当我写这个问题时,我突然意识到,由于嵌入式和非嵌入式应用程序构建,我们可能正在使用两个版本的 Qt。我们都在使用gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4). 我的构建环境是:

QMake version 2.01a
Using Qt version 4.7.3 in /usr/local/Trolltech/QtEmbedded-4.7.3/lib

至少我的一位同事正在使用:

QMake version 2.01a
Using Qt version 4.7.2 in /usr/lib

我的两个同事在制作使用我的计算库的独立应用程序时遇到了问题。我们的主要应用程序和我的独立单元测试应用程序工作正常,我的调查发现我的代码没有问题。我得出的结论是,构建环境或编译器一定存在一些基本问题,因为在这两种情况下,我们都隔离了不稳定/非标准行为。我隔离的案例如下:

void className::functionName(float newDeltaTime)
{
    float zero_ = 0;
    std::cout << "newDeltaTime: " << newDeltaTime << std::endl;
    std::cout << "zero_: " << zero_ << std::endl;
    std::cout << "newDeltaTime > zero_: " << (newDeltaTime > zero_) << std::endl;
    std::cout << "newDeltaTime > zero_: " << (newDeltaTime > zero_) << std::endl;
    std::cout << "newDeltaTime > zero_: " << (newDeltaTime > zero_) << std::endl;
...

这输出:

newDeltaTime: 0.2
zero_: 0
newDeltaTime > zero_: 0
newDeltaTime > zero_: 1
newDeltaTime > zero_: 1

使用 gdb(由 QtCreator 运行),我们可以在每一行看到正确的变量值 - 未损坏。这对我来说真的很奇怪。调试器显示的变量没有变化,但完全相同的表达式第二次产生不同的值。

最初,我进行了一些错误检查,if(newDeltaTime > 0) { //do something } else { //log and throw }我的老板向我展示了抛出值为 0.2 的异常的代码(如上所示)。我无法弄清楚这个问题。当我添加日志记录时,代码开始工作,但我注意到日志记录的布尔表达式值不正确。最后,我想多次记录表达式,得到如上所示的输出。

我觉得地面在摇晃 - 什么会导致这种情况发生?一切都编译没有错误,如果我们两次评估表达式并第二次使用结果,那么它似乎工作正常。当可能发生单事件扰动(空间辐射撞击电路和损害逻辑)时,我熟悉投票逻辑,但我不寒而栗地认为这里有必要......

4

1 回答 1

2

什么可能导致这种情况发生?

我能想到的唯一的事情是

  • libstdc++编译器(标头)与您正在使用的不匹配。
  • 破坏堆栈的信号处理代码

如果您列出的输出始终是可重复的,那么第二个原因不可能是它,只有第一个原因仍然存在。

如果您在未优化的代码中观察到这种行为,我会采用以下方法:在 GDB 的第一std::cout << "newDeltaTime > zero_: " <<...行设置断点,并验证该行执行后newDeltaTime不再是0.2. 再次运行,这次设置一个 GDB 观察点watch *(float*)&newDeltaTime,并查看值损坏的确切位置(可能是 libstdc++ 中的某个位置)。

如果您只使用优化的代码来观察这一点,事情会变得更加棘手,并且您需要了解ABIs 和调用约定,然后才能有效地调试它。

于 2013-03-25T04:02:51.160 回答