ID:               32981
 Updated by:       [EMAIL PROTECTED]
 Reported By:      phpbug at swift-web dot com
-Status:           Open
+Status:           Feedback
 Bug Type:         Reproducible crash
 Operating System: Gentoo 2.6.11
 PHP Version:      5.0CVS (2005-05-09)
 New Comment:

Try it with plain ./configure --enable-debug
--with-apxs2=/usr/sbin/apxs2


Previous Comments:
------------------------------------------------------------------------

[2005-05-12 18:08:13] phpbug at swift-web dot com

Tried today's CVS snapshot and it still gives a seg fault error.  I
think I discovered problem with the debugging.  I just noticed when I
compile with --enable-debug I get warning messages in error_log saying
that my modules were not compiled with the debug flag set and they must
be.

I tried with --disable-debug so I didn't get those warnings and apache
starts cleanly (no warning messages).  Still get seg fault error.  I'll
compile the 13 extension modules I need to set the debug flag on for
again as well (opensll, mhash, zlib, gettext, tidy, exif, fam, ncurses,
mbstring, mcrypt, sysvmsg, sysvsem, sysvshm).  I won't have time to do
this for a few days though.

I configured php with:
--prefix=/usr --host=i686-pc-linux-gnu --mandir=/usr/share/man
--infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc
--localstatedir=/var/lib --with-jpeg-dir=/usr --with-freetype-dir=/usr
--with-t1lib=/usr --with-ttf=/usr --enable-gd-jis-conf
--enable-gd-native-ttf --with-png-dir=/usr --with-tiff-dir=/usr
--without-xpm-dir --with-gd --with-mysql
--with-mysql-sock=/var/run/mysqld/mysqld.sock --with-mm
--without-msession --enable-sqlite-utf8 --with-apxs2=/usr/sbin/apxs2
--with-config-file-path=/etc/php/apache2-php5 --without-pear
--disable-bcmath --without-bz2 --disable-calendar --without-cpdflib
--disable-ctype --without-curl --without-curlwrappers --disable-dbase
--disable-dio --enable-exif=shared --with-fam=shared --without-fbsql
--without-fdftk --disable-filepro --disable-ftp --with-gettext=shared
--without-gmp --without-hwapi --without-iconv --without-informix
--without-ingres --without-interbase --without-kerberos
--enable-mbstring=shared --with-mcrypt=shared --without-mcve
--disable-memory-limit --with-mhash=shared --without-mime-magic
--without-ming --without-mnogosearch --without-msql --without-mssql
--with-ncurses=shared --without-oci8 --without-oracle
--with-openssl=shared --with-openssl-dir=/usr --without-ovrimos
--disable-pcntl --without-pfpro --without-pgsql --disable-posix
--without-pspell --without-recode --disable-simplexml --enable-shmop
--without-snmp --disable-soap --disable-sockets --without-sybase
--without-sybase-ct --enable-sysvmsg=shared --enable-sysvsem=shared
--enable-sysvshm=shared --with-tidy=shared --disable-tokenizer
--disable-wddx --without-xsl --without-xmlrpc --disable-yp
--with-zlib=shared --disable-debug --disable-dba --with-readline
--without-libedit

I have apache-2.0.54-r3 compiled with mpm-prefork and ssl flags set.

Here is a complete cut 'n paste of the script I run to display class
information along with comments on how I can make it work (*note you'll
also see a comment out where isDestructor() always returns true as
well)

---start of code---
<?php
        // test for php Reflection bug (default static property value crash)
?><html>
<head>
<title>Test for php Reflection bug</title>
</head>
<body>
<center><h1>Test for php Reflection bug</h1></center>
<hr>
<?php
        //      phpinfo(); exit;

        /*
        * works when I call the below method (that overrides default static
property)
        * but when commented out page exits immediately
        */
//      debug::jason();
        echo debug::dump(new debug(),'debug()',0,true);

        // When I either comment out (or activate) line "debug::jason();", 
        // I change the text below to give a quick visual confirmation that
        // page is not actually fully running when I reload the page
        echo 'done';
        
        
        echo '</body></html>';





        // classes defined below
        class debug {
                final public static function jason($jason = true) {
                        static $mark = false;
                        if ($jason !== false) {
                                $mark = $jason;
                        } else {
                                return($mark);
                        }
                }

                final public static function
dump($data,$label='',$public_only=true,$show_docs=false) {
                        // make sure public_only & show_docs is just true or 
false
                        $public_only = ($public_only != false) ? true : false;
                        $show_docs = ($show_docs != false) ? true : false;
                        // setup styles for html output
                        $style['key']   = 'font-family: sans-serif; text-align: 
right;
font-size: 12px; font-weight: bold; background-color: #000; color:
#f0f0f0;';
                        $style['value'] = 'font-family: sans-serif; font-size: 
11px; color:
#009; background-color: #eee'; // monospace
                        $style['type']  = 'font-family: sans-serif; text-align: 
center;
font-size: 12px; background-color: #9cc; color: #600;';//#F6F6F6
                        $output = '<table border="2" bordercolor="#000080" 
cellpadding="0"
cellspacing="0"><tr><td style="font-family: sans-serif; font-size:
14px; background-color: #000080; color: white;">'.($label != '' ?
$label : 'variable dump - no variable name passed').'</td></tr><tr><td
style="font-family: sans-serif; text-align: center; font-size: 12px;
background-color: #9cc; color:
#600;">'.gettype($data).'</td></tr><tr><td>';
                        
return($output.debug::dump_html_table($data,$style,$public_only,$show_docs).'</td></tr></table><br
/>');
                }

                final private static function
dump_html_table($data,&$style,$public_only,$show_docs) {
                        if (!is_array($data)) {
                                switch (gettype($data)) {
                                        case 'string':
                                                return ( isset ( $data ) && 
!empty ( $data ) ) ?
'<pre>'.htmlentities($data).'</pre>' : '&nbsp;';
                                                break; // string
                                        case 'boolean':
                                                return($data ? 'true' : 
'false');
                                                break; // boolean
                                        case 'object':
                                                // search patterns to replace 
wasted front whitespace or empty
lines
                                                $doc_search = array('/^(\t| 
)*\/\*\*/','/^(\t| )*/m','/^(\t|
)*(\*\/)?(\t| )*(\n)?$/m','/^(\w|\*|\r|\n)*$/m');
                                                // convert object to array (so 
we can find private and protected
properties)
                                                $raw_properties = (array)$data;
                                                // Create an instance of the 
ReflectionClass class to give us
more detailed info
                                                $class = new 
ReflectionClass(get_class($data));
                                                $class_name = $class->getName();
                                                // get method info
                                                $methods = $properties = 
array();
                                                foreach ($class->getMethods() 
as $method) {
                                                        $result = array();
                                                        $name = '<font 
color="grey">';
                                                        if 
($method->isPublic()) {
                                                                $name .= 
'<i>public</i> ';
                                                        } elseif 
($method->isPrivate()) {
                                                                if 
($public_only === true) {
                                                                        break;
                                                                }
                                                                $name .= 
'<i>private</i> ';
                                                        } elseif 
($method->isProtected()) {
                                                                if 
($public_only === true) {
                                                                        break;
                                                                }
                                                                $name .= 
'<i>protected</i> ';
                                                        }
                                                        if 
($method->isStatic()) {
                                                                $name .= 
'<i>static</i> ';
                                                        }
                                                        if 
($method->isAbstract()) {
                                                                $name .= 
'<i>abstract</i> ';
                                                        }
                                                        if ($method->isFinal()) 
{
                                                                $name .= 
'<i>final</i> ';
                                                        }
                                                        $name .= 
'</font>'.$method->getName();
                                                        if ($show_docs === 
true) {
                                                                $result['docs'] 
= $method->getDocComment();
                                                                if 
($result['docs'] == false) {
                                                                        
unset($result['docs']);
                                                                } else {
                                                                        
$result['docs'] =
preg_replace($doc_search,'',$result['docs']);
                                                                }
                                                        }
                                                        $result['params'] = '';
                                                        
foreach($method->getParameters() as $parameter) {
                                                                
$result['params'] .= $parameter->__toString().", \n";
                                                        }
                                                        if ($result['params'] 
== false) {
                                                                
unset($result['params']);
                                                        } else {
                                                                
$result['params'] = substr($result['params'],0,-3);
                                                        }
                                                        $result['info'] = '';
                                                        if 
($method->isConstructor()) {
                                                                $result['info'] 
.= 'constructor, ';
                                                        }
                                                        /* does not appear to 
work (it always returns true)
                                                        if 
($method->isDestructor()) {
                                                                $result['info'] 
.= 'destructor, ';
                                                        }
                                                        */
                                                        if 
($method->isInternal()) {
                                                                $result['info'] 
.= 'internal (built-into php)';
                                                        } else {
                                                                $result['info'] 
.= 'user-defined (lines
'.$method->getStartLine().' - '.$method->getEndline().')';
                                                        }
                                                        $result['static vars'] 
= $method->getStaticVariables();
                                                        if ($result['static 
vars'] == array()) {
                                                                
unset($result['static vars']);
                                                        }
                                                        $methods[$name] = 
$result;
                                                }
                                                // get property info
                                                foreach 
($class->getProperties() as $prop) {
                                                        $prop_name = 
$prop->getName();
                                                        $result = array();
                                                        $name = '<font 
color="grey">';
                                                        if ($prop->isDefault()) 
{
                                                                $name .= 
'<i>&lt;default&gt;</i> ';
                                                        }
                                                        if ($prop->isPublic()) {
                                                                $name .= 
'<i>public</i> ';
                                                        } elseif 
($prop->isPrivate()) {
                                                                if 
($public_only === true) {
                                                                        break;
                                                                }
                                                                $name .= 
'<i>private</i> ';
                                                        } elseif 
($prop->isProtected()) {
                                                                if 
($public_only === true) {
                                                                        break;
                                                                }
                                                                $name .= 
'<i>protected</i> ';
                                                        }
                                                        if ($prop->isStatic()) {
                                                                $name .= 
'<i>static</i> ';
                                                        }
                                                        $name .= 
"</font>$prop_name";
                                                        
                                                        $found = false;
                                                        foreach 
($raw_properties as $key => $value) {
                                                                if 
(strpos($key,$prop_name,(strlen($key)-strlen($prop_name))))
{
                                                                        
$properties[$name] = $value;
                                                                        $found 
= true;
                                                                        
unset($raw_properties[$key]);
                                                                        break;
                                                                }
                                                        }
                                                        if ($found === false) {
                                                                
$properties[$name] = NULL;
                                                        }
                                                }
                                                // get class info
                                                $keywords = 
$class->isAbstract() ? 'abstract ' : '';
                                                $keywords .= $class->isFinal() 
? 'final ' : '';
                                                $keywords .= $class_name;
                                                $parent = 
$class->getParentClass();
                                                $parent = (array)$parent;
                                                if (isset($parent['name'])) {
                                                        $keywords .= ' extends 
'.$parent['name'];
                                                }
                                                $obj_data['class'] = $keywords;
                                                $obj_data['declared in'] = 
$class->getFileName().' (lines
'.$class->getStartLine().' - '.$class->getEndline().')';
                                                if ($show_docs === true) {
                                                        $obj_data['docs'] = 
$class->getDocComment();
                                                        if ($obj_data['docs'] 
== false) {
                                                                
unset($obj_data['docs']);
                                                        }  else {
                                                                
$obj_data['docs'] =
preg_replace($doc_search,'',$obj_data['docs']);
                                                        }
                                                }
                                                $obj_data['interfaces'] = 
($class->getInterfaces() == array() &&
count($class->getInterfaces()) > 0) ?
var_export($class->getInterfaces(),1) : 'none';
                                                $obj_data['constants'] = 
(($class->getConstants() == array() &&
count($class->getConstants()) > 0) ? $class->getConstants() : 'none');
                                                $obj_data['static properties'] 
= $class->getStaticProperties();
                                                $obj_data['properties'] = 
$properties;
                                                $obj_data['methods'] = $methods;
                                                // unset empty fields to save 
space
                                                if ($obj_data['interfaces'] == 
'none') {
                                                        
unset($obj_data['interfaces']);
                                                }
                                                if ($obj_data['constants'] == 
'none') {
                                                        
unset($obj_data['constants']);
                                                }
                                                if ($obj_data['static 
properties'] == array()) {
                                                        unset($obj_data['static 
properties']);
                                                }
                                                if ($obj_data['properties'] == 
array()) {
                                                        
unset($obj_data['properties']);
                                                }
                                                return
(debug::dump_html_table($obj_data,$style,$public_only,$show_docs));
                                                break; 
                                        case 'resource':
                                                return sprintf('%s 
(%s)',$data,get_resource_type($data));
                                                break; 
                                        default: 
                                                return $data;
                                                break; 
                                }
                        }
                        $output = '<table border="1" cellpadding="3" 
cellspacing="0">';
                        foreach ($data as $key => $value) {
                                $type = substr(gettype($data[$key]),0,3);
                                $output .= sprintf ( 
                                        '<tr>
                                        <td style="%s">%s</td>
                                        <td style="%s">%s</td>
                                        <td style="%s">%s</td>
                                        </tr>',
                                        $style['key'], $key,
                                        $style['type'], $type,
                                        $style['value'],
debug::dump_html_table($value,$style,$public_only,$show_docs)
                                );
                        } 
                        $output .= '</table>';
                        return($output);
                }
                // end of debug class
        }


?>
---end of code---

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/32981

-- 
Edit this bug report at http://bugs.php.net/?id=32981&edit=1

Reply via email to