'breakpoint'에 해당되는 글 1건

  1. 2009.03.06 PHPEclipse 환경에서 PHP 리모트 디버깅하기 (5)
2009.03.06 15:52

PHPEclipse 환경에서 PHP 리모트 디버깅하기

Zend Studio를 사용하면 서버상에서 돌아가는 php를 리모트 디버깅할 수 있지만, 이넘은 유료인데다가 지금까지 애지중지 사용하고 있는 Eclipse를 버려야한다는 문제가 있어서 - 아무래도 Eclipse가 Zend Studio보다는 내 스타일이다 - 어떻게든 Eclipse 내에서 리모트 디버깅을 시도해보고 있다.

일단 ibm의 developerWorks[링크]에서 증거사진을 발견.

Full PHP browser output

이 환경을 만들기 위해 사용했다는 세팅을 그대로 따라해보았다. 참, 개발환경은 PC(Windows XP)에서 Eclipse 3.1.1을 사용중이며, 웹서버에는 리눅스 Fedora Core 4 위에 apache 2.0.55와 PHP 5.0.5를 깔아서 쓰고 있다.

1. php 구동서버에 디버거모듈 설치

- http://dd.cron.ru/dbg/downloads.php 에서 서버환경에 맞는 .so나 .dll을 받아 설치

- http://dd.cron.ru/dbg/installation.php 의 설명에 따라 phpinfo()에서 아래 화면처럼 with DBG 어쩌구 하는 문장이 나올때까지 삽질 (참고: eAccelerator는 disable시킨 상태였음. 두 모듈은 함께 사용할 수 없다)

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.0.5, Copyright (c) 1998-2004 Zend Technologies
    with eAccelerator v0.9.2a, Copyright (c) 2004-2005 eAccelerator, by eAccelerator
    with DBG v2.11.32, (C) 2000,2005, by Dmitri Dmitrienko

- PHPEclipse에 내장된 디버거 모듈은 DBG가 사용하는 기본포트인 7869가 아니라 10001번 포트를 사용하므로 php.ini 설정을 다음과 같이 수정

extension="/usr/local/php/lib/php/extensions/dbg.so-5.0.3" (위치에 맞게 변경)
[debugger]
debugger.enabled=on
debugger.profiler_enabled=on
debugger.hosts_allow=ALL
;debugger.hosts_deny=ALL
debugger.ports=10001, 10000/16

-재미있는 사실은, 이렇게 10001번 포트를 지정한다고 해도 apache(php)가 10001번에 LISTEN하고 있지 않는다는 사실. DBG 디버거는 소켓 서버가 아니라 소켓 클라이언트로 동작한다. (소켓서버로 동작하는 자바 디버깅 플랫폼과는 정 반대) 조금 뒤에 설치할 PHPEclipse가 PC에서 소켓 서버로 동작하게 된다.

-사정이 이렇다보니, 서버가 IDC에 나가있고 작업시에는 PC에서 VPN 등을 이용해서 서버에 접속하는 식의 네트워크 구성 위에서는 이런 디버깅 방식을 사용하기 어려울 것 같다.

2. PHPEclipse 설치

-[sourceforge 링크] 에서 올해 1월 6일에 나온 PHPEclipse 최신본을 다운로드하여 설치

-새로운 버전을 인식하도록 eclipse를 -clean 옵션을 주어 실행시킴

3. PHP parser 설치

-PHPEclipse는 PHP 파서가 아니므로 PC에서 돌아가는 PHP 파서가 필요

-PHP만 별도로 깔기 귀찮아서 XAMPP 배포본으로 깔아버렸다. apache나 mysql이 PC 켜질때마다 서비스로 뜨면 무거워지니까 서비스로는 설정하지 않았음.

4. PHPEclipse 설정

-자세한 내용은 대충 [링크]를 참조. 앞에 있던 developerWorks의 [링크]에도 관련내용이 들어있다.

-디버깅하고 싶은 PHP파일 내에 breakpoint를 걸어주어야 하는데, 원하는 위치에 debugbreak(); 를 넣어주면 된다. 샘플은 다음과 같음. (안타깝게도 Eclipse 내에서 설정한 breakpoint는 아직 안먹는거 같다)

<?
$i = 0;
$j = 10;
debugbreak();

print("$i + $j = " . ($i + $j));
?>

-다음과 같이 세군데만 설정해주면 된다.

1) Run > Debug를 눌러 새로운 디버깅 항목을 생성. File 항목은 프로젝트에 대한 상대경로로 입력.

 

2) Environment 탭을 눌러 Interpreter에 아까 설치한 PHP 파서의 위치를 잡아줌

3) 가장 중요한 탭은 Environment 아래의 Remote Debug 탭인데, 다음과 같이 설정.

5. 디버깅

-방금 생성한 Debug 항목을 실행시키고 Debug 퍼스펙티브로 전환. 이 상태에서는 PHPEclipse 내의 디버거 모듈이 10001번 포트에 LISTEN하면서 서버가 접속해주기를 기다리게 됨. 다음과 같은 화면 나옴.

-브라우저에 디버깅할 URL을 적고 엔터. http://서버주소/PHP주소?DBGSESSID=1@PC주소:10001. PHP서버는 debugbreak() 문을 만나 실행을 중단하고 제어권을 디버거에게 넘기므로, 브라우저는 출력되는 내용 없이 빈 창을 보여주게 된다.



-그와 동시에, 이클립스 디버거가 동작하며 다음과 같은 화면을 볼 수 있게 된다. 확인결과 step over나 step into같은 기능들도 정상적으로 동작함을 확인할 수 있었다.




6. 마치며

훌륭한 오픈소스 IDE이자 플랫폼인 이클립스에서 PHP의 리모트 디버깅 기능을 사용할 수 있다는건 행운이다. 그러나, 아직 DBG와 PHPEclipse 프로젝트를 결합한 리모트 디버깅은 다음과 같은 한계를 갖고 있다.

-이클립스 IDE 내에서 설정한 breakpoint가 먹지 않는다.

-서버가 PC로 소켓 연결을 맺는 방식이라 방화벽 환경에서는 제대로 돌리기 어려워 보인다. (뭐 서버에 Xwindow 띄워놓고 거기에서 이클립스를 돌린다면야... ^^)

-환경설정하기가 복잡해서, 아예 환경을 구축한 이후라면 모를까 신규환경에서는 차라리 print_r로 찍어보는 편이 속편할것 같다. -_-

그래도, print_r로 일일이 변수값 찍어보면서 디버깅할 수 없다는 자존심을 갖고있는 분들이라면... 조심스럽게 추천 한표 꾹. 아직 실전에서 대놓고 사용할 수 있을 만큼 편하지는 않지만 말이다. ^^


출처 : http://tong.nate.com/heonkyujin/

 

디버깅

PHP로 디버깅을 사용하려면 웹 서버가 디버깅 기호(symbol)를 제공하도록 설정됐어야 하고 디비거가 연결을 할 수 있어야 하고 디버깅 정보를 가져야 하고 실행 흐름을 제어할 수 있어야 한다. 또한 서버에 연결할 수 있는 클라이언트가 있어야 한다. PDT가 바로 그 클라이언트다. 그리고 PDT가 지원하는 디버거 중 하나가 젠드 디버거(Zend Debugger)다. 젠드는 PHP의 주 공헌자고 PDT의 주 공헌자이기도 하다.

젠드 디버거 설치하기

PDT를 위해 젠드 디버거를 설치하는 데 이클립스의 소프트웨어 업데이트 기능을 사용할 수 있다. 이는 이클립스 플러그인으로 PDT를 설치하는 것과 같은 방법을 사용하면 된다. 다른 점은 업데이트 사이트가 http://downloads.zend.com/pdt라는 것 뿐이다.

서버에 젠드 디버거를 설치하려면 몇 가지 단계를 거쳐야 한다. 먼저 다운로드해야 한다(참고자료를 보자). 그리고 나서 이를 PHP 확장 디렉터리에 추가하고 php.ini 파일을 설정하여 확장 기능을 사용할 수 있게 해야 한다(호환되지 않는 확장은 쓸 수 없게 해야 한다). 클라이언트에 실제 디버깅 정보를 제공할 dummy.php라는 스크립트가 함께 딸려올 것이다. 서버를 구성하는 더 자세한 방법은 참고자료를 참조하기 바란다. 두 가지를 모두 갖게 되면 PDT 내에서 디버깅을 할 수 있다.


PDT를 위한 디버깅

PDT에 중단점을 설정하려면 코드에서 한 행을 골라 마우스 오른쪽 버튼을 클릭하고 Toggle Breakpoints를 선택한다.


그림 32. 중단점 지정
중단점 지정

디버깅을 시작하려면 PHP Explorer의 스크립트를 마우스 오른쪽 버튼으로 클릭하고 Debug As > PHP Web Page를 선택한다.


그림 33. PHP 웹 페이지로 디버그하기
PHP 웹 페이지로 디버그하기

바로 PHP Debugging 퍼스펙티브로 전환해야 한다. 아래 그림 같은 디버깅 뷰를 볼 수 있어야 한다.


그림 34. PHP 디버깅 퍼스펙티브
PHP 디버깅 퍼스펙티브

이제 코드 전체를 살펴보고 변수를 검사한다.


그림 35. 로컬 변수 조사하기
로컬 변수 조사하기

자바 개발에 이클립스를 사용한다면 이 모든 것에 익숙할 것이다. 자바 개발에서 사용하는 디버깅 기능 세트와 같기 때문이다. 이는 분명 강력한 디버거로 생산성을 높일 수 있다.

출처 : http://www.ibm.com/developerworks/kr/library/tutorial//os-eclipse-europa2/section7.html


Trackback 0 Comment 5
  1. hnapedro 2009.03.27 12:03 address edit & del reply

    잘읽었습니다.
    그런데, 아래 링크가 안되는군요?

    4. PHPEclipse 설정

    -자세한 내용은 대충 [링크]를 참조. 앞에 있던 developerWorks의 [링크]에도 관련내용이 들어있다.

    • developerWorks 2009.03.30 15:48 address edit & del

      관련 링크주소가 이거 인것 같네요.

      http://www.ibm.com/developerworks/opensource/library/os-debug/

  2. nowdev 2009.04.13 20:17 address edit & del reply

    Eclipse에 Tomcat Server플러그인 설치하기
    http://wiki.javajigi.net/pages/viewpage.action?pageId=165

  3. nam 2009.06.06 23:56 address edit & del reply

    -showsplash
    org.eclipse.platform
    --launcher.XXMaxPermSize=256M
    -framework
    plugins\org.eclipse.osgi_3.4.0.v20080605-1900.jar //이부분은 기존것 사용
    -vmargs
    -Dosgi.requiredJavaVersion=1.5
    -Xverify:none
    -XX:+UseParallelGC
    -XX:PermSize=64M
    -XX:MaxPermSize=128M
    -XX:MaxNewSize=64M
    -XX:NewSize=64M
    -Xms128m
    -Xmx512M

  4. eclipse.ini 2009.06.09 13:39 address edit & del reply

    linux


    -startup
    plugins/org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar
    -showsplash
    org.eclipse.platform
    --launcher.XXMaxPermSize
    256m
    -vmargs
    -Dosgi.requiredJavaVersion=1.5
    -Xmx1024m
    -Xms1024m
    -Xverify:none
    -XX:MaxPermSize=256m
    -XX:+UseParallelGC


    windows


    -showsplash
    org.eclipse.platform
    --launcher.XXMaxPermSize
    256M
    -framework
    plugins\org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar
    -vmargs
    -Dosgi.requiredJavaVersion=1.5
    -Xmx1024m
    -Xms1024m
    -Xverify:none
    -XX:MaxPermSize=256m
    -XX:+UseParallelGC