According to the documentation, TimeConstrained generates an interrupt which interrupts the computation. This interrupt is treated just like an abort, in the sense that it respects AbortProtect.

I'd like to intercept this abort/interrupt and write a stack trace to a log file, so that I can determine whether or not the time out resulted from a bug. I tried this:

    changeInterrupt[] :=
     (
      Unprotect[Interrupt];
      testInterrupt = True;
      Interrupt[args___] :=
       (
         Print["This is where I would write my stack trace to a log file."];
         Block[{testInterrupt = False}, Interrupt[args]]
       ) /; testInterrupt
      Protect[Interrupt];
     )

    TimeConstrained[changeInterrupt[]; While[True, Null], 1]
    changeInterrupt[]; TimeConstrained[While[True, Null], 1]

and also the same thing but with `Interrupt` replaced with `Abort`. I get the print statement when I generate an abort/interrupt, but not when either of the TimeConstrained invokations terminate.

Any ideas?