当我写这个问题的时候,我突然意识到,由于嵌入式和非嵌入式应用程序的构建,我们可能会使用两个版本的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的异常的代码(如上所示)。我找不到问题所在。当我添加日志时,代码开始工作,但我注意到日志具有不正确的布尔表达式值。最后,我考虑多次记录该表达式,得到上面所示的输出。
我感觉地面不稳--是什么导致了这种情况的发生?一切编译都没有错误,如果我们计算表达式两次,并第二次使用结果,那么它似乎工作得很好。我熟悉可能发生单事件干扰时的投票逻辑(空间辐射命中电路和妥协逻辑),但我不寒而栗地认为这里有必要……
发布于 2013-03-25 12:02:51
什么会导致这种情况发生?
我唯一能想到的就是
如果您列出的输出总是可重复的,那么第二个原因不可能是它,只剩下第一个原因。
如果您在未优化的代码中观察到这种行为,我将采用的方法是:在GDB中的第一个std::cout << "newDeltaTime > zero_: " <<...行上设置一个断点,并验证在执行该行之后,newDeltaTime不再是0.2。再次重新运行,这一次使用watch *(float*)&newDeltaTime设置一个GDB观察点,并准确地查看值被破坏的位置(可能是libstdc++中的某个地方)。
如果您只在优化代码中观察到这一点,事情就会变得更加棘手,您需要了解ABI和调用约定,然后才能有效地对其进行调试。
https://stackoverflow.com/questions/15607165
复制相似问题