Bài giảng Kỹ thuật lập trình: Bài 9 - ThS. Nguyễn Thành Trung

20 12 0
Bài giảng Kỹ thuật lập trình: Bài 9 - ThS. Nguyễn Thành Trung

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

“ 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

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

Ngày đăng: 09/03/2021, 05:09

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan