문제

나는 최근에 프로그래밍 능력에 도전하는 문제에 맞서 싸웠으며 매우 우발적 인 무한 루프였습니다. 나는 그것을 건조시키기 위해 일부 코드를 다시 작성하고 그것이 불리는 정확한 방법에 의해 반복적으로 호출되는 함수를 변경했습니다. 확실히 기본 문제. Apache는 충돌로 문제를 해결하기로 결정했으며 로그는 "아동 과정을 낳은"것 외에는 아무것도 언급하지 않았습니다. 문제는 그날 문제를 실제로 디버깅을 마치지 않았고 오후에 자랐으며 오늘 해결해야한다는 것이 었습니다.

결국 내 솔루션은 간단했습니다. 로직을 수동으로 로그하고 무슨 일이 있었는지 확인하십시오. 두 개의 고유 한 줄로 구성된 로그 파일을 가졌을 때 문제는 즉시 분명해졌으며, 두 줄은 약 2 백 번 반복되었습니다.

무한 루프로부터 자신을 보호하는 몇 가지 방법은 무엇입니까? 그리고 그것이 실패 할 때 (그리고 그것이 될 것입니다), 그것을 추적하는 가장 빠른 방법은 무엇입니까? 실제로 가장 효과적인 로그 파일입니까, 아니면 다른 것이 있습니까?

당신의 대답은 그것이 모범 사례라면 언어 불가지론 일 수 있지만, PHP 특정 기술과 코드를 고수하고 싶습니다.

도움이 되었습니까?

해결책

Xdebug와 같은 디버거를 사용하고 무한 루프가 포함되어 있다고 의심되는 코드를 걸어 갈 수 있습니다.

XDEBUG- PHP 용 디버거 및 프로파일러 도구

당신은 또한 설정할 수 있습니다

max_execution_time

시간을 제한하기 위해 무한 루프가 충돌하기 전에 연소됩니다.

다른 팁

때때로 가장 안전한 방법은 루프에 한계 점검을 통합하는 것입니다. 루프 구조 유형은 중요하지 않습니다. 이 예에서는 'while'진술을 선택했습니다.

$max_loop_iterations = 10000;
$i=0;
$test=true;
while ($test) {

  if ($i++ == $max_loop_iterations) {
    echo "too many iterations...";
    break;
  }

  ...
}

$ max_loop_iterations에 대한 합리적인 값은 다음을 기반으로 할 수 있습니다.

  • 런타임에 설정된 일정한 값
  • 입력의 크기에 따라 계산 된 값
  • 또는 상대 런타임 속도를 기준으로 계산 된 값일 수 있습니다.

이것이 도움이되기를 바랍니다 - n

단위 테스트도 좋은 생각 일 수 있습니다. phpunit을 시도하고 싶을 수도 있습니다.

간단한 코드를 작성하면 버그가 더 분명해질까요? 당신의 무한 루프가 사람이 이해할 수없는 어리석은 원사 통제 구조 때문인지 궁금합니다. 따라서 물론 당신은 그것을 위로 올렸습니다.

모든 무한 루프가 나쁘지는 않습니다 (예 : while (!quit)).

실행을 추적하고 통화 그래프를 버릴 수 있습니까? Infinite 루프는 분명 할 것이며, 의도적 인 것 (거대한 메인 루프)과 사고 (지역 Abababa ... MainLoop으로 돌아 오지 않는 루프 또는 루프)를 쉽게 선택할 수 있습니다.

큰 복잡한 프로그램을 위해이 작업을 수행하는 소프트웨어에 대해 들었지만 스크린 샷을 찾을 수 없었습니다. 누군가 3Dsmax와 같은 프로그램을 추적하고 정말 예쁜 전화 그래프를 버렸습니다.

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