我想調試我在此處發佈的問題: 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,並觀察到同樣的問題。 謝謝。浮點指令異常 - 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);
}
}
看起來像一個FPU堆棧溢出。你有源代碼嗎? – 2012-08-08 08:46:14
看起來像'if(_partial_internal_cycles!= 0)'時出錯。您的FPU堆棧在此時已滿。你需要以某種方式理解這可以如何。我熟悉的編譯器在完成計算後將清空FPU堆棧。你正在使用哪種編譯器? – 2012-08-08 08:58:55
我同意你提出錯誤的地方。另外,我使用了gcc 4.2.4。 – ray 2012-08-08 09:04:05