Một sáng đẹp trời bạn ghé vào quán bún bò Huế quen thuộc...Nhưng sao hôm nay hương vị lại khác lạ, không ngon như trước...
Có một loại bug.
Đáng sợ hơn cả Fatal Error.
Đáng ghét hơn cả Parse Error.
Và khiến lập trình viên mất ngủ nhiều nhất.
Đó là...
Bug lúc có lúc không.
Hôm qua.
Website chạy ngon.
Sáng nay.
Lỗi.
Chiều.
Tự hết.
Khách hàng bảo:
"Em vừa bấm thì lỗi."
Bạn thử.
...
Không lỗi.
Khách hàng quay video gửi.
Đúng là lỗi thật.
Bạn mở lại.
...
Vẫn không lỗi.
Nếu bạn từng gặp tình huống này.
Xin chúc mừng.
Bạn đã bước vào một "cấp độ mới" của nghề lập trình.
Bug lúc có lúc không là gì?
Bug lúc có lúc không (Intermittent Bug) là lỗi chỉ xuất hiện trong một số điều kiện nhất định, không xảy ra liên tục nên rất khó tái hiện và debug.
Nguyên nhân thường liên quan đến:
- Session
- Cookie
- Cache
- Dữ liệu đầu vào
- Thời gian
- Trình duyệt
- Hoặc môi trường chạy chương trình.
Ví dụ thực tế...xe cộ
Hãy tưởng tượng.
Xe của bạn.
Suốt một tháng.
Đi bình thường.
Đến đúng hôm trời mưa.
Xe không nổ máy.
Hôm sau.
Nắng đẹp.
Lại chạy bình thường.
Lỗi không biến mất.
Nó chỉ...
Chưa gặp đúng điều kiện để xuất hiện.
Bug trong lập trình cũng vậy.
"Máy em chạy mà..."
Đây có lẽ là câu nói quen thuộc và "nổi tiếng" nhất.
Khách hàng phàn nàn:
"Website lỗi."
Lập trình viên:
"Máy em chạy bình thường."
Cả hai: Đều nói thật.
Vì...
Khách dùng:
Safari.
Bạn dùng:
Chrome.
Khách dùng:
iPhone.
Bạn dùng:
Windows.
Khách đăng nhập từ hôm qua.
Bạn vừa đăng nhập lại.
Điều kiện khác nhau.
Kết quả khác nhau.
Session - Thủ phạm quen thuộc
Ví dụ. Người dùng đã đăng nhập.
Session còn.
↓
Website hoạt động.
Người khác.
Session hết hạn.
↓
Website báo lỗi.
Nếu bạn chỉ test bằng tài khoản của mình. Rất có thể.
Bạn sẽ không bao giờ thấy lỗi đó.
Cache - "Đã sửa rồi mà vẫn lỗi?"
Đây là tình huống rất quen. Bạn sửa code. Upload. Refresh.
...
Website vẫn như cũ.
Bạn sửa thêm lần nữa.
Không được.
Một tiếng sau.
Tự nhiên.
Website mới xuất hiện...lộng lẫy.
Không phải phép màu.
Rất có thể.
Cache vẫn đang lưu phiên bản cũ.
Đây cũng là lý do phần tiếp theo của chúng ta sẽ thảo luận về:
Cache là gì?
Dữ liệu đầu vào khác nhau
Ví dụ, bạn "phấn khởi" test thử trang web "tâm huyết".
Tên:
Nam
Không lỗi.
Khách nhập:
Nguyễn Văn Nam
Vẫn ổn.
Người khác nhập thêm một ký hiệu:
Nguyễn Văn Nam💪
Hoặc:
O'Connor
Có dấu nháy.
Lỗi xuất hiện.
Không phải vì chương trình ghét khách hàng.
Mà vì...
Bạn chưa kiểm tra đủ dữ liệu đầu vào.
Hôm qua chạy, hôm nay chết
Có những bug không liên quan đến code.
Ví dụ.
Website lấy:
Ngày hiện tại.
date("Y-m-d")
Ngày 31.
↓
Chạy.
Sang ngày 1.
↓
Lỗi.
Hoặc.
Đúng giao thừa.
Đúng cuối tháng.
Đúng năm nhuận.
↓
Bug xuất hiện.
Những lỗi này hiếm.
Nhưng rất thật.
Database cũng có thể là nguyên nhân
Lúc test. Database có: 10 dòng.
Nhanh.
Sau một năm.
Có: 2 triệu dòng.
↓
Website bắt đầu chậm.
↓
Timeout.
↓
Người dùng tưởng website bị lỗi.
Đó là lý do chúng ta vừa thảo luận:
Vì sao database chạy chậm dần?
Tập tành làm web
Có một vấn đề:
"Tình hình là rất...tinh hình, đăng nhập được, nhưng ông bạn vàng nhà bên cạnh lại không thể đăng nhập."
Sau khi kiểm tra. Mới phát hiện.
"Tác giả" của website ấy viết:
if($username=="admin")
Trong database.
Tên tài khoản là: Admin
Máy của bạn ấy.
Luôn đăng nhập bằng: admin.
Không sao.
Người khác, đăng nhập:
Admin.
↓
Lỗi.
Chỉ khác một chữ hoa.
Một hiểu lầm phổ biến
Nhiều người nghĩ: Bug lúc có lúc không là do máy tính "bị cái gì đó".
Không hẳn.
Máy tính rất "ngon lành". Nó luôn làm đúng. Chỉ là.
Có một điều kiện nào đó.
Bạn chưa nhìn thấy.
Hãy học cách tái hiện lỗi
Đây là kỹ năng cực kỳ quan trọng để tìm ra lỗi.
Đừng chỉ hỏi:
"Có lỗi không?"
Hãy hỏi.
- Bấm nút nào?
- Nhập dữ liệu gì?
- Dùng trình duyệt nào?
- Đăng nhập chưa?
- Điện thoại hay máy tính?
- Lỗi xuất hiện lúc mấy giờ?
- Có chụp màn hình không?
Càng nhiều thông tin.
Càng dễ tìm ra bug.
Echo và var_dump lại xuất hiện 😄
Lúc bug khó hiểu.
Đừng sửa ngay.
Hãy:
echo "Đã vào bước 1";
↓
var_dump($_SESSION);
↓
var_dump($_POST);
↓
Thu hẹp từng bước.
Rồi bug sẽ lộ diện.
Đó chính là lý do chúng ta học hai bài trước.
Một mẹo "hết nước chấm"
Nếu ai đó biết "trình độ cao" của bạn và hỏi:
"Lúc nãy vừa xảy ra lỗi. Nhưng giờ hết rồi."
Đừng vội kết luận là...vớ vẩn.
Hãy hỏi.
"Anh/chị có nhớ trước khi lỗi xảy ra đã làm những bước nào không?"
Rất nhiều bug được tìm ra.
Chỉ nhờ câu hỏi này.
Debug kiểu dev "xịn sò"
1. Đừng cố đoán
Hãy tái hiện lỗi.
2. Kiểm tra dữ liệu đầu vào
Nhiều bug chỉ xuất hiện với một loại dữ liệu đặc biệt.
3. Kiểm tra Session và Cookie
Đây là hai nguyên nhân rất phổ biến.
4. Hỏi đúng câu hỏi
Đừng chỉ hỏi: "Có lỗi không?"
Hãy hỏi: "Lỗi xảy ra như thế nào?"
5. Ghi lại các bước
Nếu đã tái hiện được bug.
Hãy ghi lại.
Đừng tin vào trí nhớ.
Checklist chuẩn không cần chỉnh
- Tái hiện lỗi trước khi sửa
- Kiểm tra Session
- Kiểm tra dữ liệu đầu vào
- Kiểm tra Cache
- Dùng echo và var_dump()
- Ghi lại các bước xảy ra lỗi
FAQ nhanh
Vì sao mình không thấy lỗi nhưng khách hàng lại thấy?
Vì hai người có thể đang sử dụng những điều kiện hoàn toàn khác nhau.
Bug lúc có lúc không có sửa được không?
Có. Quan trọng nhất là tìm được điều kiện khiến bug xuất hiện.
Có nên sửa ngay khi chưa tìm ra nguyên nhân?
Không. Sửa khi chưa hiểu nguyên nhân thường tạo ra thêm bug mới.
Đây có phải lỗi của PHP không?
Phần lớn là không.
Thường do logic chương trình hoặc môi trường chạy.
Bạn có thể cũng đang gặp
White Screen of Death – Trang trắng xóa không báo lỗi
var_dump() là "vũ khí bí mật" của newbie
echo debug và nghệ thuật "soi từng bước"
Comment code đúng cách để khỏi tự giết mình
PHP login đúng password nhưng vẫn fail