XDebug를 이용한 PHP 디버깅 – 2

기본기능 (link)

우선 간단한 기본 기능부터 살펴보도록 하겠습니다. 기본기능은 http://xdebug.org/docs/basic 의 문서를 참고로 작성했습니다. 각 함수에 대한 레퍼런스는 관련 링크를 참고하시기 바랍니다.
테스트할 debug.php 파일을 작성합니다.

function sample($str) {
  echo 'Called @ '.
    xdebug_call_file().
    ':'.
    xdebug_call_line().
    ' from '.
    xdebug_call_function();
}

$ret = sample(array('Derik'));

브라우저에서 실행한 결과는 다음과 같습니다.

Called @ C:\Program Files\xampplite\htdocs\debug.php:11 from {main}

자 이번엔 debug2.php 파일을 작성해보겠습니다.

include 'debug.php';

function caller_sample($str) {
  sample($str);
}

echo "
"; sample('gony'); echo "
"; caller_sample('taegon'); ?>
Called @ C:\Program Files\xampplite\htdocs\debug.php:11 from {}
Called @ C:\Program Files\xampplite\htdocs\debug2.php:5 from {main}
Called @ C:\Program Files\xampplite\htdocs\debug2.php:5 from caller_sample

예제만 봐도 이해가 되죠? ^^ 어느 파일에서, 몇번째 라인에서, 어떤 클래스 혹은 어떤 함수가 해당 함수를 호출했는지 찾아낼 수 있는 기능입니다. 그 외에는 메모리 사용량을 알아볼 수 있는 xdebug_memory_usage() 와 최대 순간 메모리 사용량을 알아볼 수 있는 xdebug_peak_memory_usage() 등이 유용합니다. xdebug_time_index() 를 이용하면 실행 경과 시간을 체크하기에도 용이합니다.

변수 표시 (link)

기본 내장함수인 print_r() 과 비슷하지만 더 상세하게 보여줍니다. 또한 XDebug 모듈을 사용하면 var_dump() 함수가 xdebug_var_dump() 로 대체됩니다. 다음 클래스를 가지고 print_r() 을 실행한 결과와 xdebug_var_dump() 를 실행한 결과를 보면 확실히 xdebug 쪽이 조금 더 자세한 것을 알 수 있습니다.

class sampleClass {
  private $prop = 1;

  function __construct() {

  }

  public function test($str) {
    sample($str);
  }
}

$who = new sampleClass();

print_r($who);
xdebug_var_dump($who);
caller_class Object (     [prop:private] => 1 )

object(caller_class)[1]
.private 'prop' => int 1

또한, xdebug_var_dump() 는 기본으로 HTML 로 출력하기 때문에 웹 브라우저 상에서 바로 확인하기 좋습니다. 이 외에도 객체간의 참조 형태를 알아볼 수 있는 xdebug_debug_zval() 등이 유용합니다.

스택 추적=Stack trace (link)

상당히 유용한 기능중에 하나입니다. 오류가 발생했을 때, Stack 을 추적해서 오류 내용을 상세하게 보고해줍니다. 각종 설정으로 오류 발생시의 보고 수준을 정할 수 있고, xdebug_get_function_stack() 함수를 이용하면 함수의 스택에 대한 정보를 얻을 수 있습니다. 또한, xdebug_get_declared_vars() 를 이용하면 정의되었으나 사용하지 않는 변수를 찾을 수도 있습니다.

xdebug05.png

xdebug06.png

위 이미지는 기본값으로 실행했을 때의 결과이고, 아래 이미지는 php.ini 파일의 xdebug.dump.SERVER 설정을 “REQUEST_URI,SCRIPT_NAME” 로 했을 때의 결과입니다. 나머지 설정값에 대해서는 링크의 매뉴얼을 참고하세요.

함수 추적=Function Trace (link)

함수의 실행 기록을 추적하도록 한다. 별도의 파일로 출력되므로 출력할 파일의 경로를 지정해주어야 하는데 php.ini 에서 xdebug.trace_output_dir 을 정의해주면 된다. 아래는 출력 결과물의 예시이다.

xdebug07.png

기본 설정을 이용하면 파일 한 개당 하나의 로그가 남으므로 몇번을 실행하더라도 한 스크립트 파일당 하나의 로그만 생기며 아파치처럼 로그가 추가되지도 않습니다. 로그를 계속 쌓이게 하고 싶으면 xdebug.trace_options의 값을 1로 설정합니다. 덧붙여서, trace log 파일이 기본적으로 trace.CRC코드.xt 로 저장되므로 이를 좀 더 보기 편하게 바꾸고 싶다면 xdebug.trace_output_name 옵션을 설정해주면 됩니다. 상세한 값은 링크된 매뉴얼을 참고하세요.

함수 추적은 코드 내에 함수 추적을 시작시키는 xdebug_start_trace() 함수를 실행하지 않으면 시행되지 않습니다. 만약 프로그램이 시작함과 동시에 함수 추적을 하고 싶다면 xdebug.auto_trace 의 값을 On 으로 설정합니다. 추적을 멈출 때는 xdebug_stop_trace() 를 실행합니다.

코드 적용범위 분석(link)

솔직히 이게 왜 필요할까… 싶은 기능입니다. -_-;; 실제로 적용되는 코드의 라인 번호를 배열로 반환해주는데, 코드상에서 의미없는 영역 – 예를 들면 주석이나 빈 라인 등 – 은 이 번호에서 제외됩니다. 당연히 HTML 도 PHP 코드가 아니므로 적용범위에 포함되지 않지만 <img xsrc=”<?=$img_link?>” mce_src=”<?=$img_link?>” > 등과 같이 쓰인 것은 포함됩니다.

그럼 다음에는 프로파일링을 이용하는 방법에 대해서 알아보겠습니다. ^^

주의! 이 글은 전체의 절반 이하의 일부 복제만 허용합니다.

  1. 코드 적용범위 분석은 단위 테스트의 코드 커버리지 측정을 위해 필요한 것으로 압니다.
    PHPUnit 에 XDebug를 사용해서 단위 테스트 코드 커버리지를 측정합니다.

Leave a Reply