Kỹ thuật Debug trong C
Số trang: 11
Loại file: pdf
Dung lượng: 125.91 KB
Lượt xem: 8
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Đối với lập trình viên, việc đề ra ý tưởng để giải quyết vấn đề đã là khó khăn, nhưng việc cài đặt được ý tưởng đó cũng không đơn giản. Đôi khi chỉ vì một dấu “;” hay sai kiểu dữ liệu cũng có thể biến bản cài đặt trở nên vô nghĩa vì không thể hiện đúng ý tưởng đề ra. Nhưng làm sao để phát hiện ra một con sâu (lỗi-bug) trong một “rừng lệnh”? Câu trả lời rất đơn giản nhưng khó thực hiện : chúng ta phải kiên nhẫn “vạch lá tìm sâu” !...
Nội dung trích xuất từ tài liệu:
Kỹ thuật Debug trong C Kỹ thuật Debug trong C nvhoang@fit.hcmuns.edu.vn.Đối với lập trình viên, việc đề ra ý tưởng để giải quyết vấn đề đã là khó khăn, nhưng việccài đặt được ý tưởng đó cũng không đơn giản. Đôi khi chỉ vì một dấu “;” hay sai kiểu dữliệu cũng có thể biến bản cài đặt trở nên vô nghĩa vì không thể hiện đúng ý tưởng đề ra.Nhưng làm sao để phát hiện ra một con sâu (lỗ i-bug) trong một “rừng lệnh”? Câu trả lờirất đơn giản nhưng khó thực hiện : chúng ta phải kiên nhẫn “vạch lá tìm sâu” ! Đó là lýdo tại sao chúng ta phải nắm kỹ thuật debug.Bài viết này nhằm hướng dẫn các bạn sử dụng kỹ thuật debug để tìm lỗ i thông qua việcphân tích các ví dụ, đồng thời cũng đưa ra một số bài tập từ dễ đến khó để các bạn có thểtừng bước nắm vững kỹ thuật debug.1 Các loại lỗi trong chương trình: Lỗi sai cú pháp:1.1 Đây là những lỗ i sai xảy ra khi biên dịch chương trình (sau khi nhấn F9). Khi gặplỗ i này, chúng ta nên nhấn Ctrl-F1 để gọi giúp đỡ hoặc xem lại tài liệu tham khảo. Ở đâykhông để cập chi tiết đến vấn đề này. Lỗi sai logic:1.21.2.1 Khái niệm : Các lỗ i sai logic là những lỗ i khi biên dịch, trình biên dịch không báo lỗ i. Những lỗ inày nằm tiềm ẩn trong chương trình và làm cho chương trình của chúng ta đưa ra nhữngkết quả không như mong muốn.Các lỗ i sai logic thường xuất phát từ 2 nguyên nhân :- Do “nhầm” (nhầm chứ không sai) cú pháp dẫn đến sai logic.- Do ý tưởng để giải quyết bài toán đã sai ngay từ đầu. Loại lỗ i này bình thường rất khó nhận ra. Dĩ nhiên, nếu tinh ý đôi khi chúng ta vẫn cóthể phát hiện ra những lỗ i này, nhưng việc phát hiện này đòi hỏi chúng ta phải nắm rấtvững cú pháp C, cũng như logic của chương trình cộng thêm một chút kinh nghiệm. Tuynhiên, trong đa số các trường hợp chúng ta phải thực hiện công đoạn debug để tìm ra cáclỗ i sai logic này.1.2.2 Một số ví dụ về lỗi sai logic :Sau đây là một số ví dụ về lỗ i sai logic:VD1 : Xét hàm hoán vị 2 số nguyênvoid HoanVi(int a, int b){ int c = a; a = b; b = c;}Thoạt nhìn, chúng ta hàm này không có vấn đề gì cả ! Nhưng nếu tinh ý một chút chúngta sẽ thấy cách truyền tham số của hàm là sai, đây là cách truyền tham trị chứ không phảitruyền tham biến, do đó giá trị của a, b sẽ không thay đổ i sau khi hàm thực hiện xong.Chúng ta phải sửa lại như sau :void HoanVi(int &a, int &b){ int c = a; a = b; b = c;}VD2 : Xét hàm sắp xếp mảng một chiều các số nguyên theo thứ tự tăng dần/*Hàm sắp xếp mảngTham số vào : n – số lượng số nguyên a - mảng một chiều các số nguyên, từ a[0]...a[n-1]*/void SapXepMangTangDan(int n, int a[]){ int i, j; for (int i = 0; i < n; i++); for (int j = 0; j < n; j++) if (a[i] > a[j]) HoanVi(a[i], a[j]);}Nếu như chúng ta chưa từng gõ đoạn mã hàm sắp xếp thì có lẽ chúng ta khó phát hiện rachỗ sai. Nhưng cho dù như vậy chúng ta vẫn có thể phát hiện ra dòng lệnh “for (inti = 0; i < n; i++);” là có vấn đề, tại sao lại có dấu “;” ở cuố i dòng lặp “for” ?Nhưng cho dù bạn có bỏ dấu “;” đi thì hàm này vẫn sai. Trong trường hợp này chúng tabắt buộc phải debug để loại đi những lỗ i logic.Các bạn có thể tham khảo phục lục để xem một số lỗ i sai logic thường gặp.2 Cơ chế thực thi chương trình :Để có thể thực hiện công việc debug, trước hết chúng ta sẽ tìm hiểu cơ chế thực thi củamột chương trình C.(Để cho đơn giản, tôi xin phép chỉ trình bày việc thực thi mức ngôn ngữ C, chứ khôngtrình bày ở mức ngôn ngữ assembly).Cơ chế chính thực thi trong chương trình C là thực thi từng dòng lệnh từ trên xuốngdưới, chỉ khi gặp những lệnh rẽ nhánh (if), những lệnh lặp (for, while), những lời gọ ihàm, hay lệnh nhảy (goto) thì C sẽ chuyển đến thực thi dòng lệnh đã được chỉ định, rồilại tuân theo cơ chế từ trên xuống dưới. C luôn luôn bắt đầu thực thi từ hàm main(). Cơ chế chính của việc thực thi :2.11 #include Thực thi từ trên2 #include xuống dưới, bắt đầu từ hàm3 void main()4 { main()5 clrscr(); printf(“Đây là chương trình ví dụ ”);67 getch();8 }Như đã nói trên, C sẽ bắt đầu thực thi chương trình từ hàm void main() : dòng lệnh 4. Sauđó C sẽ tiếp tục thực thi từ trên xuống dưới. Tức là tiếp tục thực thi dòng lệnh 5 : clrscr(),rồi đến dòng lệnh 6 : printf , rồi đến dòng lệnh 7 : getch(). Sau khi thực thi xong dònglệnh 8 : dấu “}”, không còn gì thực thi nữa C sẽ kết thúc việc thực thi.2.2 Các lệnh if...else, while, do..while :Các lệnh này các có tham khảo lý thuyết, xin phép không nêu ra ở đây. Tuy nhi ...
Nội dung trích xuất từ tài liệu:
Kỹ thuật Debug trong C Kỹ thuật Debug trong C nvhoang@fit.hcmuns.edu.vn.Đối với lập trình viên, việc đề ra ý tưởng để giải quyết vấn đề đã là khó khăn, nhưng việccài đặt được ý tưởng đó cũng không đơn giản. Đôi khi chỉ vì một dấu “;” hay sai kiểu dữliệu cũng có thể biến bản cài đặt trở nên vô nghĩa vì không thể hiện đúng ý tưởng đề ra.Nhưng làm sao để phát hiện ra một con sâu (lỗ i-bug) trong một “rừng lệnh”? Câu trả lờirất đơn giản nhưng khó thực hiện : chúng ta phải kiên nhẫn “vạch lá tìm sâu” ! Đó là lýdo tại sao chúng ta phải nắm kỹ thuật debug.Bài viết này nhằm hướng dẫn các bạn sử dụng kỹ thuật debug để tìm lỗ i thông qua việcphân tích các ví dụ, đồng thời cũng đưa ra một số bài tập từ dễ đến khó để các bạn có thểtừng bước nắm vững kỹ thuật debug.1 Các loại lỗi trong chương trình: Lỗi sai cú pháp:1.1 Đây là những lỗ i sai xảy ra khi biên dịch chương trình (sau khi nhấn F9). Khi gặplỗ i này, chúng ta nên nhấn Ctrl-F1 để gọi giúp đỡ hoặc xem lại tài liệu tham khảo. Ở đâykhông để cập chi tiết đến vấn đề này. Lỗi sai logic:1.21.2.1 Khái niệm : Các lỗ i sai logic là những lỗ i khi biên dịch, trình biên dịch không báo lỗ i. Những lỗ inày nằm tiềm ẩn trong chương trình và làm cho chương trình của chúng ta đưa ra nhữngkết quả không như mong muốn.Các lỗ i sai logic thường xuất phát từ 2 nguyên nhân :- Do “nhầm” (nhầm chứ không sai) cú pháp dẫn đến sai logic.- Do ý tưởng để giải quyết bài toán đã sai ngay từ đầu. Loại lỗ i này bình thường rất khó nhận ra. Dĩ nhiên, nếu tinh ý đôi khi chúng ta vẫn cóthể phát hiện ra những lỗ i này, nhưng việc phát hiện này đòi hỏi chúng ta phải nắm rấtvững cú pháp C, cũng như logic của chương trình cộng thêm một chút kinh nghiệm. Tuynhiên, trong đa số các trường hợp chúng ta phải thực hiện công đoạn debug để tìm ra cáclỗ i sai logic này.1.2.2 Một số ví dụ về lỗi sai logic :Sau đây là một số ví dụ về lỗ i sai logic:VD1 : Xét hàm hoán vị 2 số nguyênvoid HoanVi(int a, int b){ int c = a; a = b; b = c;}Thoạt nhìn, chúng ta hàm này không có vấn đề gì cả ! Nhưng nếu tinh ý một chút chúngta sẽ thấy cách truyền tham số của hàm là sai, đây là cách truyền tham trị chứ không phảitruyền tham biến, do đó giá trị của a, b sẽ không thay đổ i sau khi hàm thực hiện xong.Chúng ta phải sửa lại như sau :void HoanVi(int &a, int &b){ int c = a; a = b; b = c;}VD2 : Xét hàm sắp xếp mảng một chiều các số nguyên theo thứ tự tăng dần/*Hàm sắp xếp mảngTham số vào : n – số lượng số nguyên a - mảng một chiều các số nguyên, từ a[0]...a[n-1]*/void SapXepMangTangDan(int n, int a[]){ int i, j; for (int i = 0; i < n; i++); for (int j = 0; j < n; j++) if (a[i] > a[j]) HoanVi(a[i], a[j]);}Nếu như chúng ta chưa từng gõ đoạn mã hàm sắp xếp thì có lẽ chúng ta khó phát hiện rachỗ sai. Nhưng cho dù như vậy chúng ta vẫn có thể phát hiện ra dòng lệnh “for (inti = 0; i < n; i++);” là có vấn đề, tại sao lại có dấu “;” ở cuố i dòng lặp “for” ?Nhưng cho dù bạn có bỏ dấu “;” đi thì hàm này vẫn sai. Trong trường hợp này chúng tabắt buộc phải debug để loại đi những lỗ i logic.Các bạn có thể tham khảo phục lục để xem một số lỗ i sai logic thường gặp.2 Cơ chế thực thi chương trình :Để có thể thực hiện công việc debug, trước hết chúng ta sẽ tìm hiểu cơ chế thực thi củamột chương trình C.(Để cho đơn giản, tôi xin phép chỉ trình bày việc thực thi mức ngôn ngữ C, chứ khôngtrình bày ở mức ngôn ngữ assembly).Cơ chế chính thực thi trong chương trình C là thực thi từng dòng lệnh từ trên xuốngdưới, chỉ khi gặp những lệnh rẽ nhánh (if), những lệnh lặp (for, while), những lời gọ ihàm, hay lệnh nhảy (goto) thì C sẽ chuyển đến thực thi dòng lệnh đã được chỉ định, rồilại tuân theo cơ chế từ trên xuống dưới. C luôn luôn bắt đầu thực thi từ hàm main(). Cơ chế chính của việc thực thi :2.11 #include Thực thi từ trên2 #include xuống dưới, bắt đầu từ hàm3 void main()4 { main()5 clrscr(); printf(“Đây là chương trình ví dụ ”);67 getch();8 }Như đã nói trên, C sẽ bắt đầu thực thi chương trình từ hàm void main() : dòng lệnh 4. Sauđó C sẽ tiếp tục thực thi từ trên xuống dưới. Tức là tiếp tục thực thi dòng lệnh 5 : clrscr(),rồi đến dòng lệnh 6 : printf , rồi đến dòng lệnh 7 : getch(). Sau khi thực thi xong dònglệnh 8 : dấu “}”, không còn gì thực thi nữa C sẽ kết thúc việc thực thi.2.2 Các lệnh if...else, while, do..while :Các lệnh này các có tham khảo lý thuyết, xin phép không nêu ra ở đây. Tuy nhi ...
Tìm kiếm theo từ khóa liên quan:
kỹ thuật lập trình giáo trình kỹ thuật lập trình bài tập kỹ thuật lập trình tài liệu kỹ thuật lập trình chuyên ngành kỹ thuật lập trìnhGợi ý tài liệu liên quan:
-
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 247 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 188 0 0 -
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 181 0 0 -
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 147 0 0 -
Luận văn: Nghiên cứu kỹ thuật giấu tin trong ảnh Gif
33 trang 147 0 0 -
Báo cáo thực tập Công nghệ thông tin: Lập trình game trên Unity
27 trang 115 0 0 -
Giáo trình về phân tích thiết kế hệ thống thông tin
113 trang 113 0 0 -
LUẬN VĂN: Tìm hiểu kỹ thuật tạo bóng cứng trong đồ họa 3D
41 trang 104 0 0 -
Bài giảng Kỹ thuật lập trình - Chương 10: Tổng kết môn học (Trường Đại học Bách khoa Hà Nội)
67 trang 103 0 0 -
Giáo trình Nhập môn lập trình VB6: Phần 2
184 trang 84 0 0