PHPDBG는 코드 수정이나 성능에 영향을 주지 않고 PHP 운영 환경을 제어할 수 있는 PHP SAPI 모듈입니다.
PHPDBG는 가볍고 강력하며 사용하기 쉬운 PHP 디버깅 플랫폼을 목표로 합니다. PHP5.4 이상에서 사용할 수 있습니다. php5.6 이상 버전에서는 내부적으로 통합됩니다.
주요 기능:
– 단일 단계 디버깅
– 유연한 중단점 방법(클래스 메서드, 함수, 파일: 라인, 메모리 주소, opcode)
– PHP의 eval을 직접 호출할 수 있습니다
– 현재 실행중인 코드를 볼 수 있습니다
– 사용자 공간 API(사용자 영역/사용자 공간)
– 간편한 통합
– 지정된 PHP 구성 파일 지원
– JIT 전역 변수
– readline 지원(선택 사항), 터미널 작동이 더욱 편리해졌습니다
– Java GUI를 사용한 원격 디버깅
– 간편한 작동(자세한 내용은 도움말 참조)
설치
phpdgb를 사용하려면 먼저 PHP 소스 코드 패키지를 다운로드해야 합니다. 그런 다음 phpdgb의 소스 코드 패키지를 다운로드하여 php 소스 코드 패키지의 sapi 디렉터리에 넣습니다. 마지막으로 설치 명령을 실행할 수 있습니다. 컴파일 및 설치 예시는 다음과 같습니다.
php의 소스 코드 패키지를 다운로드하여 /home/php 디렉토리에 저장했다고 가정합니다.
#cd /home/php/sapi #git clone https://github.com/krakjoe/phpdbg #cd ../ #./buildconf --force #./config.nice #make -j8 #make install-phpdbg
참고:
1. PHP 버전이 php5.6 이상인 경우 phpdbg가 php 코드 패키지에 통합되어 있으므로 별도로 다운로드할 필요가 없습니다.
2. 컴파일 매개변수에 –enable-phpdbg를 추가하는 것을 잊지 마세요.
3. 컴파일 시간 매개변수인 –with-readline을 선택적으로 추가할 수 있습니다. 추가하지 않으시면 phpdbg의 히스토리 및 기타 기능을 사용할 수 없습니다.
기본 사용법
1. 매개변수 소개
phpdbg는 명령줄에서 PHP를 디버깅할 수 있는 PHP의 sapi입니다. 일반적으로 사용되는 매개변수는 다음과 같습니다.
다음 스위치가 구현됩니다(cli SAPI와 마찬가지로).
-n php ini 무시
-c 경로에서 php ini 검색
-z zend 확장 로드
-d php ini 항목 정의
다음 스위치는 phpdbg의 기본 동작을 변경합니다.
-v는 조용함을 비활성화합니다
-s 스테핑 활성화
-e 실행 컨텍스트를 설정합니다
-b 지루함 – 콘솔에서 색상 사용을 비활성화합니다
-.phpdbginit(기본 초기화 파일)을 무시합니다
-i .phpgdbinit 위치를 재정의합니다(-I를 의미함)
-O oplog 출력 파일 설정
-q 시작 시 배너를 인쇄하지 않습니다
-r 바로 뛰어서 달려갑니다
-E eval()을 통해 단계 활성화
참고: -rr을 전달하면 실행 후 콘솔로 돌아가지 않고 phpdbg가 종료됩니다
2. 공통 기능
이전에 gdb 도구를 소개했습니다. 실제로 phpdbg와 gdb의 기능은 어떤 곳에서는 매우 유사합니다. 예를 들어 중단점 설정, 단계별 실행 등을 수행할 수 있습니다. 단지 디버깅 언어가 다를 뿐입니다. Gdb는 c 또는 c 언어 디버깅에 중점을 두는 반면, phpdbg는 PHP 언어 디버깅에 중점을 둡니다. 아래에서는 phpdbg의 몇 가지 일반적인 디버깅 기능을 소개합니다. 디버깅할 코드는 다음과 같습니다.
test_phpdbg_inc.php 파일의 소스코드는 다음과 같습니다.
<?php function phpdbg_inc_func() { echo "phpdbg_inc_func \n"; } ?>
test_phpdgb.php 파일의 소스코드는 다음과 같습니다.
<?php include(dirname(__FILE__)."/test_phpdbg_inc.php"); class demo{ public function __construct(){ echo __METHOD__.":".__LINE__."\n"; } public function func($param){ $param++; echo "method func $param\n"; } public function __destruct(){ echo __METHOD__.":".__LINE__."\n"; } } function func(){ $param = "ali"; $param = $param + "baba"; echo "function func $param\n"; } $demo = new demo(); $demo->func(1); func(); phpdbg_inc_func(); ?>
3.phpdbg를 시작하세요
phpdbg가 성공적으로 설치되면 설치 디렉터리의 bin 디렉터리에 위치하게 됩니다. bin 디렉토리에 들어가서 phpdbg를 직접 입력해 보세요. 다음과 같습니다:
#phpdeg [Welcome to phpdbg, the interactive PHP debugger, v0.4.0] To get help using phpdbg type "help" and press enter [Please report bugs to <http://github.com/krakjoe/phpdbg/issues>] prompt>
디버깅할 PHP 스크립트를 로드하려면 exec 명령을 실행하면 됩니다. 다음과 같습니다:
#phpdbg ...... prompt> exec ./test_phpdbg.php
물론 phpdbg를 시작할 때 e 매개변수를 지정할 수도 있습니다. 다음과 같습니다:
#phpdbg -e ./test_phpdbg.php
4. 도움말 정보 보기
이전에 다른 디버깅 도구를 사용해 본 적이 있다면 phpdbg가 그 도구와 유사하다는 것을 알게 될 것입니다. 그러나 처음 사용할 때에도 도움말 정보를 얻어야 하는 경우가 많습니다. help 명령을 통해 도움말 정보를 얻을 수 있습니다.
...... prompt> help phpdbg is a lightweight, powerful and easy to use debugging platform for PHP5.4+ It supports the following commands: Information list list PHP source ......
5. 중단점 설정
중단점을 설정하는 명령은 gdb와 동일합니다. 모두 break 이고 약어는 b 입니다. 그러나 특정 명령 매개변수는 여전히 다릅니다. gdb의 중단점 명령과 유사하게 "파일 이름: 줄 번호" 또는 줄 번호별로 중단점을 설정할 수 있습니다. 또한 phpdbg는 PHP와 관련된 중단점을 설정하는 몇 가지 방법도 제공합니다. 예를 들어, opline을 기반으로 중단점을 설정하고, opcode를 기반으로 중단점을 설정합니다.
우리 모두 알고 있듯이 PHP 코드는 결국 opcode로 구문 분석된 후 PHP 커널에 의해 하나씩 실행됩니다. PHP 문은 여러 opcode로 구문 분석될 수 있습니다. Opcode별로 중단점을 설정할 수 있으면 프로그램 실행 프로세스를 더 정확하게 추적할 수 있습니다. phapdbg를 사용하여 중단점을 설정하는 구체적인 예를 살펴보겠습니다.
오프라인별로 중단점 설정:
여기서 언급된 opline은 메소드 입구부터 시작하는 현재 코드의 줄 번호입니다. 예를 들어, test_phpdgb.php 파일에서 18행의 "$param = $param "baba";" 코드의 opline은 2입니다.
...... prompt> b func#2 prompt> r demo::__construct:5 method func 2 [Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)] [Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)] [Breakpoint #0 resolved at func#2 (opline 0x7f5b230a2e38)] [Breakpoint #0 in func()#2 at ./test_phpdbg.php:18, hits: 1] >00018: $param = $param + "baba"; 00019: echo "function func $param\n";; 00020: } ......
6. 중단점 보기
gdb와 마찬가지로 phpdbg도 info break 명령을 사용하여 중단점을 확인합니다. 예시는 다음과 같습니다.
.... prompt> info break ------------------------------------------------ File Breakpoints: #1 /home/hailong.xhl/test_phpdbg.php:10 ------------------------------------------------ Opline Breakpoints: #0 7ff3219e1df0 (function breakpoint) ------------------------------------------------ Function opline Breakpoints: #0 func opline 2 ....
通过上面的显示,我们可以知道。info break的显示结果中会把断点的类型也给显示出来。#后面的数字是断点号。我们可以根据断点号删除断点。
7、删除断点
和gdb命令不一样。phpdbg的删除断点不是delete命令,而是break del 命令。示例如下:
...... prompt> break del 1 [Deleted breakpoint #1] prompt> ......
break del 后面的数字1就是断点号。
8、查看代码
phpdbg查看代码的命令也是list。但是和gdb相比,使用的方式更多样一些。
显示指定函数的代码:
...... prompt> l f func 00017: $param = "ali"; 00018: $param = $param + "baba"; 00019: echo "function func $param\n";; 00020: } 00021: prompt> ......
单步执行
phpdbg的单步执行只有一个命令 step。和gdb的step命令差不多。都是一行一行的执行代码。注意,phpdbg是没有next命令的。
.... prompt> s [Breakpoint #0 resolved at func#2 (opline 0x152ba40)] [L19 0x152ba70 ZEND_ADD_STRING C2 @0 ./test_phpdbg.php] >00019: echo "function func $param\n";; 00020: } 00021: ....
继续执行
和gdb一样,phpdbg的继续执行命令也是continue,简写形式为c。
执行php代码
这个是phpdbg的一个特色。可以在调试的过程中使用ev命令执行任意的php代码。如:
...... prompt> ev $var = "val"; val prompt> ev var_dump($var); string(3) "val" ......
可以通过这种方式,在调试过程中动态的修改变量值,查看执行效果。
以上就是本文的全部内容,轻松玩转调试利器PHPDBG,希望大家喜欢。