2009-07-16 28 views
5

Gần đây tôi đã gặp phải một vấn đề thách thức khả năng lập trình của tôi, và đó là một vòng lặp vô hạn vô tình. Tôi đã viết lại một số mã để làm khô nó và thay đổi một hàm được lặp đi lặp lại được gọi bằng các phương thức chính xác mà nó gọi; một vấn đề cơ bản, chắc chắn. Apache quyết định giải quyết vấn đề bằng cách đâm sầm, và nhật ký không ghi nhận gì ngoài "quy trình con đẻ trứng". Vấn đề là tôi chưa bao giờ thực sự hoàn thành việc gỡ lỗi vấn đề ngày hôm đó, nó đã bị cắt vào buổi chiều và phải giải quyết nó ngay hôm nay.Làm thế nào để gỡ lỗi, và bảo vệ chống lại, vòng lặp vô hạn trong PHP?

Cuối cùng, giải pháp của tôi rất đơn giản: đăng nhập logic theo cách thủ công và xem điều gì đã xảy ra. Vấn đề là ngay lập tức rõ ràng khi tôi đã có một tập tin đăng nhập bao gồm hai dòng duy nhất, tiếp theo là hai dòng được lặp đi lặp lại một số hai trăm lần apiece.

Một số cách để tự bảo vệ mình khỏi các vòng lặp vô hạn là gì? Và, khi thất bại (và nó sẽ), cách nhanh nhất để theo dõi nó là gì? Nó thực sự là tệp nhật ký hiệu quả nhất, hay cái gì khác?

Câu trả lời của bạn có thể là ngôn ngữ bất khả tri nếu đó là phương pháp hay nhất, nhưng tôi muốn gắn bó với các kỹ thuật và mã PHP cụ thể.

+1

Câu hỏi này không đánh tôi như bất kỳ câu hỏi nào khác với câu hỏi "cách chúng tôi viết phần mềm không có lỗi" chung ... – gahooa

+0

@gahooa, đó chỉ là bạn; Tôi không quan tâm đến phần mềm không có lỗi vì nó sẽ không bao giờ đến đó. Tôi chỉ muốn các mẹo để bắt gặp vấn đề này, khiến tôi mất cảnh giác vào ngày khác. –

Trả lời

15

Bạn có thể sử dụng trình gỡ lỗi như xdebug và đi qua mã mà bạn nghi ngờ chứa vòng lặp vô hạn.

Xdebug - Debugger and Profiler Tool for PHP

Bạn cũng có thể thiết lập

max_execution_time 

để hạn chế thời gian vòng lặp vô hạn sẽ đốt cháy trước khi đâm.

+0

Tôi hoàn toàn quên về xdebug. Cảm ơn! –

0

viết mã đơn giản, vì vậy các lỗi sẽ rõ ràng hơn? Tôi tự hỏi liệu vòng lặp vô hạn của bạn có phải là do một số cấu trúc điều khiển vô lý mà không ai có thể hiểu được. Vì vậy, tất nhiên bạn f'ed nó lên.

tất cả các vòng vô hạn không tệ (ví dụ: while (!quit)).

+0

Đây là một dòng mã 100; không có nhiều để treo tôi lên. Vấn đề là viết lại một thói quen của một cặp thói quen đan xen nhau, và đảo ngược luồng cuộc gọi. 'a-> b-> c' trở thành' a <-> b'. –

1

Kiểm tra đơn vị cũng có thể là một ý tưởng hay. Bạn có thể muốn thử PHPUnit.

+0

Ý tưởng hay, nhưng mã của tôi, trong khi có thể kiểm tra, sẽ gặp sự cố kiểm tra đơn vị. –

3

Đôi khi tôi thấy phương pháp an toàn nhất là kết hợp kiểm tra giới hạn trong vòng lặp. Loại cấu trúc vòng lặp không quan trọng. Trong ví dụ này tôi chọn một 'trong khi' tuyên bố:

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

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

    ... 
} 

Một giá trị hợp lý với $ max_loop_iterations có thể được dựa trên:

  • một giá trị không đổi thiết lập trong thời gian chạy
  • một giá trị tính toán dựa trên kích thước của một đầu vào
  • hoặc có lẽ là giá trị được tính toán dựa trên tốc độ thời gian chạy tương đối

Hy vọng t sự giúp đỡ của anh ấy, - N

0

bạn có thể theo dõi việc thực hiện và loại bỏ đồ thị cuộc gọi không? vòng lặp vô hạn sẽ được rõ ràng, và bạn có thể dễ dàng chọn ra những cái đang có mục đích (một vòng lặp lớn) so với một tai nạn (abababa địa phương ...vòng lặp hoặc vòng lặp không bao giờ quay trở lại vòng tròn chính)

Tôi đã nghe nói về phần mềm thực hiện điều này cho các chương trình phức tạp lớn, nhưng tôi không thể tìm thấy ảnh chụp màn hình cho bạn. Ai đó đã truy tìm một chương trình như 3dsmax và bán ra một biểu đồ cuộc gọi thực sự đẹp.

Các vấn đề liên quan