proposal(+working code): catch block callback before stack unwinds to allow attaching debugger

Timothee Cour thelastmammoth at gmail.com
Sun Oct 27 06:09:11 PDT 2013


currently, there's no way to execute some function attached to a specific
'catch block' right before unwinding the stack, after a thrown
exception/error.
The only thing we can do is set a custom Runtime.traceHandler, but this
cannot depend on the catch block (and doing so for every catch block would
hurt performance)

This prevents attaching a debugger right before stack unwinding at the root
of the program in the following scenario:

----
void fun(){
try{...}catch{...}
// code that may throw and is usually caught in normal setting
// occasionally some unusual exceptions/errors won't be caught
}
void call_debugger(){
 //raise signal so we can attach a debugger
}
void main(){
try{
  fun();
}
catch(Throwable t){
  // we want to call call_debugger after an uncaught exception lands here
but before stack unwinds, because most information is lost after stack
unwinds
  // the other catch blocks should be unaffected, in particular
call_debugger should only be called before landing on this specific catch
block
}
}
----


I've modified rt/deh2.d to allow it, it works great, but my implementation
is hacky, and I'd like to poke the newsgroup for a better design:

class ThrowableSpecialUnwinding : Throwable {...}
void main(){
try{...}
catch(ThrowableSpecialUnwinding t){
//callbackBeforeUnwinding is called right before unwinding stack and
entering this block
// it doesn't affect other catch blocks nor assumes anything about the
caught exception which could be any Throwable.
// I've cheated here so casting back
auto real_t=cast(Throwable)cast(void*)t;
}
}

extern(C)
void callbackBeforeUnwinding(Throwable t){
call_debugger; //this could be calling a function pointer modifyable at
runtime
}

The hacky part is here:
in rt/deh2.d, I changed:

if (_d_isbaseof(ci, pcb.type) )

to :

bool isSpecial = pcb.type== ThrowableSpecialUnwinding.classinfo &&
_d_isbaseof(ci, Throwable.classinfo);
 if(isSpecial)
  callbackBeforeUnwinding(cast(Throwable) *h);

if (_d_isbaseof(ci, pcb.type) || isSpecial) {/*will stack unwind here*/}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20131027/5677059b/attachment-0001.html>


More information about the Digitalmars-d mailing list