За последние 24 часа нас посетили 31718 программистов и 1366 роботов. Сейчас ищут 927 программистов ...

Дебуггер

Тема в разделе "PHP для новичков", создана пользователем kadet, 18 дек 2010.

  1. kadet

    kadet Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    79
    Симпатии:
    0
    Дебаггер использует свой собственный файл $this->f по умолчанию 'debug-log.html' его можно изменить задав явно параметр $filename.
    Код (Text):
    1.  
    2. $d->fp($a,0,'n:\ew\path\myfile.txt');
    дебаггер создаёт экземпляр класса $d при подключении модуля.

    работа с дебагером:
    - add=0 - создвёт,открывает,закрывает файл
    - add=1 - добавляет в существующий открытый файл
    - add=2 - создаёт, новый файл, открывает его
    - add=3 - закрывает существующий файл
    Код (Text):
    1.  
    2. //записываем переменные $a, $b, $c в файл $d->fnDebugLog
    3. 1) $d->fp($a,2);
    4. 2) $d->fp($b);
    5. 3) $d->fp($c,3);
    функции дебаггера продублированы для вывода на экран print только с той разницей что переменные $add, $filename, $p_line, $p_file заменены на $_exit при значении true программа завершает свою работу.
    Код (Text):
    1.  
    2. p($a);
    3. pC($b,'b',true); //и т.д.
    PHP:
    1. <?php
    2.  
    3. /*
    4. work with debug:
    5.         p($a) - print "$a;"
    6.         pc($a,$capt) - print "caption=$a;"
    7.         pCap($caption)   - print "caption"
    8.         pv($a[,$b,$c,$d])          - print "a; b; c; d;"
    9.         pvC($a,$capta[,$b,$captb,$c,$captc,$d,$captd])  - print "captionA=a; captionB=b; captioC=c; captionD=d;"
    10.         pA($arr)         - print "Array count=__" "content of array"
    11.         pAA($assocArray)              - print assoc array
    12.         pG()              - print data $_GET
    13.         pP()  print data $_GET
    14.   loop
    15.         pL($a,[$cnt,$condition,$caption,$description,$maxCnt,$_exit,$var])
    16.                     print    $description
    17.                                     $caption1=$a1 $var1
    18.                                     $caption2=$a1 $var2
    19.                                      .
    20.                                      .
    21.                               (if maxCnt==cnt print "--- end cycle ---")
    22.                               (if !condition not print)
    23. */
    24.  
    25.  class Debugger {
    26.  
    27.  
    28.   private function ocFile($add,$filename,$p_line='',$p_file='')
    29.        {
    30.         print $add. " "; if ($add==1) print "<br>";
    31.         if($filename<>'')
    32.                {
    33.             $this->fnDebugLog=$filename;
    34.                }
    35.     $s='';
    36.         if($p_line<>'')$s.= 'line ' .$p_line. ' ';
    37.         if($p_file<>'')$s.= 'file ' .$p_file. ' ';
    38.  
    39.     if(($add==1)&&($this->f==''))
    40.            {
    41.             $this->f=fopen($this->fnDebugLog,'a');
    42.            }
    43.         if(($add==0)or($add==2))
    44.                 {
    45.          $this->f=fopen($this->fnDebugLog,'w');
    46.  
    47.          fwrite($this->f,'Debuger programm execute [' .date("G.i:s d/m/y",time()). '] ' .$this->html_text.
    48.                       $s.$this->html_text.$this->html_text);
    49.                 }
    50.         elseif( $s<>'' ) fwrite($this->f,$s.$this->html_text);
    51.        }
    52.  
    53.   public $f             =   '';                             // file debug
    54.   public $fnDebugLog    =   'debug-log.txt';                // log file debugera
    55.   public $html_text     =   '<br>';                         // html file ili textovii
    56.  
    57.   public function fpCap($caption,$add=1,$filename='',$p_line='',$p_file='')
    58.        {
    59.     $this->ocFile($add,$filename,$p_line,$p_file);
    60.         fwrite($this->f,$caption.$this->html_text.$this->html_text);
    61.         if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; }
    62.        }
    63.  
    64.   public function fp($a='',$add=1,$filename='',$p_line='',$p_file='')
    65.        {
    66.     $this->ocFile($add,$filename,$p_line,$p_file);
    67.         if($a<>'') fwrite($this->f,$a. ';' .$this->html_text);
    68.         else
    69.                {
    70.                 fwrite($this->f,'Print all vars:' .$this->html_text);
    71.  
    72.                 foreach($GLOBALS as $key=>$val)
    73.                {
    74.                     if(! is_array($val)) fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text);
    75.                }
    76.                }
    77.         fwrite($this->f,$this->html_text);
    78.         if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; }
    79.        }
    80.  
    81.   public function fpC($a,$caption,$add=1,$filename='',$p_line='',$p_file='')
    82.        {
    83.     $this->ocFile($add,$filename,$p_line,$p_file);
    84.  
    85.         fwrite($this->f,$caption. '= ' .$a. '; ' .$this->html_text.$this->html_text);
    86.  
    87.         if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; }            
    88.        }
    89.  
    90.   public function fpA($arr,$add=1,$filename='',$p_line='',$p_file='')
    91.        {
    92.     $this->ocFile($add,$filename,$p_line,$p_file);
    93.  
    94.         fwrite($this->f,'Array: count= ' .count($arr). ' ' .$this->html_text);
    95.  
    96.         for($i=0;$i<count($arr);$i++)
    97.            {
    98.             fwrite($this->f,$arr[$i]. '; ');
    99.            }
    100.         fwrite($this->f,$this->html_text.$this->html_text);
    101.  
    102.         if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; }
    103.        }
    104.  
    105.    function fprArray($var, $title = true, $add=1, $filename='', $p_line='', $p_file='') {
    106.  
    107.      $string = '<table border="1">';
    108.      if ($title) {
    109.          $string .= "<tr><td><b>Key</b></td><td><b>Value</b></td></tr>\n";
    110.      }
    111.  
    112.      if (is_array($var)) {
    113.        foreach($var as $key => $value) {
    114.  
    115.            $string .= "<tr>\n" ;
    116.            $string .= "<td><b>$key</b></td><td>";
    117.  
    118.            if (is_array($value)) {
    119.                $string .= Debugger::printArray($value, false);
    120.            } elseif(gettype($value) == 'object') {
    121.                $string .= "Object of class " . get_class($value);
    122.            } else {
    123.                $string .= "$value" ;
    124.            }
    125.  
    126.            $string .= "</td></tr>\n";
    127.        }
    128.     }
    129.  
    130.     $this->ocFile($add,$filename,$p_line,$p_file);
    131.     fwrite($this->f,$string);
    132.  
    133.     if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; }
    134.    }
    135.  
    136.  
    137.   public function fpAA($arr_assoc,$caption='Array',$add=1,$filename='',$p_line='',$p_file='')
    138.        {
    139.         $this->ocFile($add,$filename,$p_line,$p_file);
    140.  
    141.     fwrite($this->f,$caption. ': count= ' .count($arr_assoc). ';' .$this->html_text);
    142.         if( count($arr_assoc)>0 )
    143.            foreach($arr_assoc as $key=>$val)
    144.            {
    145.             fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text);
    146.            }
    147.         fwrite($this->f,$this->html_text);
    148.  
    149.         if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; }
    150.        }
    151.  
    152.   public function fpP($add=1,$filename='',$p_line='', $p_file='')
    153.        {
    154.         $this->ocFile($add,$filename,$p_line,$p_file);
    155.  
    156.     fwrite($this->f,'POST:');
    157.         if( empty($GLOBALS['_POST'])) fwrite($this->f,'is empty.' .$this->html_text);
    158.         else
    159.           {
    160.            foreach($GLOBALS['_POST'] as $key=>$val)
    161.            {
    162.             fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text);
    163.            }
    164.           }
    165.         fwrite($this->f,$this->html_text);
    166.  
    167.         if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; }
    168.        }
    169.  
    170.   public function fpG($add=1,$filename='',$p_line='',$p_file='')
    171.        {
    172.         $this->ocFile($add,$filename,$p_line,$p_file);
    173.  
    174.     fwrite($this->f,'GET:');
    175.         if( empty($GLOBALS['_GET'])) fwrite($this->f,'is empty.' .$this->html_text);
    176.         else
    177.            foreach($GLOBALS['_GET'] as $key=>$val)
    178.            {
    179.             fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text);
    180.            }
    181.         fwrite($this->f,$this->html_text);
    182.  
    183.         if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; }
    184.        }
    185.  
    186.   public function fpInpData($add=1, $filename='',$p_line='',$p_file='')
    187.        {
    188.         $this->ocFile($add,$filename,$p_line,$p_file);
    189.  
    190.     fwrite($this->f,'POST:');
    191.         if( empty($GLOBALS['_POST'])) fwrite($this->f,'is empty.' .$this->html_text);
    192.         else
    193.            foreach($GLOBALS['_POST'] as $key=>$val)
    194.            {
    195.             fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text);
    196.            }
    197.         fwrite($this->f,$this->html_text);
    198.  
    199.     fwrite($this->f,'GET:');
    200.         if( empty($GLOBALS['_GET'])) fwrite($this->f,'is empty.' .$this->html_text);
    201.         else
    202.            foreach($GLOBALS['_GET'] as $key=>$val)
    203.            {
    204.             fwrite($this->f,'key= ' .$key. '; value= ' .$val. ';' .$this->html_text);
    205.            }
    206.         fwrite($this->f,$this->html_text);
    207.  
    208.         if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; }
    209.        }
    210.  
    211. // Otladka ciklov
    212.   public function fpL($a,$cnt=-1,$add=1,$condition=true,$caption='',$description='',$filename='',$p_line='',$p_file='')
    213.        {
    214.         if($condition)
    215.                {
    216.             $this->ocFile($add,$filename,$p_line,$p_file);
    217.  
    218.         if($cnt==0) fwrite($this->f,$description. ' loop variable inspecting:' .$this->html_text);
    219.             if($cnt>-1) fwrite($this->f,'step: ' .$cnt. ' ');
    220.             fwrite($this->f,$caption. '= ' .$a. ';' .$this->html_text);
    221.  
    222.             if(($add==0)or($add==3)) { fclose($this->f); $this->f=''; }
    223.            }
    224.        }
    225.  }
    226.  
    227. $d = new Debugger();
    228.  
    229. function prnVar($s)
    230.        {
    231.         $num=0;
    232.         while( $num<strlen($s) )
    233.                {
    234.                 if( $s[$i] == '<' ) $s[$i]='&lt';
    235.                 if( $s[$i] == '>' ) $s[$i]='&gt';
    236. //                if( $s[$i] == '' ) $s[$i]='&';
    237.                }
    238.         return $s;
    239.        }
    240.  
    241. function be_print($var='')
    242.        {
    243.         $res=gettype($var);
    244.         if( ($res == 'string')&&($var == '') ) return false;
    245.         elseif( ($res == 'integer')&&($var == 0) ) $var='0';
    246.         return $var;
    247.        }
    248.  
    249. function pCap($caption,$_exit=false)
    250.        {
    251.         print $caption. "<br>";
    252.  
    253.         if( $_exit==true ) exit;
    254.        }
    255.  
    256. function p($a,$_exit=false)
    257.        {
    258.         print $a. ";<br>";
    259.         if( $_exit ) exit;
    260.        }
    261.  
    262. function pv($a,$b='',$c='',$d='')
    263.        {
    264.         $s=$a. ';';
    265.         if( !((gettype($b) == 'string')&&($b == '')) ) $s.=' ' .$b. ';';
    266.         if( !((gettype($c) == 'string')&&($c == '')) ) $s.=' ' .$c. ';';
    267.         if( !((gettype($d) == 'string')&&($d == '')) ) $s.=' ' .$d. ';';
    268.  
    269.         print $s ."<br>";
    270.        }
    271.  
    272. function pvC($a,$capta='',$b='',$captb='',$c='',$captc='',$d='',$captd='')
    273.        {
    274.         if( $capta == '' ) $s = 'var a=' .$a. '; '; else $s = $capta. '=' .$a. '; ';
    275.         if( !((gettype($b) == 'string')&&($b == '')) ) if( $captb == '' ) $s.= 'var b=' .$b. '; '; else $s.= $captb. '=' .$b. '; ';
    276.         if( !((gettype($c) == 'string')&&($c == '')) ) if( $captc == '' ) $s.= 'var c=' .$c. '; '; else $s.= $captc. '=' .$c. '; ';
    277.         if( !((gettype($d) == 'string')&&($d == '')) ) if( $captd == '' ) $s.= 'var d=' .$d. '; '; else $s.= $captd. '=' .$d. '; ';
    278.         print "$s<br>";
    279.        }
    280.  
    281. function pC($a,$caption,$_exit=false)
    282.        {
    283.         print $caption. "=" .$a. ";<br>";
    284.         if( $_exit ) exit;
    285.        }
    286.  
    287. function pA($arr,$_exit=false)
    288.        {
    289.         print "count = " .count($arr). "<br>";
    290.         for($i=0;$i<count($arr);$i++)
    291.                 print $arr[$i]. ";<br>";
    292.         print "<br>";
    293.         if( $_exit ) exit;
    294.        }
    295.  
    296. function pAA($arr,$caption='',$_exit=false)
    297.        {
    298.         if( $caption=='' ) $caption='Array';
    299.         print $caption. ": count = ".count($arr). "<br>";
    300.         foreach($arr as $key=>$value)
    301.                {
    302.                 print "key = " .$key. "; value = " .$value. ";<br>";
    303.                }
    304.         print "<br>";
    305.         if( $_exit ) exit;
    306.        }
    307.  
    308. function pP($_exit=false)
    309.        {
    310.         pAA($GLOBALS['_POST'],'POST',$_exit);
    311.        }
    312.  
    313. function pG($_exit=false)
    314.        {
    315.         pAA($GLOBALS['_GET'],'GET',$_exit);
    316.        }
    317.  
    318. function pInpData($_exit=false)
    319.        {
    320.         pAA($GLOBALS['_POST'],'POST',$_exit);
    321.         pAA($GLOBALS['_GET'],'GET',$_exit);
    322.        }
    323.  
    324. function pL($a,$cnt=-1,$condition=true,$caption='',$description='',$maxCnt=-1,$_exit=false,$var='')
    325.        {
    326.         if( !$condition ) return false;
    327.         if( ($cnt==0)&&($description<>'') ) print $description. "<br><br>";
    328.         if( $cnt<>-1 ) print $cnt. ": ";
    329.         ($caption=='')?print $a. "; " .$var. ";<br><br>":print $caption. " = " .$a. "; " .$var. ";<br><br>";
    330.         if( ($maxCnt<>-1)&&($cnt==$maxCnt) )
    331.                {
    332.                 print "--- end cycle ---<br><br>";
    333.                 if( $_exit ) exit;
    334.                }
    335.        }
    336.  ?>
    337.  
    Может кто-то придумает алгоритм и функции удаления вставок дебаггера из файлов проекта? :roll:

    * в разработке дебаггера принимали участие: Апельсин, Padaboo, Luge, tommyangelo, Volt(220), ну и kadet
     
  2. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Гамбургер?
     
  3. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
  4. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    :D
     
  5. RX200

    RX200 Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    56
    Симпатии:
    0
    kadet
    Что то, не совсем понимаю, отлаживать чего можно с помощью вами написаного, и как.
    Вот отладчик вы предложили написать верно?
    1.Что он будет уметь делать? и/или что с помощью него можно делать?
    2.Какие задачи нужно в нём реализовать?
    3.С чем он будет работать?
    4.Какая в нём потребность? и/или необходимость? Какие есть альтернативы для решения задач которые будет решать отладчик?

    P.S. раздел форума "Программирование на PHP для новичков" - почему сюда?
     
  6. kadet

    kadet Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    79
    Симпатии:
    0
    1.
    2.
    3.
    ..
    Сразу видно программер писал :D

    "Прг для новичков" потому что недавно сел за пхп.

    Padaboo, мощная у вас штука,только нельзя просмотреть переменнные, насколько я понял.
    В этом в принципе вся цель дебуггера. Какие куда пришли данные где искать ошибку.

    RX, может и есть альтернативы, хочется самому создать чтото полезное.

    /3.С чем он будет работать?/ с пхп, штмл:)

    /в виду того что отображаемую информацию трудно разглядеть в тексте/
    раньше выводил значения переменных прямо на страницу print "$a", echo($a) и т.д.
     
  7. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    kadet
    я для "быстрого дебага" использую супер-пупер функцию)))

    function dg($var = null, $var_dump = false)
    {
    echo '<pre>';
    $var_dump === false ? print_r($var) : var_dump($var);
    die();
    }

    Попробуй заюзать)))

    Принимает в качестве первого параметра любой тип переменной будь то обычная переменная любого типа, массив или объект

    А это из книги "PHP5 для профессионалов"

    PHP:
    1. <?php
    2.  
    3. define('DEBUG_INFO', 100);
    4. define('DEBUG_SQL', 75);
    5. define('DEBUG_WARNING', 50);
    6. define('DEBUG_ERROR', 25);
    7. define('DEBUG_CRITICAL', 10);
    8.  
    9. class Debugger {
    10.  
    11.   public static function debug($data, $key = null, $debugLevel = DEBUG_INFO) {
    12.     global $cfg;
    13.  
    14.     if(! isset($_SESSION['debugData'])) {
    15.       $_SESSION['debugData'] = array();
    16.     }
    17.  
    18.     if($debugLevel <= $cfg['DEBUG_LEVEL']) {
    19.       $_SESSION['debugData'][$key] = $data;
    20.     }
    21.   }
    22.  
    23.   public static function debugPrint() {
    24.  
    25.     $arDebugData = $_SESSION['debugData'];
    26.     print Debugger::printArray($arDebugData);
    27.    
    28.     $_SESSION['debugData'] = array();
    29.  
    30.   }
    31.  
    32.   function printArray($var, $title = true) {
    33.  
    34.     $string = '<table border="1">';
    35.     if ($title) {
    36.         $string .= "<tr><td><b>Key</b></td><td><b>Value</b></td></tr>\n";
    37.     }
    38.  
    39.     if (is_array($var)) {
    40.       foreach($var as $key => $value) {
    41.          
    42.           $string .= "<tr>\n" ;
    43.           $string .= "<td><b>$key</b></td><td>";
    44.  
    45.           if (is_array($value)) {
    46.               $string .= Debugger::printArray($value, false);
    47.           } elseif(gettype($value) == 'object') {
    48.               $string .= "Object of class " . get_class($value);
    49.           } else {
    50.               $string .= "$value" ;
    51.           }
    52.  
    53.           $string .= "</td></tr>\n";
    54.       }
    55.     }
    56.  
    57.     $string .= "</table>\n";
    58.     return $string;
    59.   }
    60.  
    61. }
    62. ?>
    Чтобы отследить переменную
    Код (Text):
    1. Debugger::debug($query, "Класс такой-то, метод такой-то, либо строка");
    Перед выпадением программы в аут

    Код (Text):
    1. Debugger::debugPrint();
     
  8. kadet

    kadet Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    79
    Симпатии:
    0
    попробую
     
  9. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    в сообщение выше отправил оригинал класса, а не измененную мной копию - чтобы понятнее было
     
  10. kadet

    kadet Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    79
    Симпатии:
    0
    Нормально работает, но выводить в файл всё равно лучше.
    Прг может и работать,только в некоторых элементах может быть ошика, потом их вылавлиы
    ваешь.. как тараканов.

    Где достать номер строки? Былобы красивее.
     
  11. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
  12. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Мне вот этого пока хватает.
    http://code.google.com/p/voltcore/sourc ... r.php?r=50

    tommyangelo
    А идея дебагера там интересна. Одна из немногих интересных идей в этой книге, на мой взгляд.
     
  13. kadet

    kadet Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    79
    Симпатии:
    0
    Появились обновления в дебуггере (см. выше)
    b-версия. Кто заметит баг-сообщайте администрации,)
     
  14. kadet

    kadet Активный пользователь

    С нами с:
    2 авг 2010
    Сообщения:
    79
    Симпатии:
    0
    уже исправил 8)