Xem mẫu

  1. Trịnh Thành Trung (ThS) trungtt@soict.hust.edu.vn om .c ng Bài 9 co an GỠ LỖI VÀ KIỂM THỬ th ng o du u cu CuuDuongThanCong.com https://fb.com/tailieudientucntt
  2. om Nội dung .c ng co an 1. Gỡ lỗi th ng 2. Kiểm thử o du u cu CuuDuongThanCong.com https://fb.com/tailieudientucntt
  3. om .c 1. ng co Gỡ lỗi an Debug th o ng du u cu CuuDuongThanCong.com https://fb.com/tailieudientucntt
  4. Gỡ rối Debug om .c ▪ Gỡ rối là gì? ng ▫ Khi chương trình bị lỗi, gỡ rối là các công việc cần làm để làm co cho chương trình dịch thông, chạy thông an ▫ Thật không may, gỡ rối luôn là thao tác phải làm khi lập trình, th thao tác này rất tốn kém ng ▪ Cách tốt nhất vẫn là phòng ngừa o du ▫ Khi bắt đầu gỡ rối chương trình, bạn đã biết là chương trình không chạy. u cu ▫ Nếu bạn biết lý do tại sao chương trình không chạy, bạn có thể sửa được chương trình cho nó chạy ▫ Nếu bạn hiểu chương trình của bạn, bạn sẽ có ít sai lầm và dễ dàng sửa chữa sai sót hơn. Bí quyết là viết mã đơn giản, hiệu quả, chú thích hợp lý. CuuDuongThanCong.com https://fb.com/tailieudientucntt
  5. Gỡ rối Debug om .c ▪ Đối với mã nguồn, tiêu chí nào quan trọng hơn: rõ ràng hay ng chính xác? co ▫ Nếu mã nguồn rõ ràng, bạn có thể làm cho chương trình trở nên an chính xác. th ▫ Bạn có chắc là làm cho chương trình trở nên chính xác nếu nó ng không rõ ràng hay không? o ▪ Nếu chương trình được thiết kế với cấu trúc tốt, được viết du bằng phong cách lập trình tốt và áp dụng các kỹ thuật viết u cu chương trình hiệu quả, bẫy lỗi thì chi phí cho việc gỡ rối sẽ được giảm thiểu. CuuDuongThanCong.com https://fb.com/tailieudientucntt
  6. Tìm kiếm và gỡ rối om .c ▪ Khi có lỗi, ta thường đổ cho trình dịch, thư viện hay bất cứ ng nguyên nhân khách quan nào khác… tuy nhiên, cuối cùng thì co lỗi vẫn là lỗi của chương trình, và trách nhiệm gỡ rối thuộc về an LTV th ▪ Phải hiểu vấn đề xuất phát từ đâu thì mới giải quyết được: o ng ▫ Lỗi xảy ra ở đâu? Hầu hết các lỗi thường đơn giản và dễ tìm. du Hãy khảo sát các đầu mối và cố gắng xác định được đoạn mã u nguồn gây lỗi cu ▫ Lỗi xảy ra như thế nào? Khi đã có một số thông tin về lỗi và nơi xảy ra lỗi, hãy suy nghĩ xem lỗi xảy ra như thế nào ▫ Đâu là nguyên nhân gây lỗi? Suy luận ngược trở lại trạng thái của chương trình để xác định nguyên nhân gây ra lỗi CuuDuongThanCong.com https://fb.com/tailieudientucntt
  7. “ Gỡ rối liên quan đến việc suy om luận lùi, giỗng như phá án. Một .c số vấn đề không thể xảy ra và chỉ ng co có những thông tin xác thực mới an đáng tin cậy. Phải đi ngược từ kết quả để khám phá nguyên nhân. th ng Khi có lời giải thích đầy đủ, ta sẽ o du biết được vấn đề cần sửa và có u thể phát hiện ra một số vấn đề cu khác CuuDuongThanCong.com https://fb.com/tailieudientucntt
  8. Debugging Heuristic om .c Debugging Heuristic Áp dụng khi nào ng (1) Hiểu các thông báo lỗi (error messages) Build-time (dịch) co (2) Nghĩ trước khi viết lại chương trình an (3) Tìm kiếm các lỗi (bug) hay xảy ra (4) Divide and conquer th ng Run-time (chạy) (5) Viết thêm các đoạn mã kiểm tra để o du chương trình tự kiểm tra nó u (6) Hiện thị kết quả cu (7) Sử dụng debugger (8) Tập trung vào các lệnh mới viết / mới viết lại CuuDuongThanCong.com https://fb.com/tailieudientucntt
  9. Hiểu các thông báo lỗi om .c ▪ Gỡ rối khi dịch (build-time) chương trình dễ hơn gỡ rối khi ng chạy chương trình nếu LTV hiểu được các thông báo lỗi co ▪ Một số thông báo lỗi đến từ preprocessor an Gõ sai tên file cần gọi th #include int main(void) ng /* Print "hello, world" to stdout and o return 0. Thiếu dấu */ du { printf("hello, world\n"); u return 0; cu } $ 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  10. Hiểu các thông báo lỗi om .c ▪ Một số thông báo lỗi đến từ compiler ng co #include an int main(void) /* Print "hello, world" to stdout and th return 0. */ ng { Sai từ khóa printf("hello, world\n") o du retun 0; } u cu $ 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt
  11. Hiểu các thông báo lỗi om .c ▪ Một số thông báo lỗi đến từ linker ng Sai tên hàm co #include int main(void) được gọi an /* Print "hello, world" to stdout and th return 0. */ { ng prinf("hello, world\n") o return 0; du } Compiler warning (not error): prinf() Linker error: không tìm thấy được gọi trước khi khai báo u cu định nghĩa hàm prinf() $ gcc217 hello.c -o hello hello.c: In function `main': hello.c:6: warning: implicit declaration of function `prinf' /tmp/cc43ebjk.o(.text+0x25): In function `main': : undefined reference to `prinf' collect2: ld returned 1 exit status CuuDuongThanCong.com https://fb.com/tailieudientucntt
  12. “ Việc thay đổi mã nguồn không om hợp lý có thể gây ra nhiều vấn .c ng đề hơn là để nguyên không thay co đổi gì, do đó phải luôn suy nghĩ an trước khi làm th o ng du u cu CuuDuongThanCong.com https://fb.com/tailieudientucntt
  13. Suy nghĩ trước khi viết om .c ▪ Gỡ rối ngay khi gặp ng ▫ Khi phát hiện lỗi, hãy sửa ngay, đừng để sau mới sửa, vì có thể co lỗi không xuất hiện lại (do tình huống) an ▫ Cân nhắc: việc sửa chữa này có ảnh hưởng tới các tình huống th khác hay không ? ▪ Quan sát lỗi từ góc độ khác o ng ▫ Viết đoạn mã nguồn gây lỗi ra giấy du ▸ Đừng chép hết cả đoạn không có nguy cơ gây lỗi, hoặc in toàn bộ code ra giấy in => phá vỡ cây cấu trúc u cu ▫ Vẽ hình minh họa các cấu trúc dữ liệu ▸ Nếu mà giải thuật làm thay đổi CTDL, vẽ lại hình trước khi viết lại giải thuật ▫ Đọc trước khi gõ vào ▸ Đừng vội vàng, khi không rõ điều gì thực sự gây ra lỗi và sửa không đúng chỗ sẽ có nguy cơ gây ra lỗi khác CuuDuongThanCong.com https://fb.com/tailieudientucntt
  14. Suy nghĩ trước khi viết om .c ▪ Tạm dừng viết chương trình ng ▫ Khi gặp vấn đề, khó khăn, chậm tiến độ, lập tức thay đổi công co việc => rút ra khỏi luồng quán tính sai lầm … an ▫ Bỏ qua đoạn chương trình có lỗi th ▫ Khi nào cảm thấy sẵn sàng thì chữa ng ▪ Giải thích logic của đoạn mã nguồn: o du ▫ Cho chính bạn ▸ Tạo điều kiện để suy nghĩ lại u cu ▫ Cho ai khác có thể phản bác ▸ Extrem programming : làm việc theo cặp, pair programming, người này LT, người kia kiểm tra, và ngược lại ▫ Cho cái gì đó không thể phản bác (cây, cốc trà đá, gấu bông…) ▸ Tạo điều kiện củng cố suy luận của mình CuuDuongThanCong.com https://fb.com/tailieudientucntt
  15. Tìm các lỗi tương tự om .c switch (i) { int i; ng case 0: … co … scanf("%d", i); /* missing break */ an case 1: … th char c; break; … ng … c = getchar(); } o du if (i = 5) u while (c = getchar() != EOF) … cu … if (5 < i < 10) if (i & j) Tips: nếu đặt chế độ cảnh báo … … (warnings) khi dịch thì hầu hết các lỗi kiểu này sẽ được phát hiện CuuDuongThanCong.com https://fb.com/tailieudientucntt
  16. Tìm các lỗi tương tự om .c ▪ Khi gặp vấn đề, hãy liên tưởng đến những trường hợp ng tương tự đã gặp co ▫ Vd1 : an int n; scanf(“%d”,n); ? th ▫ Vd2 : ng int n=1; double d=PI; o printf(“%d %f \n”,d,n); ?? du ▪ Không khởi tạo biến (với C) cũng sẽ gây ra những lỗi khó u lường. cu CuuDuongThanCong.com https://fb.com/tailieudientucntt
  17. Tìm các lỗi tương tự om .c ▪ Làm cho lỗi xuất hiện lại ng ▫ Cố gắng làm cho lỗi có thể xuất hiện lại khi cần co ▫ Nếu không được, thì thử tìm nguyên nhân tại sao lại không làm an cho lỗi xuất hiện lại th o ng du u cu CuuDuongThanCong.com https://fb.com/tailieudientucntt
  18. 1. Array as a parameter handled improperly – Tham số mảng được xử lý không đúng cách {C/C++} 2. Array index out of bounds – Vượt ra ngoài phạm vi chỉ số mảng 3. Call-by-value used instead of call-by om reference for function parameters to be modified – Gọi theo giá trị, thay vì gọi theo .c tham chiếu cho hàm để sửa ng 4. Comparison operators misused – Các toán tử so sánh bị dùng sai co 5. Compound statement not used - Lệnh phức hợp an không được dùng th 6. Dangling else - nhánh else khong hợp lệ ng 7. Division by zero attempted - Chia cho 0 8. Division using integers so quotient gets o du truncated – Dùng phép chia số nguyên nên phần thập phân bị cắt u 9. Files not closed properly (buffer not cu flushed) - File không được đóng phù hợp ( buffer không bị dẹp) 10. Infinite loop - lặp vô hạn 11. Global variables used – dùng biến tổng thể CuuDuongThanCong.com https://fb.com/tailieudientucntt
  19. 12. IF-ELSE not used properly – dùng if-else không chuân {C/C++} 13. Left side of assignment not an L-value - phía trái phép gán không phải biến 14. Loop has no body – vòng lặp không có thân om 15. Missing "&" or missing "const" with a call-by-reference .c function parameter – thiếu dấu & hay từ khóa ng const với lời gọi tham số hàm theo tham chiếu co 16. Missing bracket for body of function or compound statement – Thiếu cặp {} cho thân của an hàm hay nhóm lệnh th 17. Mission reference to namespace - Thiếu ng tham chiếu tới tên miền 18. Missing return statement in a value- o du returning function – Thiếu return 19. Missing semi-colon in simple statement, u function prototypes, struct definitions or cu class definitions – thiếu dấu ; trong lệnh đơn … 20. Mismatched data types in expressions – kiểu dữ liệu không hợp 21. Operator precedence misunderstood - Hiểu sai thứ tự các phép toán CuuDuongThanCong.com https://fb.com/tailieudientucntt
  20. 22. Off-by-one error in a loop – Thoát khỏi bởi 1 lỗi trong vòng lặp {C/C++} 23. Overused (overloaded) local variable names - Trùng tên biến cục bộ 24. Pointers not set properly or overwritten om in error – Con trỏ không được xác định đúng hoặc trỏ vào 1 vị trí không có .c 25. Return with value attempted in void ng function – trả về 1 giá trị trong 1 hàm void co 26. Undeclared variable name – không khai báo biến an 27. Un-initialized variables – Không khởi tạo th giá trị ng 28. Unmatched parentheses – thiếu } 29. Un-terminated strings - xâu không kết o du thúc, thiếu " 30. Using "=" when "= =" is intended or vice u versa cu 31. Using "&" when "&&" is intended or vice versa 32. "while" used improperly instead of "if" – while được dùng thay vì if CuuDuongThanCong.com https://fb.com/tailieudientucntt
nguon tai.lieu . vn