Gerald -
More on my production-only segfault...
I put the following code into eputil.c (the Embperl routine
closest to the segfault):
--- /home/install/httpd/2.1-db/src/embperl/embperl/eputil.c 2004-03-07
09:44:14.000000000 -1000
+++ ../embperl/eputil.c 2004-04-28 05:43:01.118170288 -1000
@@ -745,6 +745,29 @@
return nDefault ;
}
+static void dumper_dump( unsigned char *buf, int offset, int len )
+{
+ int i;
+ fprintf( stderr, "%04x:", offset );
+ for( i = 0; i < len; i++ ) {
+ if( i % 4 == 0 ) fprintf( stderr, " " );
+ fprintf( stderr, "%02x", buf[offset+i] );
+ }
+ fprintf( stderr, " |" );
+ for( i = 0; i < len; i++ ) {
+ if( i % 4 == 0 ) fprintf( stderr, " " );
+ fprintf( stderr, "%c", ( buf[offset+i] >= '0' && buf[offset+i] <= 'z' ) ?
buf[offset+i] : '.' );
+ }
+ fprintf( stderr, "\n" );
+}
+
+static void dumper( char *title, unsigned char *buf, int len )
+{
+ int i;
+ fprintf( stderr, "%s\n", title );
+ for( i = 0; i < len; i += 16 )
+ dumper_dump( buf, i, (len - i >= 16) ? 16 : len - i );
+}
char * GetHashValueStr (/*in*/ pTHX_
/*in*/ HV * pHash,
@@ -754,13 +777,37 @@
{
SV ** ppSV ;
STRLEN l ;
+ STRLEN len;
+ char * buf;
+ char check;
+ bool exists;
/*EPENTRY (GetHashValueInt) ;*/
+ fprintf( stderr, "GetHashValueStr pHash '%p' sKey '%s' sDefault '%s'\n",
+ pHash, sKey, sDefault );
+ if( pHash == NULL )
+ fprintf( stderr, "pHash is NULL\n" );
+ else {
+ fprintf( stderr, "checking pointer to pHash\n" );
+ check = *( char * )pHash;
+ fprintf( stderr, "OK\n" );
+ dumper( "first 128 bytes of pHash", ( unsigned char * )pHash, 128 );
+ fprintf( stderr, "checking if key exists\n" );
+ exists = hv_exists( pHash, ( char * )sKey, strlen( sKey ) );
+ fprintf( stderr, "%s\n", ( exists ) ? "yes" : "no" );
+ }
+
ppSV = hv_fetch(pHash, (char *)sKey, strlen (sKey), 0) ;
- if (ppSV != NULL)
+ if (ppSV != NULL) {
+ buf = SvPV( *ppSV, len );
+ fprintf( stderr, "ppSV: len = '%d', content = '%s'\n",
+ len, buf );
return SvPV (*ppSV, l) ;
-
+ }
+
+ fprintf( stderr, "ppSV is NULL\n" );
+
return sDefault ;
}
What I am trying to do is see the parameters into and out of where the
seqfault occurs in GetHashValueStr.
Near the top if the error_log, a hash at 0x83695cc is sucessfully
accessed:
[Wed Apr 28 05:43:45 2004] [warn] EmbperlDebug: get_appname Embperl[7540/0]\n
[Wed Apr 28 05:43:45 2004] [warn] EmbperlDebug: Get MAILHOST (type=char *)
beaucox.com\n
[Wed Apr 28 05:43:45 2004] [warn] EmbperlDebug: Get MAIL_ERRORS_TO (type=char
*) [EMAIL PROTECTED]
GetHashValueStr pHash '0x83695cc' sKey 'EMBPERL_SESSION_ARGS' sDefault
'(null)'
checking pointer to pHash
OK
first 128 bytes of pHash
0000: 90ab7808 01000000 0bc00020 90a83608 | ..x. .... .... ..6.
0010: 01000000 0d600000 00000000 01000000 | .... .`.. .... ....
0020: 00000000 00000000 01000000 00000000 | .... .... .... ....
0030: f8015208 01000000 07c00404 18574608 | ..R. .... .... .WF.
0040: 01000000 0c000000 20a83608 01000000 | .... .... ..6. ....
0050: 0d600000 a0c72b08 01000000 04000404 | .`.. .... .... ....
0060: c8564608 01000000 0c000404 00000000 | .VF. .... .... ....
0070: 01000000 00050000 089d3008 01000000 | .... .... ..0. ....
checking if key exists
no
ppSV is NULL
Now just before the segfault, that same hash at 0x83695cc is accessed
again. But look at the first word of the hash: it looks as if the hash
is no longer valid or has been released. Note, most of the other words
in that memory match the earlier dump:
[Wed Apr 28 05:43:47 2004] [warn] EmbperlDebug: GetApacheConfig for dir\n
[Wed Apr 28 05:43:47 2004] [warn] EmbperlDebug: get_appname
my_embtest_app[7540/0]\n
GetHashValueStr pHash '0x83695cc' sKey 'EMBPERL_ALLOW' sDefault '(null)'
checking pointer to pHash
OK
first 128 bytes of pHash
0000: 000f5208 01000000 07c00404 90a83608 | ..R. .... .... ..6.
0010: 01000000 0d600000 00000000 01000000 | .... .`.. .... ....
0020: 00000000 00000000 01000000 00000000 | .... .... .... ....
0030: 18025208 01000000 07c00404 18574608 | ..R. .... .... .WF.
0040: 01000000 0c000000 20a83608 01000000 | .... .... ..6. ....
0050: 0d600000 a0c72b08 01000000 04000404 | .`.. .... .... ....
0060: c8564608 01000000 0c000404 00000000 | .VF. .... .... ....
0070: 01000000 00050000 58025208 01000000 | .... .... X.R. ....
checking if key exists
The segfault happens in my hv_exists() call prob. because the hash
is no more.
I don't know enough abount perl internals to make much sense if this,
but maybe something will ring a bell for you.
Aloha => Beau;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]