Class it_debug:

/**
 * Return short stackdump
 * @param $p['levels'] number of stack levels to return (default: 0 = all)
 * @param $p['skiplevels'] number of stack levels to omit
 * @param $p['skipfiles'] regular expression of filenames to omit
 * @param $p['trace'] Stack trace to compact
 */
static function backtrace($p = array())
{
    if (!
is_array($p))
        
$p = array('skiplevels' => $p);

    
$p += array('levels' => 0'skiplevels'=> 0'skipfiles' => "###");

    foreach (
$p['trace'] ?: array_slice(debug_backtrace(@constant('DEBUG_BACKTRACE_IGNORE_ARGS')), $p['skiplevels']) as $call)
    {
        if ((
$fn $call['file']) && !it::match($p['skipfiles'], $call['file']))
        {
            
$fn = (it::match('auto_prepend'$fn) ? basename(dirname(dirname($fn))) . "/" : (it::match('/(cgi|bin)/'$fn) ? basename(dirname($fn)) . "/" "")) . basename($fn);
            
$result[] = $fn ":" $call['line'];

            if (--
$p['levels'] == 0)
                break;
        }
    }

    return 
implode(" ", (array)$result);
}