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 Research
http://www.rectangular.com/

Reply via email to