이전에 게시 한 문제를 디버그하려고합니다 : C++ and pin tool -- very weird DOUBLE variable issue with IF statement. gdb를 사용하여 이상한 동작이 발생한 순간을 추적했습니다. 아래 그림은 디스 어셈블 된 코드와 부동 포인터 레지스터 값을 표시하는 gdb 스크린 샷을 보여줍니다. (큰 이미지 here) 왼쪽 이미지는 강조 표시된 FLDZ
명령이 실행되기 전에 스크린 샷을 표시하고 오른쪽 이미지는 명령 실행 후입니다. 나는 x86 ISA를 찾고 FLDZ
은 +0.0
을 ST(0)
에로드하는 것입니다. 그러나 내가 얻는 것은 +0.0
대신 -nan
입니다. 왜 이런 일이 발생하는지 알고 있습니까? 내가 사용하는 시스템은 64 비트 CentOS를 실행하는 Intel xeon 5645이지만 디버그하려는 대상 프로그램은 32 비트 응용 프로그램입니다. 또한 이전 포스트에서 언급했듯이, gcc의 두 버전, 4.2.4 및 4.1.2를 시도하고 같은 문제를 관찰했습니다. 감사합니다. .부동 소수점 명령 이상 - FLDZ 오작동?
--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);
}
}
FPU 스택 오버 플로우처럼 보입니다. 현재 소스 코드가 있습니까? –
'if (_partial_internal_cycles! = 0)'에서 오류가 발생하는 것처럼 보입니다. 그 시점에서 FPU 스택이 가득 찼습니다. 어떻게 될 수 있는지 이해해야합니다. 필자가 잘 알고있는 컴파일러는 계산이 끝나면 FPU 스택을 비 웁니다. 어떤 컴파일러를 사용하고 있습니까? –
나는 어디에서 오류가 발생했는지 동의한다. 또한 gcc 4.2.4를 사용했습니다. – ray