3

我正在尝试调试我之前在这里发布的问题: C++ 和 pin 工具 - IF 语句非常奇怪的 DOUBLE 变量问题。我使用 gdb 追踪了发生奇怪行为的时刻。我发现如下图所示,它显示了显示反汇编代码和浮点寄存器值的 gdb 屏幕截图。(此处为大图) FLDZ指​​令执行前后 左侧图像显示了突出显示的FLDZ指令执行前的屏幕截图,右侧图像显示了指令执行后的屏幕截图。我查了 x86 ISA 并FLDZ用于加载+0.0ST(0). 但是,我得到的是-nan而不是+0.0. 有人知道为什么会这样吗?我使用的系统是运行 64 位 CentOS 的 Intel xeon 5645,但我尝试调试的目标程序是 32 位应用程序。另外,正如我在前一篇文章中提到的,我尝试了两个版本的 gcc,4.2.4 和 4.1.2,并发现了同样的问题。谢谢。

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

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);
  }

}
4

1 回答 1

3

产生了一个异常(注意该I位在stat字段中设置)。正如文档所说:

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

顺便说一句,您的根本问题是因为这只是浮点的性质。这不准确。例如,请参阅这个 gcc 错误报告- 以及这个.

于 2012-08-08T08:42:22.343 回答