SysTools Logo SysTools


PHP: Debug call trace


<?php // dbgtrace.php

/*
  Debug call trace
  helps to understand the code workflow
  especially useful in large projects

  argument <f> is a bit flags mask:
    1 - direct trace order (do not reverse)
    2 - text trace output (do not HTML escape)
    4 - return trace output (do not call die)
    8 - don't send headers for output (when 4 not specified)
  example (return trace as unescaped text):
    $t = dbgtrace(4 | 2);
*/
if (!function_exists('dbgtrace')) {
  function dbgtrace($f = 0) {
    $f = max(intval($f), 0);
    $l = array();
    $t = debug_backtrace();
    array_shift($t);
    while (count($t)) {
      extract(array_pop($t));
      $l[] = sprintf(
        '[%u] %s:%u: %s()',
        count($l) + 1, basename($file), $line, $function
      );
    }
    if (!($f & 1)) {
      $l = array_reverse($l);
    }
    $l = implode(PHP_EOL, $l);
    if (!($f & 2)) {
      $l = nl2br(htmlspecialchars($l, ENT_COMPAT, 'cp1251'));
    }
    if (!($f & 4)) {
      if ((!($f & 8)) && (!headers_sent())) {
        header(
          'Content-Type: '.
          (($f & 2) ? 'text/plain' : 'text/html').
          '; charset=windows-1251'
        );
      }
      die($l);
    }
    return($l);
  }
}

// example of usage
function last_func() { dbgtrace(); }

function deep_func() { last_func(); }

function call_func() { deep_func(); }

  call_func();

/* output:
[3] dbgtrace.php:53: last_func()
[2] dbgtrace.php:55: deep_func()
[1] dbgtrace.php:57: call_func()
*/

2022.06.14


[ Код ]