It's always something

Michel Fortin michel.fortin at michelf.ca
Sat Sep 22 06:37:26 PDT 2012


On 2012-09-22 09:19:33 +0000, Walter Bright <newshound2 at digitalmars.com> said:

> I just spent about 3 hours tracking down the strangest problem. Win64 
> exception handling would work fine, but when I'd turn on -g, it would 
> crash.
> 
> At first I thought "I'm generating a bad object file with -g." But 
> since dmd isn't emitting any Win64 symbolic debug info, a check shows 
> the object files are the same with and without -g.
> 
> So it must be something with linking? I spent a lot of time going over 
> and over the relocation fixups (could there be a missing offset?), but 
> could find nothing wrong.
> 
> Instrumenting the Phobos eh handler code, it seems my handler table was 
> pointing off into la-la land when linking with /DEBUG. What the hell?
> 
> I thought I'd dump the first byte of where it was pointing to, and look 
> in the assembler output and see if that byte was at a predictable 
> offset from where it was supposed to be. The actual function started 
> with C3, but the handler table pointed to E9. There was no E9 in the 
> object file. What the hell?
> 
> Finally, it dawned on me. E9 is a JMP instruction! For some reason, the 
> Microsoft linker inserts a bunch of trampolines when linking for debug.
> 
> The fix, then, was for the eh handler to look and see if the handler 
> table is pointing to an E9, and if so, then adjust the function address 
> to be where ever the JMP goes.
> 
> And so it goes...

But there should be a reason why there's a jump there. Have you found 
it? If you're just bypassing the jump you might be breaking something 
else. For instance, this jump table might have been a mean to allow the 
debugger to more easily break on exceptions. Or it might be something 
else, I don't know, but it's likely there's a reason.

You should keep a record of those anomalies somewhere, it might prove 
useful as a starting point to investigating problems future problems 
that might arise.

-- 
Michel Fortin
michel.fortin at michelf.ca
http://michelf.ca/



More information about the Digitalmars-d mailing list