문제

어떻게 디버깅합니까? PHP 스크립트?

Error Reporting 사용 등 기본적인 디버깅에 대해 알고 있습니다.중단점 디버깅 PHPEclipse 또한 꽤 유용합니다.

이것은 최상의 (빠르고 쉬운 측면에서) phpStorm이나 다른 IDE에서 디버깅하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

노력하다 이클립스 PDT 언급한 디버깅 기능이 있는 Eclipse 환경을 설정합니다.코드를 한 단계씩 실행하는 기능은 var_dump의 이전 방법보다 디버깅하고 다양한 지점에서 인쇄하여 흐름이 잘못된 위치를 확인하는 훨씬 더 좋은 방법입니다.다른 모든 것이 실패하고 내가 가진 것은 SSH와 vim뿐인데도 나는 여전히 var_dump()/die() 코드가 남쪽으로 가는 곳을 찾으려면.

다른 팁

Firephp의 추가 기능인 Firebug를 사용하여 javascript와 동일한 환경에서 PHP를 디버그할 수 있습니다.

나도 사용 X디버그 앞서 PHP 프로파일링에 대해 언급했습니다.

이것은 나의 작은 디버그 환경입니다.

error_reporting(-1);
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'assert_callcack');
set_error_handler('error_handler');
set_exception_handler('exception_handler');
register_shutdown_function('shutdown_handler');

function assert_callcack($file, $line, $message) {
    throw new Customizable_Exception($message, null, $file, $line);
}

function error_handler($errno, $error, $file, $line, $vars) {
    if ($errno === 0 || ($errno & error_reporting()) === 0) {
        return;
    }

    throw new Customizable_Exception($error, $errno, $file, $line);
}

function exception_handler(Exception $e) {
    // Do what ever!
    echo '<pre>', print_r($e, true), '</pre>';
    exit;
}

function shutdown_handler() {
    try {
        if (null !== $error = error_get_last()) {
            throw new Customizable_Exception($error['message'], $error['type'], $error['file'], $error['line']);
        }
    } catch (Exception $e) {
        exception_handler($e);
    }
}

class Customizable_Exception extends Exception {
    public function __construct($message = null, $code = null, $file = null, $line = null) {
        if ($code === null) {
            parent::__construct($message);
        } else {
            parent::__construct($message, $code);
        }
        if ($file !== null) {
            $this->file = $file;
        }
        if ($line !== null) {
            $this->line = $line;
        }
    }
}

강력한 버그 사냥을 위한 Notepad++용 Xdebug 및 DBGp 플러그인, 가벼운 작업을 위한 FirePHP.빠르고 더러운가요?최고의 것은 없습니다 디버그.

XDebug 개발에 필수적입니다.다른 확장 프로그램보다 먼저 설치합니다.모든 오류에 대한 스택 추적을 제공하고 프로파일링을 쉽게 활성화할 수 있습니다.

데이터 구조를 빠르게 살펴보려면 다음을 사용하세요. var_dump().사용하지 마세요 print_r() 왜냐하면 당신은 그것을 둘러싸야 할 것이기 때문입니다. <pre> 한 번에 하나의 var만 인쇄합니다.

<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>

실제 디버깅 환경에서 내가 찾은 최고는 다음과 같습니다. 코모도 IDE 하지만 비용은 $$입니다.

PhpEd는 정말 좋습니다.기능에 들어가거나/끝나거나/들어갈 수 있습니다.임시 코드를 실행하고, 변수를 검사하고, 변수를 변경할 수 있습니다.정말 놀랍습니다.

1) 나는 print_r()을 사용한다.TextMate에는 다음과 같이 확장되는 'pre'에 대한 스니펫이 있습니다.

echo "<pre>";
print_r();
echo "</pre>";

2) Xdebug를 사용하지만 GUI가 Mac에서 제대로 작동하도록 할 수 없습니다.최소한 읽을 수 있는 스택 추적 버전을 인쇄합니다.

나는 젠드 스튜디오 (5.5), 함께 젠드 플랫폼.비록 비용이 들기는 하지만 적절한 디버깅, 코드 중단점/단계 실행 등을 제공합니다.

솔직히 말하면 변수를 인쇄하려면 print와 print_r()을 조합해야 합니다.많은 사람들이 다른 고급 방법을 선호한다는 것을 알고 있지만 이 방법이 사용하기 가장 쉽다고 생각합니다.

나는 Uni에서 마이크로프로세서 프로그래밍을 하고 심지어 이것을 사용할 수 없을 때까지 이것을 완전히 이해하지 못했다고 말할 것입니다.

X디버그, Derick Rethans의 작품은 매우 훌륭합니다.얼마전에 사용해봤는데 설치가 그리 쉽지는 않더라고요.일단 완료하고 나면 그것 없이는 어떻게 관리했는지 이해하지 못할 것입니다 :-)

에 좋은 글이 있습니다 젠드 개발자 존 (Linux에 설치하는 것이 더 쉬워 보이지는 않습니다.) 파이어폭스 플러그인, 나는 결코 사용하지 않았습니다.

XDebug와 함께 Netbeans를 사용합니다.구성 방법에 대한 문서는 해당 웹사이트에서 확인하세요.http://php.netbeans.org/

저는 XDebug와 함께 Netbeans를 사용합니다. 쉬운 XDebug FireFox 애드온

Netbeans에서 XDebug가 실행되는 일반적인 방법은 URL을 통해 dbug 세션을 등록하는 것이기 때문에 MVC 프로젝트를 디버그할 때 추가 기능이 필수적입니다.FireFox에 애드온이 설치된 경우 Netbeans 프로젝트 속성 -> 구성 실행 -> 고급을 설정하고 "웹 브라우저를 열지 않음"을 선택합니다. 이제 중단점을 설정하고 평소처럼 Ctrl-F5를 사용하여 디버깅 세션을 시작할 수 있습니다. .FireFox를 열고 오른쪽 하단에 있는 추가 기능 아이콘을 마우스 오른쪽 버튼으로 클릭하여 중단점 모니터링을 시작합니다.코드가 중단점에 도달하면 중지되며 변수 상태와 호출 스택을 검사할 수 있습니다.

출력 버퍼링은 출력을 엉망으로 만들고 싶지 않은 경우 매우 유용합니다.나는 마음대로 주석을 달거나 주석을 취소할 수 있는 한 줄로 이 작업을 수행합니다.

 ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();

PhpEdit에는 디버거가 내장되어 있지만 일반적으로 echo()를 사용하게 됩니다.그리고 print_r();옛날방식!!

print_r/echo를 사용하여 파악하기에는 시간이 너무 많이 걸리는 정말 까다로운 문제의 경우 IDE(PhpEd) 디버깅 기능을 사용합니다.내가 사용해 본 다른 IDE와 달리 PhpEd는 설정이 거의 필요하지 않습니다.제가 직면한 문제에 대해 이 제품을 사용하지 않는 유일한 이유는 고통스럽게 느린.속도 저하가 PhpEd나 다른 PHP 디버거에만 해당되는지 잘 모르겠습니다.PhpEd는 무료는 아니지만 어쨌든 (앞서 언급한 XDebug와 같은) 오픈 소스 디버거 중 하나를 사용한다고 생각합니다.PhpEd의 장점은 과거에 정말 지루했던 설정이 필요 없다는 것입니다.

수동 디버깅이 일반적으로 더 빠릅니다. var_dump() 그리고 debug_print_backtrace() 논리를 무장하는 데 필요한 모든 도구입니다.

글쎄요, 어느 정도 상황이 남쪽으로 향하는 방향에 따라 다릅니다.그것이 내가 먼저 분리하려고 시도한 것이고, 그런 다음 필요에 따라 echo/print_r()을 사용할 것입니다.

참고:print_r()의 두 번째 인수로 true를 전달할 수 있고 인쇄하는 대신 출력을 반환할 수 있다는 것을 알고 계십니까?예:

echo "<pre>".print_r($var, true)."</pre>";

저는 Rails를 사용할 수 없을 때 CakePHP를 자주 사용합니다.오류를 디버깅하려면 일반적으로 다음을 찾습니다. error.log tmp 폴더에 있는 다음 명령을 사용하여 터미널에 연결합니다.

tail -f app/tmp/logs/error.log

그것은 무슨 일이 일어나고 있는지에 대한 대화 상자를 실행하는 것입니다. 이는 사용할 수 있는 중간 코드에 무언가를 출력하려는 ​​경우 매우 편리합니다.

$this->log('xxxx');

이를 통해 일반적으로 무슨 일이 일어나고 있는지/잘못되었는지에 대한 좋은 아이디어를 얻을 수 있습니다.

print_r( debug_backtrace() );

또는 그런 것 :-)

Komodo IDE는 더 많은 디버깅을 위해 xdebug와 잘 작동합니다.최소한의 구성이 필요합니다.당신에게 필요한 것은 Komodo가 중단점의 코드를 단계별로 실행하기 위해 로컬로 사용할 수 있는 PHP 버전입니다.komodo 프로젝트로 가져온 스크립트가 있는 경우 Java 프로그램 디버깅을 위해 Eclipse 내에서 설정하는 것과 마찬가지로 마우스 클릭으로 중단점을 설정할 수 있습니다.원격 디버깅은 MAC 또는 Linux 데스크톱에 있는 경우 구성하기 매우 쉬운 로컬 디버깅 설정보다 올바르게 작동하도록 하는 것이 확실히 더 까다롭습니다(작업 공간에서 PHP 스크립트로 원격 URL을 매핑해야 할 수도 있음). .

Nusphere는 PHP를 위한 훌륭한 디버거이기도 합니다.Nusphere

코딩 시 수많은 시간을 절약할 수 있는 PHP 디버깅 기술이 많이 있습니다.효과적이고 기본적인 디버깅 기술은 단순히 오류 보고를 활성화하는 것입니다.또 다른 약간 더 발전된 기술은 인쇄 문을 사용하는 것인데, 이는 실제로 화면에 무슨 일이 벌어지고 있는지 표시함으로써 좀 더 파악하기 어려운 버그를 찾아내는 데 도움이 될 수 있습니다.PHPeclipse는 일반적인 구문 오류를 강조 표시할 수 있고 중단점을 설정하기 위해 디버거와 함께 사용할 수 있는 Eclipse 플러그인입니다.

display_errors = Off
error_reporting = E_ALL 
display_errors = On

그리고 또한 사용

error_log();
console_log();

프로덕션 환경에서는 error_log()를 사용하여 서버의 오류 로그에 관련 데이터를 기록합니다.

나는 디버거가 내장된 Eclipse용 zend studio를 사용합니다.xdebug를 사용한 Eclipse pdt 디버깅에 비해 여전히 느립니다.이러한 문제가 해결되기를 바랍니다. 최근 릴리스에 비해 속도가 향상되었지만 여전히 문제를 해결하는 데 2~3초가 걸립니다.zend Firefox 도구 모음을 사용하면 작업이 정말 쉬워집니다(다음 페이지, 현재 페이지 등 디버그).또한 코드를 벤치마킹하고 원형 차트, 실행 시간 등을 제공하는 프로파일러를 제공합니다.

대부분의 버그는 다음과 같은 방법으로 쉽게 찾을 수 있습니다. var_dump몇 가지 주요 변수가 있지만 개발하는 애플리케이션 종류에 따라 분명히 달라집니다.

더 복잡한 알고리즘의 경우 단계/중단점/감시 기능이 매우 유용합니다(필요하지 않은 경우).

PHP DBG

SAPI 모듈로 구현된 대화형 단계별 PHP 디버거는 코드의 기능이나 성능에 영향을 주지 않고 환경을 완벽하게 제어할 수 있습니다.가볍고 강력하며 사용하기 쉬운 PHP 5.4+용 디버깅 플랫폼을 목표로 하며 PHP 5.6과 함께 기본 제공됩니다.

기능은 다음과 같습니다:

  • 단계별 디버깅
  • 유연한 중단점(클래스 메서드, 함수, 파일:라인, 주소, Opcode)
  • 내장된 eval()을 사용하여 PHP에 쉽게 액세스
  • 현재 실행 중인 코드에 쉽게 액세스
  • 유저랜드 API
  • SAPI 불가지론 - 쉽게 통합됨
  • PHP 구성 파일 지원
  • JIT 슈퍼 글로벌스 - 나만의 설정을 해보세요!!
  • 선택적 readline 지원 - 편안한 터미널 작동
  • 원격 디버깅 지원 - 번들로 제공되는 Java GUI
  • 쉬운 조작

스크린샷을 참조하세요:

PHP DBG - Stepthrough Debugging - screenshot

PHP DBG - Stepthrough Debugging - screenshot

홈페이지: http://phpdbg.com/

PHP 오류 - PHP에 대한 오류 보고 개선

이것은 PHP 스크립트를 디버깅하기 위해 라이브러리(실제로는 파일)를 사용하기 매우 쉽습니다.

당신이 해야 할 유일한 일은 아래와 같이 하나의 파일을 포함하는 것입니다(코드의 시작 부분에):

require('php_error.php');
\php_error\reportErrors();

그러면 모든 오류는 역추적, 코드 컨텍스트, 함수 인수, 서버 변수 등과 같은 정보를 제공합니다.예를 들어:

PHP Error | Improve Error Reporting for PHP - screenshot of backtrace PHP Error | Improve Error Reporting for PHP - screenshot of backtrace PHP Error | Improve Error Reporting for PHP - screenshot of backtrace

기능은 다음과 같습니다:

  • 사용하기가 쉽지 않습니다. 단지 하나의 파일일 뿐입니다.
  • 일반 및 ajax 요청에 대해 브라우저에 오류가 표시됩니다.
  • AJAX 요청이 일시 중지되어 자동으로 다시 실행할 수 있습니다.
  • 오류를 최대한 엄격하게 만듭니다(코드 품질을 높이고 성능을 향상시키는 경향이 있음).
  • 전체 스택 추적에 대한 코드 조각
  • 추가 정보 제공(예: 전체 기능 서명)
  • 명백히 잘못된 일부 오류 메시지를 수정합니다.
  • 구문 강조
  • 예뻐 보인다!
  • 맞춤화
  • 수동으로 켜고 끄기
  • 오류 보고 없이 특정 섹션 실행
  • 파일을 무시하면 스택 추적에서 코드 강조 표시를 피할 수 있습니다.
  • 응용 프로그램 파일;오류가 발생하면 우선적으로 처리됩니다!

홈페이지: http://phperror.net/

GitHub: https://github.com/JosephLenton/PHP-오류

내 포크(추가 수정 사항 포함): https://github.com/kenorb-contrib/PHP-Error

DTrace

시스템이 지원하는 경우 DTrace 동적 추적 (OS X에 기본적으로 설치됨) 그리고 PHP는 DTrace 프로브가 활성화된 상태로 컴파일됩니다(--enable-dtrace) 기본적으로 이 명령은 시간 없이 PHP 스크립트를 디버깅하는 데 도움이 될 수 있습니다.

sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'

따라서 다음 별칭이 RC 파일(예: ~/.bashrc, ~/.bash_aliases):

alias trace-php='sudo dtrace -qn "php*:::function-entry { printf(\"%Y: PHP function-entry:\t%s%s%s() in %s:%d\n\", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }"'

기억하기 쉬운 별칭으로 스크립트를 추적할 수 있습니다. trace-php.

여기에 고급 dtrace 스크립트가 있습니다. 다음 위치에 저장하세요. dtruss-php.d, 실행 가능하게 만듭니다(chmod +x dtruss-php.d) 다음을 실행합니다.

#!/usr/sbin/dtrace -Zs
# See: https://github.com/kenorb/dtruss-lamp/blob/master/dtruss-php.d

#pragma D option quiet

php*:::compile-file-entry
{
    printf("%Y: PHP compile-file-entry:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1));
}

php*:::compile-file-return
{
    printf("%Y: PHP compile-file-return:\t%s (%s)\n", walltimestamp, basename(copyinstr(arg0)), basename(copyinstr(arg1)));
}

php*:::error
{
    printf("%Y: PHP error message:\t%s in %s:%d\n", walltimestamp, copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::exception-caught
{
    printf("%Y: PHP exception-caught:\t%s\n", walltimestamp, copyinstr(arg0));
}

php*:::exception-thrown
{
    printf("%Y: PHP exception-thrown:\t%s\n", walltimestamp, copyinstr(arg0));
}

php*:::execute-entry
{
    printf("%Y: PHP execute-entry:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}

php*:::execute-return
{
    printf("%Y: PHP execute-return:\t%s:%d\n", walltimestamp, basename(copyinstr(arg0)), (int)arg1);
}

php*:::function-entry
{
    printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::function-return
{
    printf("%Y: PHP function-return:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2);
}

php*:::request-shutdown
{
    printf("%Y: PHP request-shutdown:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}

php*:::request-startup
{
    printf("%Y, PHP request-startup:\t%s at %s via %s\n", walltimestamp, basename(copyinstr(arg0)), copyinstr(arg1), copyinstr(arg2));
}

홈페이지: 트러스 램프 GitHub에서

간단한 사용법은 다음과 같습니다.

  1. 달리다: sudo dtruss-php.d.
  2. 다른 터미널에서 다음을 실행하세요. php -r "phpinfo();".

이를 테스트하려면 다음을 사용하여 모든 문서 루트로 이동할 수 있습니다. index.php 다음을 통해 PHP 내장 서버를 실행하십시오.

php -S localhost:8080

그 후 다음 사이트에 액세스할 수 있습니다. http://localhost:8080/ (또는 귀하에게 편리한 포트를 선택하십시오).여기에서 일부 페이지에 액세스하여 추적 출력을 확인하세요.

메모:Dtrace는 기본적으로 OS X에서 사용할 수 있으며 Linux에서는 필요할 수도 있습니다. dtrace4linux 아니면 다른 것을 확인해보세요 대안.

보다: PHP와 DTrace 사용 php.net에서


시스템탭

또는 SystemTap SDT 개발 패키지(예: yum install systemtap-sdt-devel).

다음은 예제 스크립트입니다(all_probes.stp) SystemTap을 사용하여 PHP 스크립트를 실행하는 동안 모든 핵심 PHP 정적 프로브 지점을 추적하는 경우:

probe process("sapi/cli/php").provider("php").mark("compile__file__entry") {
    printf("Probe compile__file__entry\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("compile__file__return") {
    printf("Probe compile__file__return\n");
    printf("  compile_file %s\n", user_string($arg1));
    printf("  compile_file_translated %s\n", user_string($arg2));
}
probe process("sapi/cli/php").provider("php").mark("error") {
    printf("Probe error\n");
    printf("  errormsg %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
}
probe process("sapi/cli/php").provider("php").mark("exception__caught") {
    printf("Probe exception__caught\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("exception__thrown") {
    printf("Probe exception__thrown\n");
    printf("  classname %s\n", user_string($arg1));
}
probe process("sapi/cli/php").provider("php").mark("execute__entry") {
    printf("Probe execute__entry\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("execute__return") {
    printf("Probe execute__return\n");
    printf("  request_file %s\n", user_string($arg1));
    printf("  lineno %d\n", $arg2);
}
probe process("sapi/cli/php").provider("php").mark("function__entry") {
    printf("Probe function__entry\n");
    printf("  function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("function__return") {
    printf("Probe function__return: %s\n", user_string($arg1));
    printf(" function_name %s\n", user_string($arg1));
    printf("  request_file %s\n", user_string($arg2));
    printf("  lineno %d\n", $arg3);
    printf("  classname %s\n", user_string($arg4));
    printf("  scope %s\n", user_string($arg5));
}
probe process("sapi/cli/php").provider("php").mark("request__shutdown") {
    printf("Probe request__shutdown\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}
probe process("sapi/cli/php").provider("php").mark("request__startup") {
    printf("Probe request__startup\n");
    printf("  file %s\n", user_string($arg1));
    printf("  request_uri %s\n", user_string($arg2));
    printf("  request_method %s\n", user_string($arg3));
}

용법:

stap -c 'sapi/cli/php test.php' all_probes.stp

보다: PHP DTrace 정적 프로브와 함께 SystemTap 사용 php.net에서

print_r()의 경우 +1입니다.객체나 변수의 내용을 덤프하는 데 사용합니다.더 읽기 쉽게 만들려면 소스를 볼 필요가 없도록 pre 태그를 사용하세요.

echo '<pre>';
print_r($arrayOrObject);

또한 var_dump($thing) - 하위 항목의 유형을 확인하는 데 매우 유용합니다.

문제에 따라 나는 error_reporting(E_ALL)과 에코 테스트의 조합을 좋아합니다(처음에 오류가 발생한 잘못된 줄/파일을 찾기 위해;PHP가 알려주는 줄/파일이 항상 그런 것은 아니라는 사실을 아시죠?), IDE 중괄호 일치("구문 분석 오류 해결을 위해:구문 오류, 예상치 못한 $end" 문제) 및 print_r();출구;덤프(실제 프로그래머는 소스를 봅니다 ;p).

"memory_get_usage (); 및 "memory_get_peak_usage ();" 문제 영역을 찾으려면.

코드를 단계별로 실행하면서 변수 변경 값을 볼 수 있는 통합 디버거는 정말 멋집니다.그러나 서버에는 소프트웨어를 설정하고 클라이언트에는 일정 수준의 구성이 필요합니다.두 가지 모두 올바른 작동 상태를 유지하려면 정기적인 유지 관리가 필요합니다.

print_r은 작성하기 쉽고 어떤 설정에서도 작동이 보장됩니다.

일반적으로 파일에 저장하고, 디버그 정보를 저장하고, 결국 공통 바닥글에 다시 인쇄할 수 있는 사용자 정의 로그 기능을 만드는 것을 발견합니다.

또한 이러한 유형의 디버깅이 반자동화되도록 공통 Exception 클래스를 재정의할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top