GIỚI THIỆU Một chương trình được biên dịch thành công không chắc chạy đúng theo logic.. Ví dụ chương trình giải phương trình bậc nhất như sau: Bấm F7 để dịch chương trình, trình biên dị
Trang 1Người soạn: Nguyễn Hải Minh Email: nhminh@fit.hcmuns.edu.vn
CHỦ ĐỀ: DEBUG TRÊN VC++ 6.0
-oOo -
I GIỚI THIỆU
Một chương trình được biên dịch thành công không chắc chạy đúng theo logic
Ví dụ chương trình giải phương trình bậc nhất như sau:
Bấm F7 để dịch chương trình, trình biên dịch thông báo không có lỗi:
Nhưng khi chạy với a = 2, b = 1, chương trình cho kết quả sai !!!
Trang 2Tệ hơn, chương trình bị dừng đột ngột khi ta nhập a = 0, b = 1 ?!!
ª Giải pháp: theo dõi từng dòng code để tìm ra dòng chứa lỗi sai (lỗi logic) => Phương pháp này gọi là DEBUG
II CÁC THAO TÁC ĐỂ DEBUG MỘT CHƯƠNG TRÌNH
1 Debug từ dòng code thứ 1 đến dòng code cuối cùng
# Bước 1: Bấm F7 để dịch chương trình
# Bước 2 : Nếu chương trình biên dịch thành công (không có lỗi), bấm F10 để
bắt đầu Debug Mũi tên màu vàng xuất hiện trước dòng code đang theo dõi
Trang 3# Bước 3: Bấm tiếp F10 để chuyển sang dòng code tiếp theo (bỏ qua dòng khai báo biến), mũi tên màu vàng di chuyển xuống tương ứng
* Lưu ý: ở cửa sổ Context đã xuất hiện 3 biến a, b, x và giá trị hiện thời của
Trang 4# Bước 4: Bấm tiếp F10, câu lệnh printf thực hiện xong, mũi tên vàng di chuyển xuống hàm scanf, màn hình xuất ra chuỗi tương ứng:
# Bước 5: Bấm tiếp F10, câu lệnh scanf thực hiện xong, chương trình dừng lại chờ người dùng nhập vào 2 số a, b mới chuyển sang dòng code tiếp theo
* Lưu ý: Sau khi nhập xong a, b, giá trị 2 biến này trong cửa sổ Context thay đổi theo
Trang 5# Bước 6: Bấm tiếp F10, dòng x = (-b)/a thực hiện xong, kết quả biến x thay đổi trong cửa sổ Context:
) Rõ ràng chính câu lệnh x = (-b)/a đã làm chương trình chạy sai logic Tìm hiểu kỹ dòng code này, ta sẽ phát hiện được nguyên nhân chính là phép chia (-b)/a
đã được làm tròn thành số nguyên:
(-1)/2 = -0.5 làm tròn thành 0 ) Cách giải quyết: ép kiểu a hoặc b thành số thực và thay khai báo x thành khai báo kiểu số thực, đồng thời sửa đặc tả biến x trong câu lệnh printf cuối cùng
) Dịch lại chương trình (F7) và chạy (Ctrl+F5), chương trình đã cho kết quả đúng:
float x;
x = ( float )(-b)/a; //Hoặc x = (-b)/ float (a);
printf("Nghiem cua phuong trinh %ix + %i = 0 la: % f \n",a,b,x);
Trang 6) Tương tự, nếu Debug chương trình trên (trước khi sửa) và nhập vào a=0, b=1 , ta sẽ gặp thông báo lỗi tại dòng code x=(-b)/anhư sau:
Lỗi chia một số nguyên cho 0
Gặp lỗi này, chương trình không thể chạy tiếp được, bấm Shift+F5 để thoát
khỏi chế độ Debug
2 Debug một dòng code định trước
Giả sử bạn đã biết hoặc nghi ngờ lỗi logic nằm ở dòng code thứ i nào đó trong chương trình và chỉ muốn chạy ngay đến dòng code ấy để kiểm tra:
# Bước 1: Biên dịch chương trình (F7)
# Bước 2: Đặt Breakpoint (bấm phím F9) tại dòng code bạn muốn chạy đến, lưu ý dấu chấm tròn màu đỏ xuất hiện ngay tại dòng code đó
Trang 7# Bước 3: Bấm F5 để chạy Debug, chương trình sẽ dừng lại ngay dòng code
đã đặt breakpoint
# Bước 4: Bấm F10 để chuyển đến dòng tiếp theo (dòng i+1) hay bấm F5 để chuyển đến dòng breakpoint tiếp theo
3 Một số phím tắt trong VC++ 6.0
• F7: Biên dịch (build) chương trình
• F4: Phân tích lỗi nếu quá trình biên dịch có lỗi
• F9: Đặt breakpoint (chỉ có hiệu lực nếu chạy Debug)
• F5: Chạy Debug, dừng tại dòng đặt Breakpoint (nếu không có breakpoint,
chương trình sẽ chạy cho đến hết và tự động đóng)
• F10: Chạy Debug từng dòng code
• Ctrl+F10: Đặt con trỏ chuột đến 1 dòng code rồi bấm Ctr+F10, chương
trình sẽ chạy thẳng đến dòng code đó
• F11: Chạy Debug vào hàm con (nếu có)
Trang 8• Ctrl+F5: chạy chương trình trực tiếp (không Debug)
III BÀI TẬP ÁP DỤNG
1 Debug thử project Vidu2 trong thư mục Vidu2_VC6 (làm từng bước như hướng dẫn trên)
2 Debug thử các bài tập đã làm trong tuần 1