“ Việc thay đổi mã nguồn không hợp lý có thể gây ra nhiều vấn đề hơn là để nguyên không thay đổi gì, do đó phải luôn suy nghĩ trước khi làm... Suy nghĩ.[r]
(1)Bài 9
(2)Nội dung
1. Gỡ lỗi
(3)1
Gỡ lỗi
(4)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á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
(5)Gỡ rối
Debug
▪ Đối với mã nguồn, tiêu chí quan trọng hơn: rõ ràng hay chính xác?
▫ Nếu mã nguồn rõ ràng, bạn làm cho chương trình trở nên chính 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?
(6)Tìm kiếm và
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
(7)(8)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
Run-time (chạy) (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
(9)Hiểu
các 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 <stdioo.h> int main(void)
/* Print "hello, world" to stdout and return
{
printf("hello, world\n"); return 0;
}
$ 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
(10)Hiểu
các thông báo lỗi
▪ Một số thông báo lỗi đến từ compiler
#include <stdio.h> int main(void)
/* Print "hello, world" to stdout and return */
{
printf("hello, world\n") retun 0;
}
$ 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
(11)Hiểu
các thông báo lỗi
▪ Một số thông báo lỗi đến từ linker
#include <stdio.h> int main(void)
/* Print "hello, world" to stdout and return */
{
prinf("hello, world\n") return 0;
}
$ 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 exit status
Sai tên hàm gọi
Compiler warning (not error): prinf() gọi trước khai báo
(12)(13)Suy nghĩ
trước viết
▪ Gỡ rối gặp
▫ Khi phát lỗi, sửa ngay, đừng để sau sửa, lỗi khơng xuất lại (do tình huống)
▫ Cân nhắc: việc sửa chữa có ảnh hưởng tới tình khác hay khơng ?
▪ Quan sát lỗi từ góc độ khác
▫ Viết đoạn mã nguồn gây lỗi giấy
▸ Đừng chép hết đoạn khơng có nguy gây lỗi, in tồn
code giấy in => phá vỡ cấu trúc
▫ Vẽ hình minh họa cấu trúc liệu
▸ Nếu mà giải thuật làm thay đổi CTDL, vẽ lại hình trước viết lại
giải thuật
▫ Đọc trước gõ vào
▸ Đừng vội vàng, không rõ điều thực gây lỗi sửa
(14)Suy nghĩ
trước viết
▪ Tạm dừng viết chương trình
▫ Khi gặp vấn đề, khó khăn, chậm tiến độ, thay đổi công việc => rút khỏi luồng quán tính sai lầm …
▫ Bỏ qua đoạn chương trình có lỗi
▫ Khi cảm thấy sẵn sàng chữa
▪ Giải thích logic đoạn mã nguồn:
▫ Cho bạn
▸ Tạo điều kiện để suy nghĩ lại
▫ Cho khác phản bác
▸ Extrem programming : làm việc theo cặp, pair programming,
người LT, người kiểm tra, ngược lại
(15)Tìm lỗi
tương tự
int i; …
scanf("%d", i);
char c; …
c = getchar(); switch (i) {
case 0: …
/* missing break */
case 1: …
break; …
}
if (i = 5) …
if (5 < i < 10) …
if (i & j) …
while (c = getchar() != EOF) …
Tips: đặt chế độ cảnh báo (warnings) dịch hầu hết lỗi kiểu phát
(16)Tìm lỗi
tương tự
▪ Khi gặp vấn đề, liên tưởng đến trường hợp tương tự gặp
▫ Vd1 :
int n; scanf(“%d”,n); ?
▫ Vd2 :
int n=1; double d=PI;
printf(“%d %f \n”,d,n); ??
(17)Tìm lỗi
tương tự
▪ Làm cho lỗi xuất lại
▫ Cố gắng làm cho lỗi xuất lại cần
(18)2 Array index out of bounds – Vượt phạm vi số mảng
3 Call-by-value used instead of call-by reference for function parameters to be
modified – Gọi theo giá trị, thay gọi theo
tham chiếu cho hàm để sửa
4 Comparison operators misused – Các toán tử so sánh bị dùng sai
5 Compound statement not used - Lệnh phức hợp không dùng
6 Dangling else - nhánh else khong hợp lệ Division by zero attempted - Chia cho Division using integers so quotient gets truncated – Dùng phép chia số nguyên nên phần thập phân bị cắt
9 Files not closed properly (buffer not flushed) - File khơng đó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ể
(19)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 15 Missing "&" or missing "const" with a
call-by-reference
function parameter – thiếu dấu & hay từ khóa const với lời gọi tham số hàm theo tham chiếu 16 Missing bracket for body of function or compound statement – Thiếu cặp {} cho thân hàm hay nhóm lệnh
17 Mission reference to namespace - Thiếu tham chiếu tới tên miền
18 Missing return statement in a value-returning function – Thiếu return
19 Missing semi-colon in simple statement, function prototypes, struct definitions or class definitions – thiếu dấu ; lệnh đơn …
20 Mismatched data types in expressions – kiểu liệu không hợp
21 Operator precedence misunderstood - Hiểu sai thứ tự phép toán
(20)23 Overused (overloaded) local variable names - Trùng tên biến cục
24 Pointers not set properly or overwritten in error – Con trỏ không xác định
hoặc trỏ vào vị trí khơng có
25 Return with value attempted in void
function – trả giá trị hàm void 26 Undeclared variable name – không khai báo biến
27 Un-initialized variables – Không khởi tạo giá trị
28 Unmatched parentheses – thiếu }
29 Un-terminated strings - xâu không kết thúc, thiếu "
30 Using "=" when "= =" is intended or vice versa
31 Using "&" when "&&" is intended or vice versa
32 "while" used improperly instead of "if" – while dùng thay if