是否有漂亮的打印堆栈转储?

Maw*_*awg 12 php debugging

让我们面对现实,debug_backtrace()输出不是很漂亮.有没有人编写包装器?

什么是你最喜欢的漂亮var_dump()(可用于商业项目,所以没有GPL(虽然LGPL是好的))

另请参阅:PHP中更漂亮/信息丰富的Var_dump替代方案?


六年 - 以及这个问题的一万次观点 - 后来,我仍在使用这个.它在屏幕上显得不错,就像Kint(非常棒).

它是纯文本,我可以通过自动错误报告发送给自己,并可以使用ChromePhp在浏览器的开发人员控制台中显示.

/**
 * @brief Returns an HTML formatted string showing details of the backtrace
 * 
 * Example:
 * 
 *    F:\Dropbox\programs\Xampp\htdocs\api\q.php:48 e(373, 'beer', 'curry')
 *    F:\Dropbox\programs\Xampp\htdocs\api\q.php:53 d(26366, 28255, 8364)
 *    F:\Dropbox\programs\Xampp\htdocs\api\q.php:58 c()
 *    F:\Dropbox\programs\Xampp\htdocs\api\q.php:63 b(1283, 15488, 29369)
 *    F:\Dropbox\programs\Xampp\htdocs\api\q.php:72 a(788, 6077, 25010)
 */
function FormatBacktrace()
{
   $result = '<h4>Backtrace</h4>';

   foreach (debug_backtrace() as $trace)
   {
      if ($trace['function'] ==__FUNCTION__)
          continue;

      $parameters = is_array($trace['args']) ? implode(", ",$trace['args']) : "";

      if (array_key_exists('class', $trace))
         $result .= sprintf("%s:%s %s::%s(%s)<br>",   
                              $trace['file'],   
                              $trace['line'],    
                              $trace['class'],  
                              $trace['function'],  
                              $parameters);
      else
         $result .= sprintf("%s:%s %s(%s)<br>", 
                              $trace['file'], 
                              $trace['line'], 
                              $trace['function'], 
                              $parameters);
    }

    return $result;
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ost 9

你也有kint(github repo)composerpackagist存储库上有一个包

因此,无论是手动下载库还是使用composer,都只需要:

$ composer init
$ composer require raveren/kint
$ composer install
Run Code Online (Sandbox Code Playgroud)

然后,ini_set('display_errors', 'On');我更喜欢在我的main(第一个)包含文件中使用这个简单的处理程序:

if (  getenv('__project_env__') === 'DEV') {

  error_reporting(E_ALL | E_STRICT);

  function shutdown_handler() {
    $error = error_get_last();
    Kint::trace();
    Kint::dump($error);
  }
  register_shutdown_function('shutdown_handler');

} else {
 ...
}
Run Code Online (Sandbox Code Playgroud)

通过__project_env__在Apache的Virtualhost(SetEnv __project_env__ "DEV")中设置,以免污染git项目所在的存储库的不同分支与配置项本质environmental

  • 在DEV:我得到我的调试
  • 在PROD中,默认情况下它是静默的

以下是跟踪外观(每个步骤均可折叠)的屏幕截图:

Kint堆栈跟踪


Ale*_*min 6

Xdebug扩展可以打印踪迹了可配置程度冗长的.

Xdebug stacktrace图像

它还提供了一些额外的var_dump()功能,例如语法着色:

彩色var_dump()

编辑:

关于将Xdebug纳入商业项目.

Xdebug的许可证只有几个术语,似乎很宽容.

Xdebug是C扩展.因此,在项目中重新分配它或部分它可能有点困难.根据您的要求,我看到几个选项:

  • 让最终用户从Linux发行包或站点的DLL安装Xdebug
  • 为所有支持的平台分发.dll和.so文件
  • 让最终用户构建源代码
  • 分发PHP的自定义构建


jhu*_*man 5

这是我的漂亮的打印包装器,用于非浏览器输出,即错误日志或控制台:

function stackTrace() {
    $stack = debug_backtrace();
    $output = '';

    $stackLen = count($stack);
    for ($i = 1; $i < $stackLen; $i++) {
        $entry = $stack[$i];

        $func = $entry['function'] . '(';
        $argsLen = count($entry['args']);
        for ($j = 0; $j < $argsLen; $j++) {
            $func .= $entry['args'][$j];
            if ($j < $argsLen - 1) $func .= ', ';
        }
        $func .= ')';

        $output .= $entry['file'] . ':' . $entry['line'] . ' - ' . $func . PHP_EOL;
    }
    return $output;
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎与对象参数有关:`可捕获的致命错误:类MyClass的对象无法转换为字符串` (2认同)

jam*_*rke 5

jhurliman 上面漂亮的打印 stackTrace 方法真的很棒。但对我来说,它产生了大量的 PHP 警告,这些警告也使日志变得混乱。我添加了更多的错误和类型检查,这会在日志中产生一个非常好的堆栈跟踪。这是 jhurliman 代码的修改版本:

function stackTrace() {
    $stack = debug_backtrace();
    $output = '';

    $stackLen = count($stack);
    for ($i = 1; $i < $stackLen; $i++) {
        $entry = $stack[$i];

        $func = $entry['function'] . '(';
        $argsLen = count($entry['args']);
        for ($j = 0; $j < $argsLen; $j++) {
            $my_entry = $entry['args'][$j];
            if (is_string($my_entry)) {
                $func .= $my_entry;
            }
            if ($j < $argsLen - 1) $func .= ', ';
        }
        $func .= ')';

        $entry_file = 'NO_FILE';
        if (array_key_exists('file', $entry)) {
            $entry_file = $entry['file'];               
        }
        $entry_line = 'NO_LINE';
        if (array_key_exists('line', $entry)) {
            $entry_line = $entry['line'];
        }           
        $output .= $entry_file . ':' . $entry_line . ' - ' . $func . PHP_EOL;
    }
    return $output;
}
Run Code Online (Sandbox Code Playgroud)