Robert,
I have run into a large number of instances where there is a programmer error or a compiler/library error where it was only by diving into the disassembly/register display that I could find out what the exact nature of the bug was. Here is one example.
program tst
implicit none
real x,dx
x = 1.0
dx = 1e-8
x = x-dx ! naively, I expect x to be < 1.0 after this
call sub(x)
print *,x
contains
subroutine sub(y)
real y
if(y < 1.0)then
y = y+0.1 ! I am perplexed as to why this is not executed
endif
return
end subroutine
end program
Mistakenly, I expected the program to print '1.10000', but it prints '1.00000'. To investigate, I compile with /64 /debug and run inside SDBG64. Just before the CALL, I look at the value of x, and I see 'X=1' in the Variables panel. Hovering the mouse pointer over 'x' in the source panel also displays 'x=1'. No decimal point, no zeros after the decimal point. Puzzled, I want to see if/why x is exactly 1. I open the registers panel, but I only see 'XMM8 = 1.000000'. Why is the value exactly equal to 1? Is it? Let me check by looking at the hexadecimal display of the contents of XMM8, and see if it is, really, 3F80 0000! Oops, I can't! I am stuck, and I have to run the FTN95-generated EXE in some other debugger to look at the register value.
Had SDBG64 shown me hexadecimal displays of XMM (and CPU) register contents, I could have backtracked to the statement X = X - dX and investigated why X did not become < 1.
This is a made-up example, so the naiveté trap is plainly visible.