PHP 스크립트를 어떻게 디버깅합니까? [닫은]


403

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

오류보고 사용과 같은 기본 디버깅을 알고 있습니다. PHPEclipse 의 중단 점 디버깅 도 매우 유용합니다.

phpStorm 또는 다른 IDE에서 디버깅 하는 가장 빠르고 쉬운 방법은 무엇입니까?




40
나는 이것이 큰 질문이라고 믿는다! PHP 디버깅에 접근하는 방법을 모른다면 질문을하는 방법조차 알지 못하고 이보다 더 정확한 방법을 모릅니다. 따라서 스택의 규칙을 준수하지 않을 수도 있지만 초보자, 초보자에게 많은 도움이 될 것입니다.
Mihaela

1
php5.4부터 phpdbg ( phpdbg.com ) 라는 새로운 명령 행 인터페이스 디버거가 도입되었습니다 . PHP5.6은 기본 phpdbg와 함께 제공됩니다.
Ganesh Patil

1
XDebug에 대해 들어 본 적이 있습니까? :)
Pratik

답변:


145

언급 한 디버깅 기능이있는 Eclipse 환경을 설정하려면 Eclipse PDT 를 사용해보십시오 . 코드로 들어가는 기능은 이전의 var_dump 메소드를 디버깅하고 다양한 지점에서 인쇄하여 흐름이 잘못되는 위치를 확인하는 훨씬 좋은 방법입니다. 모든 사람은 비록 실패하고 내가 가진 모든 SSH 내가 여전히 정력 때 var_dump()/ die()코드가 남쪽 어디로 찾을 수 있습니다.


35
이 함수를 사용해야합니다. kill ($ data) {die (var_dump ($ data)); } 그것은 10자를 입력하는 것을 저장하고, 내가 tbh를 쓴 최고의 기능 :)
AlexMorley-Finch


2
"var_dump"를 아름답게하는 방법이 있습니까?
RPDeshaies

6
@ AlexMorley-Finch 나는 당신을 제기합니다kill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; }
Francisco Presencia

2
링크는 놀라운 웹 아카이브 를 통해 "복구 가능" 하며, 7 월 15 일 현재 마지막 확인은 '15 일 수 있습니다.
Gruber

80

Firephp 애드온을 사용하여 자바 스크립트와 동일한 환경에서 PHP를 디버깅하기위한 firebug를 사용할 수 있습니다.

또한 앞에서 언급 한 PHP 프로파일 링을 위해 Xdebug 를 사용 합니다.



38

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

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;
        }
    }
}

2
감사합니다. 그것은 나의 하루를 구했다. (방금 E_STRICT를 제거해야했습니다.)
Sec

4
assert_callcackheh
Madbreaks

32

Xdebug 및 강력한 버그 사냥을위한 메모장 ++ 용 DBGp 플러그인, 가벼운 것들을위한 FirePHP. 빠르고 더러운? 아무것도 dBug를 이길 수 없습니다 .


DBGp 플러그인은 현재 버전의 notepad ++ / xdebug에서 작동하지 않으며이를 해결할 계획이 없습니다. 여기
Joe

26

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

데이터 구조를 간단히 살펴 보려면 사용하십시오 var_dump(). print_r()당신은 그것을 둘러싸 야하고 <pre>한 번에 하나의 var 만 인쇄 하기 때문에 사용하지 마십시오 .

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

실제 디버깅 환경에서 내가 찾은 최고는 Komodo IDE 이지만 $$입니다.


19

PhpEd는 정말 좋습니다. 기능을 시작 / 종료 / 종료 할 수 있습니다. 임시 코드를 실행하고 변수를 검사하고 변수를 변경할 수 있습니다. 놀랍습니다.


4
PhpEd를 사용했으며 NetBeans 또는 Eclipse와 같은 실제 IDE와 비교할 때 친절한 말이 없으며이 의견이 질문에 유용한 것을 추가하지도 않습니다. -1
siliconrockstar

PhpED Professional을 구매하기 전에 대부분의 IDE (Zend, NetBeans 및 Eclipse 포함)를 사용해 보았습니다. 몇 년 전이어서 다른 것들도 개선되었을 지 모르지만 당시에는 대부분 Java로 작성 되었기 때문에 고통스럽게 느 렸습니다. 나는 (나를 위해) 그것이 가장 분명했을 때, 누군가가 "그것에 대해 친절한 말을 할 수없는"방법을 이해하지 못한다.
lm713

17

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

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

2) Xdebug를 사용하지만 Mac에서 GUI가 제대로 작동하지 못했습니다. 최소한 읽기 가능한 버전의 스택 추적을 인쇄합니다.


echo "</ pre>"를 의미한다고 확신합니다. 그러나 결국.
altermativ

9
함수에 'true'를 전달하여 문자열을 반환 할 수도 있습니다. 그것은 당신이 이것을 할 수 있다는 것을 의미합니다 :echo '<pre>', print_r($var, true), '</pre>';
DisgruntledGoat


16

정직하게, 변수를 인쇄하기 위해 print와 print_r ()의 조합. 많은 사람들이 다른 고급 방법을 선호하지만 이것이 가장 사용하기 쉬운 방법이라는 것을 알고 있습니다.

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


print_r뿐만 아니라 print를 언급하게되어 기쁩니다. 기본 인쇄를 사용하여 코드가 특정 지점에서 실행되는지 확인하여 문제를 해결하는 데 도움이됩니다.
Brad

print와 var_dump ()를 모두 사용합니다. print를 사용하여 디버그 메시지와 정보를 표시하고 var_dump는 상황이 진행됨에 따라 변수의 상태를 나타냅니다.
Joshua K

14

Derick Rethans의 Xdebug 는 매우 좋습니다. 얼마 전에 사용했는데 설치가 쉽지 않은 것으로 나타났습니다. 당신이 완료되면, 당신은 그것없이 관리 방법을 이해하지 못할 것입니다 :-)

Zend Developer Zone 에 대한 좋은 기사 (Linux에 설치하는 것이 더 쉬운 것처럼 보이지는 않습니다)와 Firefox 플러그인 도 있습니다.


2
그것은 실망스럽게 설치하는 것이 아닙니다. Eclipse에서 작동하도록 Xdebug를 구성하는 것은 악몽 일 수 있습니다. CentOS 5에 Xdebug를 설치할 수 있었지만 EclipsePDT + Xdebug는 협력하고 싶지 않습니다 :(
Jahangir


11

XDebug 및 Easy XDebug FireFox 애드온 과 함께 Netbeans를 사용 합니다.

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



9

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


8

print_r / echo를 사용하여 IDE의 (PhpEd) 디버깅 기능을 사용하는 데 너무 많은 시간이 걸리는 매우 거친 문제의 경우. 필자가 사용한 다른 IDE와 달리 PhpEd는 설정이 거의 필요하지 않습니다. 내가 직면 한 문제에 대해 사용하지 않는 유일한 이유는 고통스럽게 느리기 때문입니다. 속도가 PhpEd 또는 PHP 디버거와 관련이 있는지 확실하지 않습니다. PhpEd는 무료가 아니지만 어쨌든 오픈 소스 디버거 중 하나 (예 : XDebug와 같은)를 사용한다고 생각합니다. PhpEd의 장점은 과거에 실제로 매우 지루한 설정이 필요 없다는 것입니다.


2
PHPEd 디버거는 실제로 PHPEd를 작성한 동일한 사람이 작성했으며 오픈 소스가 아니라고 확신합니다. 적어도 PHPEd는 소스와 함께 제공되지 않고 대신 .so와 .dll을 컴파일합니다.
Artem Russakovskii 2019 년

4

수동 디버깅은 일반적으로 빨리 나를 위해입니다 - var_dump()그리고 debug_print_backtrace()당신이 당신의 논리를 무장하는 데 필요한 모든 도구이다.


3

글쎄, 어느 정도는 남쪽으로가는 곳에 달려 있습니다. 이것이 가장 먼저 분리하려고 한 다음 필요에 따라 echo / print_r ()을 사용합니다.

NB : print_r ()에 두 번째 인수로 true를 전달할 수 있고 출력하는 대신 출력을 반환한다는 것을 알고 있습니까? 예 :

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

2
방금 디버그라는 함수로 래핑했습니다. 그런 다음 debug ($ var);
jdelator

3

Rails가 불가능할 때 종종 CakePHP를 사용합니다. 오류를 디버깅하려면 일반적으로 error.logtmp 폴더에서을 찾아 터미널에서 명령으로 마무리하십시오 ...

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

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

$this->log('xxxx');

이것은 일반적으로 무슨 일이 일어나고 있는지에 대한 좋은 아이디어를 줄 수 있습니다.



2

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



2

코딩 할 때 수많은 시간을 절약 할 수있는 많은 PHP 디버깅 기술이 있습니다. 효과적이지만 기본적인 디버깅 기술은 단순히 오류보고를 설정하는 것입니다. 약간 더 발전된 또 다른 기술은 print 문을 사용하는 것인데, 실제로는 화면에 실제로 진행되고있는 것을 표시하여 더 어려운 버그를 찾아 낼 수 있습니다. PHPeclipse는 일반적인 구문 오류를 강조 표시하고 디버거와 함께 사용하여 중단 점을 설정할 수있는 Eclipse 플러그인입니다.

display_errors = Off
error_reporting = E_ALL 
display_errors = On

또한 사용

error_log();
console_log();

1

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


그리고 tail -f보다 더 잘 작동합니다
markus_p

1

내장 디버거와 함께 일식에 zend studio를 사용합니다. xdebug를 사용하는 이클립스 pdt로 디버깅하는 것에 비해 여전히 느립니다. 그들이 이러한 문제를 해결하기를 바라며, 최근 릴리즈에서는 속도가 향상되었지만 여전히 스테핑은 2-3 초가 걸립니다. zend firefox 툴바는 실제로 작업을 쉽게 해줍니다 (다음 페이지, 현재 페이지 등). 또한 코드를 벤치마킹하고 파이 차트, 실행 시간 등을 제공하는 프로파일 러를 제공합니다.


1

버그의 대부분은 간단하게 쉽게 찾을 수 있습니다 var_dump 몇 가지 주요 변수를 있지만, 어떤 종류의 응용 프로그램을 개발 하느냐에 따라 달라집니다.

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


1

PHP DBG

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

특징은 다음과 같습니다.

  • 단계별 디버깅
  • 유연한 중단 점 (클래스 메소드, 함수, 파일 : 라인, 주소, Opcode)
  • 내장 된 eval ()으로 PHP에 쉽게 접근
  • 현재 실행중인 코드에 쉽게 액세스
  • 유저 랜드 API
  • SAPI 불가지론-쉽게 통합
  • PHP 구성 파일 지원
  • JIT Super Globals-나만의 설정 !!
  • 선택적인 리드 라인 지원-편안한 터미널 작동
  • 원격 디버깅 지원-번들 Java GUI
  • 쉬운 조작

스크린 샷을 참조하십시오 :

PHP DBG-단계별 디버깅-스크린 샷

PHP DBG-단계별 디버깅-스크린 샷

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

PHP 오류-PHP에 대한 더 나은 오류보고

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

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

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

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

PHP 오류 |  PHP 오류보고 개선-역 추적 스크린 샷 PHP 오류 |  PHP 오류보고 개선-역 추적 스크린 샷 PHP 오류 |  PHP 오류보고 개선-역 추적 스크린 샷

특징은 다음과 같습니다.

  • 사소한 사용, 그것은 단지 하나의 파일입니다
  • 정상 및 아약시 요청에 대해 브라우저에 표시되는 오류
  • AJAX 요청이 일시 중지되어 자동으로 다시 실행할 수 있습니다.
  • 오류를 가능한 한 엄격하게 만듭니다 (코드 품질을 높이고 성능을 향상시키는 경향이 있음)
  • 전체 스택 추적에서 코드 스 니펫
  • 자세한 정보를 제공합니다 (예 : 전체 기능 서명).
  • 평범한 오류 메시지 수정
  • 구문 강조
  • 예뻐요!
  • 커스터마이징
  • 수동으로 켜고 끄기
  • 오류보고없이 특정 섹션을 실행
  • 스택 추적에서 코드를 강조 표시하지 않도록 파일을 무시하십시오.
  • 응용 프로그램 파일; 오류가 발생하면 우선 순위가 결정됩니다!

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

GitHub : https://github.com/JosephLenton/PHP-Error

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

DTrace

시스템이 DTrace 동적 추적 (OS X에 기본적으로 설치됨)을 지원 하고 기본적으로 --enable-dtrace사용해야 하는 DTrace 프로브 ( )를 사용하여 PHP를 컴파일하는 경우이 명령을 사용하면 시간없이 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의 dtruss-lamp

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

  1. 다음을 실행하십시오 sudo dtruss-php.d.
  2. 다른 터미널에서 다음을 실행하십시오 php -r "phpinfo();"..

이를 테스트하려면 다음을 통해 모든 docroot로 이동하여 index.phpPHP 내장 서버를 실행할 수 있습니다 .

php -S localhost:8080

그 후 http : // localhost : 8080 / 사이트에 액세스 할 수 있습니다 하거나 편리한 포트를 선택할 수 있습니다. 거기에서 추적 출력을 보려면 일부 페이지에 액세스하십시오.

참고 : Dtrace는 기본적으로 OS X에서 사용할 수 있으며 Linux에서는 dtrace4linux 가 필요 하거나 다른 대안이 있는지 확인하십시오 .

참조 : PHP와 DTrace를 사용 php.net에서


시스템 탭

또는 SystemTap SDT 개발 패키지 (예 :)를 설치하여 SystemTap 추적을 확인하십시오 yum install systemtap-sdt-devel.

다음은 all_probes.stpSystemTap으로 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에서


0

print_r ()의 경우 +1 이를 사용하여 객체 또는 변수의 내용을 덤프하십시오. 가독성을 높이려면 사전 태그를 사용하여 소스를 볼 필요가 없도록하십시오.

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

또한 var_dump ($ thing)-하위 유형을 보는 데 매우 유용합니다




0

문제에 따라 error_reporting (E_ALL)과 echo 테스트의 조합을 좋아합니다 (오류가 발생한 행 / 파일을 찾기 위해 오류가 처음 발생했습니다. 행 / 파일 PHP가 항상 올바른 것은 아니라는 것을 알고 있습니다), IDE 중괄호 일치 ( "파싱 오류 : 구문 오류, 예기치 않은 $ end"문제 해결) 및 print_r (); 출구; 덤프 (실제 프로그래머는 소스를 본다; p).

또한 "memory_get_usage ();"를 사용하여 phpdebug (check sourceforge)를 이길 수 없습니다. "memory_get_peak_usage ();" 문제 영역을 찾을 수 있습니다.


0

코드를 단계별로 진행하면서 변수 변경 값을 볼 수있는 통합 디버거는 정말 멋집니다. 그러나 서버에서 소프트웨어를 설정하고 클라이언트에서 특정 양의 구성을 요구합니다. 둘 다 양호한 상태로 유지하려면 정기적 인 유지 보수가 필요합니다.

print_r은 작성하기 쉽고 모든 설정에서 작동하도록 보장됩니다.


0

일반적으로 파일에 저장하고 디버그 정보를 저장하며 결국 공통 바닥 글에 다시 인쇄 할 수있는 사용자 정의 로그 함수를 만듭니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.