xdebug를 써서 라인 디버깅을 하려고 하는데

뭔가 알 수 없는 이유로 자꾸 죽어서 끙끙대고 분석해보니까

이게 eval로 실행되는 코드를 가진 상용 모듈들과 충돌하는 것 같더군요.

코드가 eval로 실행되면 트레이싱을 실패하면서 걍 502로 죽어버리나 봅니다.

xdebug를 꼭 써야 하는데 이걸 좀 극복할만한 방법이 없을까요?

경험 많은 분 있으시면 지도 편달 부탁드립니다

  • profile
    eval으로 된 코드부분을 건너 띄는것도 안되나요?

    예를들어 라인 하나씩 스탭밟아가다가 eval이 실행될때 eval끝난 뒤의 코드라인을 브래이킹 잡아버리고 그 부분을 그냥 바로 실행하는 (그니까 브래이킹 걸린곳까지 알아서 실행하게..) 해버리면 해당 코드는 실행 되면서 같이 넘어갈거라서요..
  • profile ?

    단지 맵핑이 안되서 브레이크를 못잡고 뭐 그런게 아니라
    그냥 그 라인에서 PHP 자체가 에러 종료 되어버립니다... 사이트는 502 뜨구요.

    xdebug 서버에 phpstorm으로 연결했느냐 아니냐가 상관이 없습니다

    그냥 xdebug를 php설정에서 enable하면 그 순간부터 그냥 사이트가 계속 502가 뜨는거지요...

    이게 보통 내 컴퓨터에서 컴파일해서 돌아가는 로컬 개발환경이면 아예 특정 부분의 코드를 실행안되게

    SKIP해서 뛰어넘는 기능이 있는데 xdebug는 그렇게까진 못하더라구요...

  • ? profile
    eval 코드가 암호화 되어있고 어딘가에 통신한다는 전재가 있을까요?

    단순 eval문제라면 라엘님처럼 코드 짯을때 전체적으로 다 그렇게 되어야 할 가능성이 있는데 502 프로토콜은 결국 어딘가 요청 했음에도 늦은 응답이 문제가 되는거라 x debug에서 오랫동안 디버깅 잡고 잇을때에도 심심치않게 자주 보는 현상이긴 합니다.

    eval이 있는 코드에서 xdebug를 켰을때 해당 부분에서 문제가 있다면 암호화를 난독화 하는 과정에서 코드를 xdebug측에서 재대로 잡지 못하고 넘어갈 가능성이 충분합니다.

    그럴땐 그런 코드들을 쓰지 않는게 사실은 더 좋습니다...

    구입하신 상품이라면 디코딩된 버전이 있을테니까 그 구입처에 물어봐야하겠구요.. 직접 짜신거라면 eval 암호화를 푼상태에서 디버깅 하는게 맞구요.
  • profile

    개인적으로 xdebug 를 사용하는 개발자는 중급 이상으로 봅니다.
    xdebug 사용할 줄 아는 PHP개발자는 전체에서 0.1%도 안될겁니다.
    (20년 이상된 개발자도 xdebug 못쓰는 사람이 수두룩 합니다.)

    아무튼 방금 xdebug 에서 확인해봤는데요. 정상적으로 eval 이 됩니다.

    [code php]
    echo "hello";
    eval('echo date("Y-m-d");');
    echo "world";
    [/code]

    위의 코드를 break 걸어서 실행해보셔요.

    만약 그래도 앱이 죽는다면 서버에서 

    xdebug.remote_log 설정을 통해서, 서버쪽 xdebug 실행로그를 확인해보세요.

  • profile profile
    eval하는 내용이 무엇인지에 따라 다르겠지요. 질문자분은 상용 모듈이라고 하셨는데, 그렇다면 eval 안에 들어 있는 코드 분량도 어마어마하게 많을 테고, 소스 구조를 파악하기 어렵도록 일부러 배배 꼬아 놓았을 가능성이 높으니까요. 이런 자료들은 조금이라도 문제가 생기면 디버깅이 불가능에 가깝다고 봐야 합니다.

    xdebug는 내가 갖고 있는 소스를 디버깅하면서 브라우저나 IDE와 연동하는 것이 주 목적이지, 남이 암호화해 놓은 소스를 풀어서 디버깅하라고 있는 툴이 아니기 때문에... 이런 코드를 억지로 떠먹이려고 하면 segfault가 뜨더라도 이상하지 않습니다. 솔직히 평소에 사용하기에는 안정성이 영 떨어지는 확장모듈이기도 하고요.
  • ?

    답변 주신 분들 감사합니다... xdebug를 사용해서 상용모듈을 어떻게 하려는건 아닙니다. 제 소스를 디버깅하려는 것이고 문제는 xdebug를 enable만 해도 그냥 사이트가 502 상태로 빠지는 것이지요. 상용모듈에서 eval()하는 코드는 base64인코딩 되어있고 디코딩해보면 또다시 난독화되어있는 그런 소스 맞습니다.
    이미 해당 상용모듈이 설치되어 있는 상황에서 모듈사용을 disable한다고 하더라도 모듈 코드들 일부의 실행을 막을 수가 없어서 계속 502로 죽어나가는 상황이었습니다.
    문제는 어찌어찌 해결했습니다. 해당 상용모듈을 수정해서 (모든 코드가 암호화된 것은 아니고 모듈 설치하는 class.php 코드는 그냥 오픈되어 있습니다) 트리거 등록을 모두 삭제하고 Controller등은 새로 파일을 만들어서 그냥 속이 텅텅 빈 강정으로 잠시 만들어버렸습니다. 원래 코드는 잠시 파일 이름 바꿔놓구요. 그리고 디버깅 끝내고 원복했습니다. 모듈 uninstall 이 정말 아쉬운 상황이었습니다. 아 근데 언인스톨하면 모듈 설정이 다 날라가버리니까 언인스톨도 해결방법은 아니군요....