perl-embperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Beau E. Cox" <b...@beaucox.com>
Subject Re: Segfaults
Date Wed, 28 Apr 2004 16:18:32 GMT
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 
*) webmaster@beaucox.com\n
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: embperl-unsubscribe@perl.apache.org
For additional commands, e-mail: embperl-help@perl.apache.org


Mime
View raw message