On Jun 5, 4:49 pm, [EMAIL PROTECTED] (Marvin Humphrey) wrote: > On Jun 5, 2008, at 5:21 AM, Tom wrote: > > > How will I find ou where the problem occured inside a die handler in > > XS? Something like call stack when the exception occured. > > I got the Perl stack into error messages by wrapping a callback to > Carp::confess(). In a perfect world we'd get the C stack in there > too, but oh well. > > If you want portability, you have to special case things depending on > whether variadic macros are available. Assuming that they are, in ISO- > style, and also that the ISO-style __func__ macro is available, this > works: > > #define CONFESS(...) \ > confess_at(__FILE__, __LINE__, __func__, __VA_ARGS__) > > void > confess_at(const char *file, int line, const char *func, > const char *pat, ...) > { > va_list args; > SV *error_sv = newSVpvf("Error in function %s at %s:%d: ", func, > file, line); > > va_start(args, pat); > sv_vcatpvf(error_sv, pat, &args); > va_end(args); > > sv_catpvn(error_sv, "\n\t", 2); > > do_confess(error_sv); > > } > > void > do_confess(SV *error_sv) > { > dSP; > ENTER; > SAVETMPS; > PUSHMARK(SP); > XPUSHs( sv_2mortal(error_sv) ); > PUTBACK; > call_pv("Carp::confess", G_DISCARD); > FREETMPS; > LEAVE; > > } > > Marvin Humphrey > Rectangular Researchhttp://www.rectangular.com/
Thanks for that. But that is not what I am looking for really. I already have a die handler which traps any perl errors. I would like to access the stack trace from that C code and write it to log. I was thinking if I can access any of the perl variables from there. Or using eval (eval_pv), and caller(). But not getting anywhere. I am new to Perl !