Bài giảng Kỹ thuật lập trình - Chương 9: Gỡ lỗi và kiểm thử. Chương này cung cấp cho học viên những nội dung về: gỡ lỗi (debug); hiểu các thông báo lỗi; kiểm thử; chia để trị; thu hẹp phạm vi; tập trung vào dữ liệu gây lỗi;... Mời các bạn cùng tham khảo chi tiết nội dung bài giảng!
Trịnh Thành Trung (ThS) trungtt@soict.hust.edu.vn Bài GỠ LỖI VÀ KIỂM THỬ Nội dung Gỡ lỗi Kiểm thử Gỡ lỗi Debug Gỡ rối Debug ▪ Gỡ rối gì? ▫ Khi chương trình bị lỗi, gỡ rối công việc cần làm để làm cho chương trình dịch thơng, chạy thơng ▫ Thật khơng may, gỡ rối ln thao tác phải làm lập trình, thao tác tốn ▪ Cách tốt phòng ngừa ▫ Khi bắt đầu gỡ rối chương trình, bạn biết chương trình khơng chạy ▫ Nếu bạn biết lý chương trình khơng chạy, bạn sửa chương trình cho chạy ▫ Nếu bạn hiểu chương trình bạn, bạn có sai lầm dễ dàng sửa chữa sai sót Bí viết mã đơn giản, hiệu quả, thích hợp lý Gỡ rối Debug ▪ Đối với mã nguồn, tiêu chí quan trọng hơn: rõ ràng hay xác? ▫ Nếu mã nguồn rõ ràng, bạn làm cho chương trình trở nên xác ▫ Bạn có làm cho chương trình trở nên xác khơng rõ ràng hay khơng? ▪ Nếu chương trình thiết kế với cấu trúc tốt, viết phong cách lập trình tốt áp dụng kỹ thuật viết chương trình hiệu quả, bẫy lỗi chi phí cho việc gỡ rối giảm thiểu Tìm kiếm gỡ rối ▪ Khi có lỗi, ta thường đổ cho trình dịch, thư viện hay nguyên nhân khách quan khác… nhiên, cuối lỗi lỗi chương trình, trách nhiệm gỡ rối thuộc LTV ▪ Phải hiểu vấn đề xuất phát từ đâu giải được: ▫ Lỗi xảy đâu? Hầu hết lỗi thường đơn giản dễ tìm Hãy khảo sát đầu mối cố gắng xác định đoạn mã nguồn gây lỗi ▫ Lỗi xảy nào? Khi có số thơng tin lỗi nơi xảy lỗi, suy nghĩ xem lỗi xảy ▫ Đâu nguyên nhân gây lỗi? Suy luận ngược trở lại trạng thái chương trình để xác định nguyên nhân gây lỗi “ Gỡ rối liên quan đến việc suy luận lùi, giỗng phá án Một số vấn đề xảy có thơng tin xác thực đáng tin cậy Phải ngược từ kết để khám phá ngun nhân Khi có lời giải thích đầy đủ, ta biết vấn đề cần sửa phát số vấn đề khác Debugging Heuristic Debugging Heuristic Áp dụng (1) Hiểu thông báo lỗi (error messages) Build-time (dịch) (2) Nghĩ trước viết lại chương trình (3) Tìm kiếm lỗi (bug) hay xảy (4) Divide and conquer (5) Viết thêm đoạn mã kiểm tra để chương trình tự kiểm tra (6) Hiện thị kết (7) Sử dụng debugger (8) Tập trung vào lệnh viết / viết lại Run-time (chạy) Hiểu thông báo lỗi ▪ Gỡ rối dịch (build-time) chương trình dễ gỡ rối chạy chương trình LTV hiểu thông báo lỗi ▪ Một số thông báo lỗi đến từ preprocessor #include int main(void) /* Print "hello, world" to stdout and return { printf("hello, world\n"); return 0; } Gõ sai tên file cần gọi Thiếu dấu */ $ gcc217 hello.c -o hello hello.c:1:20: stdioo.h: No such file or directory hello.c:3:1: unterminated comment hello.c:2: error: syntax error at end of input Hiểu thông báo lỗi ▪ Một số thông báo lỗi đến từ compiler #include int main(void) /* Print "hello, world" to stdout and return */ { printf("hello, world\n") retun 0; } Sai từ khóa $ gcc217 hello.c -o hello hello.c: In function `main': hello.c:7: error: `retun' undeclared (first use in this function) hello.c:7: error: (Each undeclared identifier is reported only once hello.c:7: error: for each function it appears in.) hello.c:7: error: syntax error before numeric constant ...Nội dung Gỡ lỗi Kiểm thử Gỡ lỗi Debug Gỡ rối Debug ▪ Gỡ rối gì? ▫ Khi chương trình bị lỗi, gỡ rối cơng việc cần làm để làm cho chương trình dịch thông, chạy thông ▫ Thật không may, gỡ rối thao... Tập trung vào lệnh viết / viết lại Run-time (chạy) Hiểu thông báo lỗi ▪ Gỡ rối dịch (build-time) chương trình dễ gỡ rối chạy chương trình LTV hiểu thơng báo lỗi ▪ Một số thông báo lỗi đến từ... chương trình trở nên xác ▫ Bạn có làm cho chương trình trở nên xác khơng rõ ràng hay khơng? ▪ Nếu chương trình thiết kế với cấu trúc tốt, viết phong cách lập trình tốt áp dụng kỹ thuật viết chương