Joe Schaefer wrote:
Stas Bekman <[EMAIL PROTECTED]> writes:


[...]


segfaults for me in the test suite.  Running the server under gdb
indicates the segfault is happening during loading of B::Deparse on
this line in the test-
   $r->add_output_filter("out_filter");

And if you add it at the startup, it happens too. I think it tries to
deparse out_filter as a code string, instead of trying to get the code
reference.


Oops, sorry- I think I made a mistake about the failing line... I think it's really the next one that segfaults:

    # test adding anon sub
    $r->add_output_filter(sub {
        my $filter = shift;

        while ($filter->read(my $buffer, 1024)) {
            $buffer .= "end";
            $filter->print($buffer);
        }

        return Apache::OK;
    });

mod_perl is trying to deparse the anonymous sub, and it needs
B::Deparse for that. (I'm still trying to grok the necessity/safety
of the deparse.)

Right, that makes more sense. The necessity is explained in modperl_handler.c, and pasted here for your convenience (and comments):


#ifdef USE_ITHREADS
    /* XXX: perhaps we can optimize this further. At the moment when
     * perl w/ ithreads is used, we always deparse the anon subs
     * before storing them and then eval them each time they are
     * used. This is because we don't know whether the same perl that
     * compiled the anonymous sub is used to run it.
     *
     * A possible optimization is to cache the CV and use that cached
     * value w/ or w/o deparsing at all if:
     *
     * - the mpm is non-threaded mpm and no +Clone/+Parent is used
     *   (i.e. no perl pools) (no deparsing is needed at all)
     *
     * - the interpreter that has supplied the anon cv is the same
     *   interpreter that is executing that cv (requires storing aTHX
     *   in the handler's struct) (need to deparse in case the
     *   interpreter gets switched)
     *
     * - other cases?
     */
    handler->cv = NULL;
    handler->name = modperl_coderef2text(aTHX_ p, cv);
    MP_TRACE_h(MP_FUNC, "[%s] new deparsed anon handler:\n%s\n",
               modperl_pid_tid(p), handler->name);

If you have a better idea that than, I'm all ears. I don't like using B::Deparse for production, and it's definitely much slower than compiled CV.

And if you do one, then there is no point debugging this issue, if it can be scratched altogether :)

FWIW, the backtrace I get is identical to the one Joe Orton posted.

Me too (now with Joe's hint).

Lately I been finding it easier to get proper backtraces from the
worker mpm by running the tests under gdb (nicely explained in docs/devel/debug/c.pod) instead of trying to examine the core file.

:)

--
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to