Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Advanced backtrace (deMone)
Author Message
deMone
Участник форума



Joined: 03 May 2004
Posts: 90
Карма: 6
   поощрить/наказать

Location: из России

PostPosted: Sat Oct 22, 2005 6:57 pm (написано за 4 минуты 11 секунд)
   Post subject: Advanced backtrace
Reply with quote

В PHP есть очень хорошая функция: debug_backtrace, которая создаёт массив с информацией о трассировке.
В PHP 5 повилась debug_print_backtrace, которая ещё и выводит это все в красивом виде.

К несчастью, в четвёртой версии её нет, а мне она понадобилась. Вот я и сделал:
Code (php): скопировать код в буфер обмена
function backtrace() {
        $bt=debug_backtrace (www.php.net/debug_backtrace)();

        unset (www.php.net/unset)($bt[0]);
                //

        echo (www.php.net/echo) '<ul>';

        for ($i=0; $i<=count (www.php.net/count)($bt); $i++) {
                if (!$bt[$i]) continue;
                echo (www.php.net/echo) '<li>: <em>' . $bt[$i]['file'] . '</em>';
                echo (www.php.net/echo) '<br /> <b>' . $bt[$i]['line'] . '</b>: <tt>';
                echo (www.php.net/echo) $bt[$i]['class']; echo (www.php.net/echo) $bt[$i]['type'];
                echo (www.php.net/echo) $bt[$i]['function']; echo (www.php.net/echo) ' (';
                $arglist='';
                for ($k=0; $k<count($bt[$i]['args']); $k++) { $arg='';
                        if (!$bt[$i]['args'][$k] and $bt[$i]['args'][$k]!==FALSE and $bt[$i]['args'][$k]!==NULL) continue;
                        if (is_array (www.php.net/is_array)($bt[$i]['args'][$k])) $arg='<pre>' . print_r (www.php.net/print_r)($bt[$i]['args'][$k], TRUE) . '</pre>';
                        if (is_bool (www.php.net/is_bool)($bt[$i]['args'][$k])) $arg=(bool)$bt[$i]['args'][$k];
                        if (is_float (www.php.net/is_float)($bt[$i]['args'][$k])) $arg=(float)$bt[$i]['args'][$k];
                        if (is_int (www.php.net/is_int)($bt[$i]['args'][$k])) $arg=(int)$bt[$i]['args'][$k];
                        if (is_null (www.php.net/is_null)($bt[$i]['args'][$k])) $arg='NULL';
                        if (is_object (www.php.net/is_object)($bt[$i]['args'][$k])) $arg='{ }';
                        if (is_resource (www.php.net/is_resource)($bt[$i]['args'][$k])) $arg='{}';
                        if (!$arg) $arg='"' . $bt[$i]['args'][$k] . '"';
                        $arglist.=$arg . ', ';
                }
                if ($arglist) $arglist=substr (www.php.net/substr)($arglist, 0, -2);

                echo (www.php.net/echo) $arglist . ')</tt>';
        }

        echo (www.php.net/echo) '</ul>';
}
Запускать лучше всего внутри функции-обработчика ошибок. Тогда легко увидеть что именно вызвало ошибку.

Если в одну из функций на пути трассировки был передан объект или ресурс (например, результат MySQL запроса), будет выведен текст {внешний объект} либо {ресурс}.

Cкриншот с результатом работы функции прицеплен к посту.

Предложения по улучшению принимаются ;)


1.gif
 Description:
Результат работы фукнции (для примера)
 Filesize:  4.01 KB
 Viewed:  5735 Time(s)

1.gif


Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML