debug_backtrace

最近因为修复全站的sql注入漏洞,搞的焦头乱额。

尽管日志中能够看到错误,但是因为日志中错误描述非常简单,经常是 sql query fail之类简单描述,既没有详细回溯,也没有sql具体语句。因为是线上代码,不可能一步步追溯,这时候debug_backtrace 就非常有用了。

先来看下代码,怎么用的。

public static function fatal($msg, $file = null, $line = null)
    {
        $path = '';
        $debug = debug_backtrace();
        if(is_array($debug)){
            $debug = array_slice($debug,1);
            $pathArr = array();
            foreach($debug as  $trace ){
                $pathArr[] = $trace['class'].":".$trace['function'];
            }
            $path = implode(" <-- ",$pathArr);
        }
        $traceObj = self::getInstance();
        $traceObj->_trace($msg." path:".$path, self::$ERROR, $file, $line);
    }

我只是使用了这个方法的文件追溯。

官方文档:

debug_backtrace — 产生一条回溯跟踪(backtrace)

说明

array debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] )
debug_backtrace() 产生一条 PHP 的回溯跟踪(backtrace)。

参数

options
截至 5.3.6,这个参数是以下选项的位掩码:

debug_backtrace() 选项
DEBUG_BACKTRACE_PROVIDE_OBJECT    是否填充 "object" 的索引。
DEBUG_BACKTRACE_IGNORE_ARGS    是否忽略 "args" 的索引,包括所有的 function/method 的参数,能够节省内存开销。 在 5.3.6 之前,仅仅能使用的值是 TRUE 或者 FALSE,分别等于是否设置 DEBUG_BACKTRACE_PROVIDE_OBJECT 选项。
limit
截至 5.4.0,这个参数能够用于限制返回堆栈帧的数量。 默认为 (limit=0) ,返回所有的堆栈帧。

返回值

返回一个包含众多关联数组的 array。 以为为有可能返回的元素:

有可能从 debug_backtrace() 返回的元素
名字    类型    说明
function    string    当前的函数名,参见: __FUNCTION__。
line    integer    当前的行号。参见: __LINE__file    string    当前的文件名。参见: __FILE__class    string    当前 class 的名称。参见 __CLASS__
object    object    当前的 object。
type    string    当前调用的类型。如果是一个方法,会返回 "->"。如果是一个静态方法,会返回 "::"。 如果是一个函数调用,则返回空。
args    array    如果在一个函数里,这会列出函数的参数。 如果是在一个被包含的文件里,会列出包含的文件名。

大家可以自行尝试。

 

这个一般用来调试用哦,不建议线上使用,我这是迫不得已,修复完漏洞,已经去除。

posted @ 2014-10-27 18:58  Gcoder  阅读(1066)  评论(0编辑  收藏  举报