Xem mẫu
- 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
- 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
- om
.c
1.
ng
co
Gỡ lỗi
an
Debug
th
o ng
du
u
cu
CuuDuongThanCong.com https://fb.com/tailieudientucntt
- 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
- 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
- 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
- “ 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
- 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
- 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
- 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
- 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
- “ 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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