Danh mục

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    
10.10.2023

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 ...

Tài liệu được xem nhiều: