Mail Archives: djgpp-workers/2003/05/24/08:44:05
According to Eli Zaretskii:
> > From: <ams AT ludd DOT luth DOT se>
> > Date: Mon, 5 May 2003 21:48:01 +0200 (CEST)
> >
> > A:\>ts3
> > FPU CW: 0x00000340.
> > float tests:
> > Exiting due to signal SIGFPE
> > Floating Point exception at eip=00005e21, x87 status=b1a0
> > eax=000917ac ebx=00092c2b ecx=0000000c edx=00090f40 esi=000918ad edi=00000006
> > ebp=0009171c esp=00091718 program=A:\TS3.EXE
> > cs: sel=00bf base=00116000 limit=0009ffff
> > ds: sel=00c7 base=00116000 limit=0009ffff
> > es: sel=00c7 base=00116000 limit=0009ffff
> > fs: sel=009f base=000051d0 limit=0000ffff
> > gs: sel=00d7 base=00000000 limit=0010ffff
> > ss: sel=00c7 base=00116000 limit=0009ffff
> > App stack: [00092dc4..00012dc4] Exceptn stack: [00012d44..00010e04]
> >
> > Call frame traceback EIPs:
> > 0x00005e21 __modfl+33, file a:/doprnt.c, line 924
> > Line 592 is "tmp = modfl(integer * 0.1L , &integer);".
> >
> > Worth to note is that the previous modfl() at line 575 worked fine.
> >
> > And this is an "objdump -d" of the relevant instructions in modfl:
> >
> > 00005e00 <___modfl>:
> > 5e00: 55 push %ebp
> > 5e01: 89 e5 mov %esp,%ebp
> > 5e03: 83 ec 04 sub $0x4,%esp
> > 5e06: db 6d 08 fldt 0x8(%ebp)
> > 5e09: 8b 45 14 mov 0x14(%ebp),%eax
> > 5e0c: d9 7d fe fnstcw 0xfffffffe(%ebp)
> > 5e0f: 66 8b 55 fe mov 0xfffffffe(%ebp),%dx
> > 5e13: 80 ce 0c or $0xc,%dh
> > 5e16: 66 89 55 fc mov %dx,0xfffffffc(%ebp)
> > 5e1a: d9 6d fc fldcw 0xfffffffc(%ebp)
> > 5e1d: d9 c0 fld %st(0)
> > 5e1f: d9 fc frndint
> > 5e21: d9 6d fe fldcw 0xfffffffe(%ebp)
>
> AFAIU, the last line above is the one that crashed. What is the
> operand(s) of the FLDCW instruction that crashed, and what is at
> 0xfffffffe(%ebp) on the stack?
>
> Also, it could be that the actual exception was somewhere else, if
> FLDCW is one of the instructions that does the equivalent of FWAIT.
> (Or am I confused?) So it might be a good idea to step with GDB thru
> this code and examine the FPU status word after each instruction.
> When one of the exception bits in the status word gets set, that's
> when the exception actually happens.
I can't. Or rather it's too painful/timeconsuming. When I run this in
gdb in plain DOS, it hangs the computer. Presumably it's when a SIGFPE
appears. And when I say hang, it means it's time for the reset button.
gdb --version says 5.3.
Right,
MartinS
- Raw text -