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:
Thank you for this bug report. To properly diagnose the problem, we
need a short but complete example script to be able to reproduce
this bug ourselves.
A proper reproducing script starts with <?php and ends with ?>,
is max. 10-20 lines long and does not require any external
resources such as databases, etc.
If possible, make the script source available online and provide
an URL to it here. Try to avoid embedding huge scripts into the report.
Previous Comments:
------------------------------------------------------------------------
[2005-07-12 19:07:14] phpbug at swift-web dot com
Sorry for the long delay in getting back to this. Tried using just a
plain php install as suggested (./configure --enable-debug
--with-apxs2=/usr/sbin/apxs2) and I was still getting the seg fault
error consistently on two different test boxes.
I tried looking at my code again and came up with an idea.
if a class has the static variables defined within the class but
outside the methods eg:
class test {
private static $test = true;
public function test_method() {
// do whatever and access the
// static property as: self::$test
}
}
then no seg faults occur when I dump this classes details with my
"dump" class which uses ReflectionMethod::getStaticVariables().
If however the above class is done this way instead (with the static
value only used in the method not in entire class):
class test {
public function test_method() {
static $test = true;
// do whatever and access the
// static property just as $test
}
}
Then using my debug dump class to display information about the class
causes a seg fault. I haven't given you my debug/dump class, maybe
this is what you need to reproduce the seg fault crash. I'll include
the class below.
To use the dump class I simply call it statically
debug::dump($new = new test(),'test class',true,true);
*(replace test() with the name of the class you want information about
obviously but my test about used the name test)
here is the class
////////// start of php code
class debug{
/**
* dump out variables to easy to read html tables
* variable can be array, string, boolean, object or hash mixture
*
* @param mix $data variable to be dumped
* str $label optional top label for table
* boo $show_docs true = show documentation for an
object
item
* false (default) = do not show docs
for
an object item
* boo $public_only true (default) = when
displaying objects
only
* show public items
* false
= show everything about the object
*
* returns html output
*/
final public static function
dump($data,$label='',$show_docs=false,$public_only=true) {
// 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.ss_debug::dump_html_table($data,$style,$show_docs,$public_only).'</td></tr></table><br
/>');
}
/**
* used privately by dump method
*/
final private static function
dump_html_table($data,&$style,$show_docs,$public_only) {
if (!is_array($data)) {
if ($data === NULL) {
return('--NULL--');
}
switch (gettype($data)) {
case 'string':
//if ($data === NULL) {
//return('--NULL--');
//}
return ( isset ( $data ) &&
!empty ( $data ) ) ?
'<pre>'.htmlentities($data)."</pre>" : ' ';
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) {
if ($method->isPublic()
|| $public_only !== true) {
$result =
array();
$name = '<font
color="grey">';
if
($method->isPublic()) {
$name
.= '<i>public</i> ';
} elseif
($method->isPrivate()) {
$name
.= '<i>private</i> ';
} elseif
($method->isProtected()) {
$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
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().')';
}
/* TODO: this
is commented out because of a bug in the gentoo
php installation, where if the static variables still contain there
* default
values then this causes a seg fault error
*/
$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><default></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']);
}
}
// removed following line
interface (not interfaces) as it seemed
to always be coming up as class (not sure what an interface is)
//$obj_data['interface'] =
$class->isInterface() ? 'interface' :
'class';
// removed following line from
above as it seemed to display info
I already have elsewhere
//$obj_data['modifiers'] =
sprintf('%d
[%s]',$class->getModifiers(),implode(' ',
Reflection::getModifierNames($class->getModifiers())));
$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']);
}
/* commented it out above so no
need to clean it out
if ($obj_data['modifiers']{0}
== '0') {
unset($obj_data['modifiers']);
}
*/
if ($obj_data['static
properties'] == array()) {
unset($obj_data['static
properties']);
}
if ($obj_data['properties'] ==
array()) {
unset($obj_data['properties']);
}
/* old method used in php4 (did
not show extra php5 info like
private, public, etc)
* and it only showed public
properties
$object_data = array (
'class' =>
get_class($data),
'parent_class' =>
get_parent_class($data),
'methods'
=> get_class_methods(get_class($data)),
'properties' =>
get_object_vars($data)
);
// by changing above line to
'properties' => (array)$data
// then we could see private,
protected properties but it was a
mess (and still not php5 info)
*/
return
(ss_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:
//if ($data === NULL) {
//return('-NULL-');
//}
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>\n <td style=\"%s\">%s</td>\n
<td style=\"%s\">%s</td>\n
<td style=\"%s\">%s</td>\n</tr>\n",
$style['key'], $key,
$style['type'], $type,
$style['value'],
ss_debug::dump_html_table($value,$style,$public_only,$show_docs)
);
}
$output .= '</table>';
return($output);
}
// end of ss_debug class
}
///////////////////////////// end of script
------------------------------------------------------------------------
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
