XDebug를 이용한 PHP 디버깅 - 4

꽤 오랜 시간이 흘렀네요. -_-;; 솔직히 잊어먹고 있었습니다. 죄송합니다. (__)

이번에 할 것은 전에 예고한대로 서버측 프로그램을 디버깅 하는 리모트 디버깅 방법입니다. 당연히 서버에 설치하는 것부터 합니다.
[code type=console]
# tar zxf xdebug-2.0.0.tgz
# cd xdebug-2.0.0
# phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
# ./configure
# make
[/code]

위의 과정은 간단히, XDebug PHP 모듈을 다운받고 압축을 푼 뒤, 확장 모듈로 만들어 컴파일 하는 것까지다. 위 과정이 끝나면 modules 디렉토리에 xdebug.so 파일이 생성되는데 이것을 PHP 확장모듈이 있는 디렉토리에 복사한다. 보통은 직접 복사하지 않고 make install 만 입력해도 가능하다.
[code type=console]
# make install
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20060613/
[/code]

이제 php.ini 파일을 열어서 다음 줄을 추가하고 웹서버를 재시작한다.

[code type=console]
extension=xdebug.so
[/code]

웹 서버를 재시작하고 나면 phpinfo 화면에서 다음과 같이 XDebug 가 설치되어있음을 볼 수 있다.

xdebug_4_1.png

이제 원격 디버깅에 필요한 설정을 php.ini 파일에 추가할 차례다. 자세한 설정값은 공식 문서를 참고하도록 하고 이 글에서는 간단하게 디버깅 하는 방법을 알아본다.

  • xdebug.remote_enable : 원격 디버깅 사용여부를 정한다. 기본값이 0이라서 비활성화 상태이므로 1로 바꿔서 활성화해주도록 한다.
  • xdebug.remote_host : 개발자의 로컬 IP 를 적는다. 이벤트가 발생했을 때 개발자 PC로 값이 전송되는 구조이므로 정확하게 적어주어야 한다.
  • xdebug.remote_port : 개발자의 로컬 포트를 적는다. 기본값은 9000이다.
  • xdebug.idekey : 원격 디버깅을 실행할 세션값을 정의한다.

간단한 테스트를 위해서 다음과 같이 php.ini 파일 마지막에 추가한 다음 웹서버를 재시작하도록 한다.

[code type=console]
[xdebug]
xdebug.remote_enable=1
xdebug.remote_host=xxx.xxx.xxx.xxx
xdebug.remote_port=9000
xdebug.idekey=debug_session
[/code]
이 중 idekey 에 대해서 자세히 설명하겠다. 만약 개발자가 디버깅을 할 때 모든 세션에 대해서 디버깅을 실시한다면 현재 프로그램일 경우 모든 사용자의 버그가 개발자의 PC로 물밀듯이 몰려와 디버깅을 하기가 힘들 것이다. 따라서, 특정 세션에 대해서만 디버깅을 할 수 있도록 구분할 수 있는 값이 있는데 그 값이 바로 idekey 이다. 원격 디버깅에 대한 기본값은 빈 문자열이기 때문에 누구라도 키만 세팅한다면 바로 디버깅 세션이 동작한다.

디버깅 세션은 XDEBUG_SESSION_START 라는 키로 세팅을 해주므로, 예를 들어 idekey 를 설정하지 않았을 경우에는 다음과 같이 디버깅 세션을 활성화할 수 있다.

[code]
// 디버깅을 사용하지 않는 경우
http://www.server.com/test.php
.
// 디버깅을 사용하는 경우
http://www.server.com/test.php?XDEBUG_SESSION_START
[/code]

하지만 만약 idekey 를 세팅한다면 다음과 같이 입력해야만 디버깅 세션을 활성화 할 수 있다.

[code]
http://www.server.com/test.php?XDEBUG_SESSION_START=idekey
[/code]
...라고 매뉴얼에 나와있으나 어쩐 일인지 idekey를 입력하지 않아도 디버깅이 되버린다(이거 뭐냐...). 이 부분에 대해서는 확인이 필요하다는 무책임한 코멘트만 일단 남겨둔다. XDEBUG_SESSION_START 를 URL에 입력하기 귀찮다면 XDEBUG_SESSION=idekey 와 같은 쿠키를 구워두면 일일이 입력하지 않아도 된다. 다음 문자열을 디버깅할 서버 도메인의 파일을 하나 열어둔 상태에서 주소표시줄에 입력하면 쿠키가 구워지므로 간편하게 사용할 수 있다. 북마클릿으로 만들어두는 것도 하나의 방법이다.
[code]
javascript:void(document.cookie="XDEBUG_SESSION=idekey");
[/code]

이로써 서버측 준비는 거의 완료되었다. 이제 서버에서 보내주는 정보를 수신할 클라이언트 프로그램이 필요한데, XDebug에서 기본으로 제공하는 콘솔 프로그램은 인터페이스가 정말 눈물난다.

xdebug_4_2.png

디버깅 세션이 활성화되면 위와 같이 XML이 날아와서 명령을 내리라고 기다리고 있는데 어쩌란건지 막막하기만 할뿐이다. -_-;; DBGp 라는 디버깅용 프로토콜을 따르고 있으니 하드고어에 도전해보고 싶은 인내심많은 사람은 DBGp 매뉴얼을 보고 시도해보시고 GUI 가 좋다는 사람은 공식 문서에 있는 클라이언트 중에 하나 골라서 사용하거나 .NET 기반으로 제작된 XDebugClient를 이용해보도록 하자.

XDebugClient 를 받아보면 알겠지만 UI는 무척 간단해서 이게 뭐야 싶을 정도이다.

xdebug_4_3.png

일단 클라이언트를 활성화시키고 그 다음에 위에서 말한대로 쿠키를 구워 디버깅 세션을 활성화 시킨 후 디버깅할 URL을 열어보자. 클라이언트는 Debug > Start listening 으로 활성화한다.

디버깅할 파일을 간단히 다음과 같이 코딩해보았다.

[code type=php]
<?php
print_r($_GET);
.
echo "Cookies:<br />";
cookie_print();
.
function cookie_print() {
.foreach($_COOKIE as $key=>$value) {
..echo $key." = ".$value;
..echo "<br />";
.}
.
.undefined_function(); // error here
}
?>
[/code]

이제 웹 브라우저로 이 파일을 실행해보자. 세션과 클라이언트가 모두 활성화 되었다면 프로세스가 종료되지 않고 멈춰있는 것을 알 수 있다(브라우저에서 계속 읽는 중인 상태). 이 때 클라이언트에서 Run (단축키 F5) 명령으로 프로그램을 실행해본다.

xdebug_4_4.png

보다시피 프로그램이 저 지점에서 멈추게 되며, 이 때 변수 Inspect 나 call Stack 을 살펴보는 것이 가능해진다.

xdebug_4_5.png
xdebug_4_6.png
xdebug_4_7.png

XDebugClient 는 간단한 기능만을 가지고 있어서 만족스러운 클라이언트는 아니지만 Eclipse 플러그인인 PDT나 기타 상용 프로그램에서 제공하는 클라이언트는 만족스럽지 않을까 한다. 혹여 그렇지 않더라도 디버깅에 필요한 프로토콜은 이미 구현되어있으므로 클라이언트의 지원은 시간문제일 것이다.

그간 PHP가 다른 언어에 비해 취약한 부분이 바로 이러한 디버깅 부분이었는데 XDebug가 더욱 발전해서 이러한 단점을 보완해줬으면 하는 바람이다.

  1. 강의 잘 봤습니다
    소켓통신으로 원격 디버깅까지을 통해 불러오는것까지는 잘 됬는데 스텝이 멈추질 않습니다
    왜 그럴까요
    참고로 xampp을 설치하진 않았습니다
    php는 4.3.3이고 그 때문에 xdebug는 2.0.2를 설치 했습니다
    마지막에서 무엇이 문제인지 해결을 못하겠네요ㅠㅠ

댓글을 남겨주세요

This site uses Akismet to reduce spam. Learn how your comment data is processed.