2012-08-08 67 views
3

我想调试我在此处发布的问题: C++ and pin tool -- very weird DOUBLE variable issue with IF statement。 我追踪了使用gdb发生奇怪行为的时刻。下图显示了我发现的内容,它显示了显示反汇编代码和浮点指针寄存器值的gdb屏幕截图。 (放大图像herebefore and after FLDZ instruction is executed 左侧的图像显示在突出显示的FLDZ指令执行之前的屏幕截图,右侧图像在指令执行之后。我查找了x86 ISA,FLDZ用于将+0.0加载到ST(0)中。但是,我得到的是-nan而不是+0.0。 有谁知道为什么会发生这种情况? 我使用的系统是运行64位CentOS的Intel xeon 5645,但我试图调试的目标程序是32位应用程序。另外,正如我在前面的文章中提到的,我尝试了两个版本的gcc,4.2.4和4.1.2,并观察到同样的问题。 谢谢。浮点指令异常 - FLDZ故障?

- 添加 - 顺便说一下,下面是源代码。

void Router::Evaluate() 
{ 
    if (_id == 0) aaa++; 

    if (_partial_internal_cycles != 0) 
    { 
    aaa += 12345; 
    cout << "this is not a zero : " << endl; 
    on = true; 
    } 

    _partial_internal_cycles += (double) 1.0; 

    if (_partial_internal_cycles >= (double)1.0) { 
    _InternalStep(); 
    _partial_internal_cycles -= (double)1.0; 
    } 

    if (GetSimTime() > 8646000 && _id == 0) cout << "aaa = " << aaa << endl; 
    if (on) 
    { 
    cout << "break. id = " << _id << endl; 
    assert(false); 
    } 

} 
+0

看起来像一个FPU堆栈溢出。你有源代码吗? – 2012-08-08 08:46:14

+0

看起来像'if(_partial_internal_cycles!= 0)'时出错。您的FPU堆栈在此时已满。你需要以某种方式理解这可以如何。我熟悉的编译器在完成计算后将清空FPU堆栈。你正在使用哪种编译器? – 2012-08-08 08:58:55

+0

我同意你提出错误的地方。另外,我使用了gcc 4.2.4。 – ray 2012-08-08 09:04:05

回答

3

生成了异常(注意I位被设置在stat字段)。作为the documentation说:

如果这将成为新的ST的ST(7)数据寄存器(0)不是空的,既是一个堆栈错误和无效操作异常检测,状态字设置这两个标志。状态字中的TOP寄存器指针仍然会递减,并且ST(0)中的新值将是INDEFINITE NAN。

顺便说一下,你的潜在问题是因为这只是浮点的本质。这不是确切的。例如参见this gcc bug reportthis one

+0

“顺便说一下,你的潜在问题是因为这只是浮点的本质,它不是精确。”这是事实,但与其他问题无关。 – 2012-08-08 08:54:27

+0

它是。比较结果取决于精度。 – 2012-08-08 09:10:44

+0

'x == 0'每次评估时都会返回相同的值,只要'x'没有改变。浮点算术实际上是不精确的,但在这个问题中没有算术。 – 2012-08-08 09:12:04