I'm using getTraceAsString()
to get a stack trace but the string is being truncated for some reason.
Example, an exception is thrown and I log the string using:
catch (SoapFault $e) {
error_log( $e->getTraceAsString() )
}
The string thats prints out is:
#0 C:\Somedirectory\Somedirectory\Somedirectory\Somedir\SomeScript.php(10): SoapClient->SoapClient('http://www.ex...')
How can I get the full string to print?
I created this function to return a stack trace with no truncated strings:
function getExceptionTraceAsString($exception) {
$rtn = "";
$count = 0;
foreach ($exception->getTrace() as $frame) {
$args = "";
if (isset($frame['args'])) {
$args = array();
foreach ($frame['args'] as $arg) {
if (is_string($arg)) {
$args[] = "'" . $arg . "'";
} elseif (is_array($arg)) {
$args[] = "Array";
} elseif (is_null($arg)) {
$args[] = 'NULL';
} elseif (is_bool($arg)) {
$args[] = ($arg) ? "true" : "false";
} elseif (is_object($arg)) {
$args[] = get_class($arg);
} elseif (is_resource($arg)) {
$args[] = get_resource_type($arg);
} else {
$args[] = $arg;
}
}
$args = join(", ", $args);
}
$rtn .= sprintf(
"#%s %s(%s): %s%s%s(%s)\n",
$count,
$frame['file'],
$frame['line'],
isset($frame['class']) ? $frame['class'] : '',
isset($frame['type']) ? $frame['type'] : '', // "->" or "::"
$frame['function'],
$args
);
$count++;
}
return $rtn;
}
Alternatively, you could edit the php source where it is truncating the output: https://github.com/php/php-src/blob/master/Zend/zend_exceptions.c#L392
That solution is good but in my case it threw an error because my trace has internal functions in it. I added a few lines of code to check for that so the trace functions still works.
function getExceptionTraceAsString($exception) {
$rtn = "";
$count = 0;
foreach ($exception->getTrace() as $frame) {
$args = "";
if (isset($frame['args'])) {
$args = array();
foreach ($frame['args'] as $arg) {
if (is_string($arg)) {
$args[] = "'" . $arg . "'";
} elseif (is_array($arg)) {
$args[] = "Array";
} elseif (is_null($arg)) {
$args[] = 'NULL';
} elseif (is_bool($arg)) {
$args[] = ($arg) ? "true" : "false";
} elseif (is_object($arg)) {
$args[] = get_class($arg);
} elseif (is_resource($arg)) {
$args[] = get_resource_type($arg);
} else {
$args[] = $arg;
}
}
$args = join(", ", $args);
}
$current_file = "[internal function]";
if(isset($frame['file']))
{
$current_file = $frame['file'];
}
$current_line = "";
if(isset($frame['line']))
{
$current_line = $frame['line'];
}
$rtn .= sprintf( "#%s %s(%s): %s(%s)\n",
$count,
$current_file,
$current_line,
$frame['function'],
$args );
$count++;
}
return $rtn;
}
Some better version https://stackoverflow.com/a/6076667/194508 is here https://gist.github.com/1437966 added class to output.
Will changing the php.ini setting log_errors_max_len
help?
Also, please note that messages are truncated only during the output, you still can get the original error message with call to $exception->getMessage()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With