PHP отладчик XDebug

Подключение и настройка

nano ./xdebug.ini

zend_extension=xdebug.so

[debug]
xdebug.auto_trace=0
xdebug.collect_includes=1
xdebug.collect_params=1
xdebug.collect_return=0
;xdebug.default_enable=1
xdebug.extended_info=1
xdebug.show_local_vars=1
xdebug.show_mem_delta=1
xdebug.max_nesting_level=100
xdebug.cli_color=1
xdebug.scream=0

; Limits
xdebug.var_display_max_depth = 5; -1 No limit
xdebug.var_display_max_children = 256; -1 No limit
xdebug.var_display_max_data = 1024; -1 No limit

; trace
xdebug.trace_format=0
xdebug.trace_output_dir= "/var/log/php5-fpm/php-fpm-xdebug-trace"
xdebug.trace_options=0
xdebug.trace_output_name=timestamp

; debugger settings
xdebug.remote_autostart=0; 1 - Не требует XDEBUG_SESSION = xdebug в параметрах или куках, 0 - требует
xdebug.remote_enable=1
xdebug.remote_connect_back = 1
xdebug.remote_handler=dbgp
xdebug.remote_host=127.0.0.1; - отладка на локальной машине
xdebug.remote_host=192.168.1.6; - отладка на удаленной машине
xdebug.remote_mode=req
;xdebug.remote_mode = JIT
xdebug.remote_port=9000
xdebug.remote_log="/var/log/php5-fpm/php-fpm-xdebug-remote"
xdebug.idekey=xdebug

; profiler settings
xdebug.profiler_append=0
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir= "/var/log/php5-fpm/php-fpm-xdebug-profiler"
xdebug.profiler_output_name=profile.out

; Request
;xdebug.dump.GET=*
;xdebug.dump.REQUEST =*
;xdebug.dump.SERVER=HTTP_HOST, SERVER_NAME
  • xdebug.remote_autostart
  • xdebug.remote_host
  • xdebug.var_display_max_depth = 5; -1 No limit
  • xdebug.var_display_max_children = 256; -1 No limit
  • xdebug.var_display_max_data = 1024; -1 No limit
XDEBUG_SESSION_START=xdebug
XDEBUG_SESSION=xdebug
$ export PHP_IDE_CONFIG="serverName=www.host-name.ztc" && export XDEBUG_CONFIG="remote_host=192.168.1.6 idekey=xdebug" && php7.0 ./yii

Где:

  • PHP_IDE_CONFIG - Наименование сервера из "Settings / Preferences | Languages & Frameworks | PHP | Servers"
    • Так-же желательно установить маппирование путей (локальных и на удаленном сервере)
  • XDEBUG_CONFIG
    • remote_host - IP Хоста, производящего отладку
    • idekey - Ключ, устанавливаемый в списке серверов "Settings / Preferences | Languages & Frameworks | PHP | Servers", "Ide key(session id)"

Хелпер для более одного отладчика

Если на сервере стоит более одного отладчика и в консоли по умолчанию, те в php.ini найденой по php -i, стоит другой отладчик в параметре zend_extension.

nano ~./.bashsrc

function phpx(){
export PHP_INI_SCAN_DIR=/etc/php5/cli-xdebug/conf.d && php -c /etc/php5/cli-xdebug/php.ini -q "$@";
}

и далее вызываем наш скрипт

phpx sample.php

  • apt-get install php5-xdebug
  • cd /opt
  • mkdir pydbgpproxy
  • cd pydbgpproxy
  • wget https://github.com/Mirocow/pydbgpproxy/archive/master.zip ./ - Установить прокси (Python Remote Debugging Client)
  • unzip master.zip ./
  • echo "export PYTHONPATH=\${PYTHONPATH}:/opt/bin/pydbgpproxy/pythonlib" » ~/.bashrc
  • ln -s $(pwd)/pydbgpproxy /usr/local/bin/pydbgpproxy
  • запустить /usr/loca/bin/pydbgpproxy -i 0.0.0.0:9001 -d 9000
  • Установить уникальный ключ для хоста.

  • Зарегистрировать на сервере

nano ./xdebug.ini

; configuration for php xdebug module
; priority=20
zend_extension=xdebug.so

[debug]
xdebug.auto_trace=0
xdebug.collect_includes=1
xdebug.collect_params=1
xdebug.collect_return=0
;xdebug.default_enable=1
xdebug.extended_info=1
xdebug.show_local_vars=1
xdebug.show_mem_delta=1
xdebug.max_nesting_level=100

; trace
xdebug.trace_format=0
xdebug.trace_output_dir= "/var/log/php5-fpm/php-fpm-xdebug-trace"
xdebug.trace_options=0
xdebug.trace_output_name=timestamp

; debugger settings
xdebug.remote_autostart=0; 1 - Не требует XDEBUG_SESSION = xdebug в параметрах или куках, 0 - требует
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
;xdebug.remote_mode = JIT
xdebug.remote_port=9000
xdebug.remote_log="/var/log/php5-fpm/php-fpm-xdebug-remote"

; profiler settings
xdebug.profiler_append=0
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir= "/var/log/php5-fpm/php-fpm-xdebug-profiler"
xdebug.profiler_output_name=profile.out

Скрипт загрузки

nano /etc/init.d/pydbgpproxy.sh

#! /bin/sh
### BEGIN INIT INFO
# Provides:          Python Remote Debugging Client
# Required-Start:    $remote_fs dbus udev
# Required-Stop:     $remote_fs dbus udev
# Should-Start:      $syslog
# Should-Stop:       $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Python Remote Debugging Client
# Description:       Python Remote Debugging Client.
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="Python Remote Debugging Client"
NAME="pydbgpproxy"
DAEMON=/usr/local/bin/pydbgpproxy
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/pydbgpproxy.sh
DAEMON_OPTS="-i 0.0.0.0:9001 -d 9000"
DAEMON_LOG=/var/log/$NAME.log


# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

. /lib/lsb/init-functions

test -f /etc/default/pydbgpproxy && . /etc/default/pydbgpproxy

#
#       Function that starts the daemon/service.
# --background
d_start() {
        start-stop-daemon --oknodo --make-pidfile --start --quiet --pidfile $PIDFILE \
                --exec $DAEMON -- $DAEMON_OPTS 1>$DAEMON_LOG 2>&1 &
        return "$?"
}

#
#       Function that stops the daemon/service.
#
d_stop() {
        start-stop-daemon --stop --quiet --pidfile $PIDFILE
        return "$?"
}


case "$1" in
  start)
        if [ -f $PIDFILE ]; then
                echo "$NAME is running."
                exit 0
        fi
        log_daemon_msg "Starting $DESC" "$NAME"
        d_start
        case "$?" in
                0) log_end_msg 0 ;;
                1) log_progress_msg "already started"
                   log_end_msg 0 ;;
                *) log_end_msg 1 ;;
        esac
        ;;
  stop)
        log_daemon_msg "Stopping $DESC" "$NAME"
        d_stop
        case "$?" in
                0) log_end_msg 0 ;;
                1) log_progress_msg "already stopped"
                   log_end_msg 0 ;;
                *) log_end_msg 1 ;;
        esac
        if [ -f $PIDFILE ]; then
                rm $PIDFILE
        fi
        ;;
  restart|force-reload)
        $0 stop
        $0 start
        ;;
  status)
        status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $?
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}" >&2
        exit 1
        ;;
esac

exit 0
# chmod 775 /etc/init.d/pydbgpproxy.sh
# chkconfig pydbgpproxy.sh on

Запуск в коде

ini_set('xdebug.profiler_enable', 1);
xdebug_enable();
xdebug_disable();
<?php
    xdebug_start_code_coverage();

    function a($a) {
        echo $a * 2.5;
    }

    function b($count) {
        for ($i = 0; $i < $count; $i++) {
            a($i + 0.17);
        }
    }

    b(6);
    b(10);

    var_dump(xdebug_get_code_coverage());
?>

Подробнее