On Apr 27, 2009, at 8:40 AM, Nicholas Clark wrote:

On Mon, Apr 27, 2009 at 12:27:02AM -0500, John E. Malmberg wrote:
I just started looking into a failure of 19_CPANPLUS-Dist. I have not
determined what exactly is wrong, and am out of time for the moment.

I will try to get some more information later.

It is failing from an access violation in SV.C.

ok 57 -    Perl version not high enough
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual
address=000000000000002C, PC=00000000000F9AB8, PS=0000001B
%TRACE-F-TRACEBACK, symbolic stack dump follows
 image    module    routine             line      rel PC
abs PC
DBGPERLSHR  SV  Perl_sv_upgrade        73671 0000000000001F58
00000000000F9AB8
DBGPERLSHR  SV  Perl_sv_setsv_flags    76204 000000000000AC88
00000000001027E8

EAGLE> search [-]sv.lis/window=10 73671
     2   73667         /* We always allocated the full length item
with PURIFY.
To do this
     2   73668            we fake things so that arena is false for
all 16 type
s..  */
     3   73669         if(new_type_details->arena) {
     3   73670             /* This points to the start of the
allocated area.
*/
     3   73671             new_body_inline(new_body, new_type);

#define new_body_inline(xpv, sv_type) \
   STMT_START { \
        void ** const r3wt = &PL_body_roots[sv_type]; \
        xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt))      \
          ? *((void **)(r3wt)) : more_bodies(sv_type)); \
        *(r3wt) = *(void**)(xpv); \
   } STMT_END

I'm curious what the value of sv_type is. It's the second (real) parameter:

void
Perl_sv_upgrade(pTHX_ register SV *const sv, svtype new_type)


For me the access violation does not happen when running under the debugger, where it would be easy to examine new_type. Without running in debug, we see

ok 56 - Perl binary version too low
ok 57 -    Perl version not high enough
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=000000000000002C, PC=00000000000FA491, PS=0000001B
%TRACE-F-TRACEBACK, symbolic stack dump follows
image module routine line rel PC abs PC DBGPERLSHR SV Perl_sv_upgrade 86326 0000000000004641 00000000000FA491

etc., as John reported. Note that a virtual address of 0x2c (decimal 44) is not a possible address.


Whereas running under the debugger we get:

ok 55 - Rebuilding trees
not ok 56 - Perl binary version too low
#   Failed test 'Perl binary version too low'
#   at [-.lib.cpanplus.t]19_cpanplus-dist.t line 358.
#          got: '1'
#     expected: ''

line 358 is:

            is( !!$flag, !!$bool,   $txt );

not ok 57 -    Perl version not high enough
#   Failed test '   Perl version not high enough'
#   at [-.lib.cpanplus.t]19_cpanplus-dist.t line 232.
#                   ''
#     doesn't match '(?-xism:needs perl version)'
ok 58 - Rebuilding trees

line 232 is:

                sub { like( CPANPLUS::Error->stack_as_string,
                            qr/needs perl version/,
                            "   Perl version not high enough" ) },

The debugger is likely to zero out uninitialized memory and do other things that might protect the stack from corruption, so that may be a partial explanation of the difference. It does look as though the damage is being done at test 56 (or earlier) but doesn't show up until test 58 unless you are running under the debug environment.

The particular expansion of the new_body_inline macro where the crash occurs looks like:

     3   86326             new_body_inline(new_body, new_type);
E do { void * * const r3wt = & ( my_perl -> Ibody_roots ) [ new_type ] ; new_body = ( PTR_TBL_ENT_t * ) ( * ( ( E void * * ) ( r3wt ) ) ? * ( ( void * * ) ( r3wt ) ) : S_more_bodies ( my_perl , new_type ) ) ; * ( r3wt ) = * ( void
       E         * * ) ( new_body ) ; } while ( 0 )


That's all the debugging time I have for now.

________________________________________
Craig A. Berry
mailto:craigbe...@mac.com

"... getting out of a sonnet is much more
 difficult than getting in."
                 Brad Leithauser

Reply via email to