我正在尝试调试我之前发布的问题:
C++ and pin tool -- very weird DOUBLE variable issue with IF statement。
我跟踪了使用gdb发生奇怪行为的那一刻。我发现的内容如下图所示,显示了显示反汇编代码和浮点指针寄存器值的gdb屏幕截图。 (放大图像here)
左侧图像显示执行突出显示的FLDZ
指令之前的屏幕截图,右侧图像位于执行指令之后。我查找了x86 ISA,FLDZ
用于将+0.0
加载到ST(0)
。但是,我得到的是-nan
而不是+0.0
。
有人知道为什么会这样吗?
我使用的系统是运行64位CentOS的Intel xeon 5645,但我尝试调试的目标程序是32位应用程序。另外,正如我在之前的帖子中提到的,我尝试了两个版本的gcc,4.2.4和4.1.2,并观察到了同样的问题。
感谢。
- added-- 顺便说一句,下面是源代码。
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 :(得分:3)
生成了异常(注意stat字段中设置了I
位。正如the documentation所说:
如果将成为新ST(0)的ST(7)数据寄存器不为空,则检测到堆栈错误和无效操作异常,并在状态字中设置两个标志。状态字中的TOP寄存器指针仍然会递减,ST(0)中的新值将是INDEFINITE NAN。
顺便说一下,你的根本问题是因为这只是浮点的本质。这不确切。例如,请参阅this gcc bug report - 和this one。