Gỡ rối (debug) trong Visual Studio

Hướng dẫn những thao tác cơ bản khi gỡ rối (debug) một chương trình trong môi trường Visual Studio.

Chú ý:

Các phím tắt sử dụng trong bài viết nằm trong bộ phím tắt Visual C# 2005. Bạn có thể không quan tâm đến các thông tin phím tắt trong bài này nếu bạn sử dụng bộ phím tắt khác. Bài viết có thể bạn sẽ cần: Cấu hình bộ phím tắt trong Visual Studio.

 

A. Một số khái niệm liên quan

B. Làm việc với Breakpoint

C. Xem giá trị các biến khi debug

D. Cho chương trình "chạy từ từ"

E. Một số phím nóng cần nhớ

 

A. Một số khái niệm liên quan

Để học được một ngôn ngữ lập trình, đối với những người mới bắt đầu, điều đặc biệt cần thiết là phải biết cách "gỡ rối" (debug) chương trình. Bài viết này sẽ cố gắng giúp những người mới bắt đầu biết cách làm sao để làm điều này một cách hiệu quả trong môi trường Visual Studio.

"Chạy" chương trình

Có thể hiểu nôm na, một chương trình sẽ chạy bắt đầu từ dòng lệnh đầu tiên sau dấu { của hàm main và sẽ chấm dứt sau khi thực hiện xong lệnh cuối cùng trước dấu } của hàm main. Trong quá trình chạy, có thể có những đoạn đường "thẳng", những đoạn đường "rẽ" (lệnh rẽ nhánh như if, switch), những đoạn đường vòng (lệnh lặp như while, do..while,..), những đoạn đường nhỏ hơn (hàm).

Điểm dừng chương trình (breakpoint)

Như vậy, để có thể gỡ rối được chương trình, trước tiên phải biết được "đoạn rối" của nó, tức chương trình bị lỗi ở đoạn nào. Visual Studio (cũng như hầu hết các IDE khác) đều cho phép lập trình viên "tạm dừng" chương trình hay cho chương trình "chạy từ từ" tại một số đoạn nào đó. Vị trí mà chúng ta muốn chương trình "tạm dừng" để chúng ta có thể xem cho kỹ "cục rối" như thế nào (để mà gỡ) và có thể cho nó "chạy từ từ" để xem kỹ từng múi rối (xem giá trị các biến và mã xử lý chúng) được gọi là điểm dừng chương trình hay breakpoint. Từ bây giờ sẽ gọi breakpoint cho tiện.

Cửa sổ Locals, cửa sổ Watch

Hai cửa sổ là nơi mà ta có thể xem giá trị các biến khi ta đang debug chương trình đang. Tuy nhiên, cửa sổ Locals là nơi chứa tất cả các biến trong phạm vi hiện tại còn cửa sổ Watch là nơi ta có thể xem bất kỳ biết nào, biểu thức nào hay xem bất kỳ kiểu nào ta mong muốn.

B. Làm việc với Breakpoint

Tạo một breakpoint

Thực hiện 1 trong 3 cách sau:

Cách 1:  Di chuyển con nháy đến hàng tương ứng sau đó chọn DebugToggle Breakpoint

Cách 2: Di chuyển con nháy đến hàng tương ứng sau đó nhấn phím F9

Cách 3: Kích chuột vào cột mốc tại hàng tương ứng

Nếu thao tác thành công, tại hàng tương ứng trong cột mốc sẽ có một nút tròn màu đỏ như trong hàng 42 và 48 của hình 1.


Hình 1

 

Hủy một breakpoint

Để hủy 1 breakpoint, bạn chỉ việc thực hiện thao tác như khi tạo 1 breakpoint ở trên.

Quản lý danh sách breakpoint

Bạn có thể mở cửa sổ Breakpoints để quản lý các breakpoint đang có bằng cách: chọn DebugWindowsBreakpoints (hình 2). Cửa sổ Breakpoints sẽ hiện ra như ở hình 1.


Hình 2

Kích hoạt/thôi kích hoạt các breakpoint

Trong cửa sổ Breakpoints, ô chọn phía trái của mỗi breakpoint chính là thông tin breakpoint hiện tại có được kích hoạt hay không. Nếu không được kích hoạt thì chương trình sẽ "không dừng" tại breakpoint này (coi như nó không tồn tại).

Có thể kích vào ô chọn này để kích hoạt hay thôi kích hoạt các breakpoint. Nếu muốn kích hoạt hay thôi kích hoạt tất cả các breakpoint, kích vào biểu tượng .

Hủy cùng lúc nhiều breakpoint

Trong cửa sổ Breakpoints, bạn có thể:

  • Xóa cùng lúc nhiều breakpoint bằng cách đè phím Ctrl và kích chuột lên các breakpoint tương ứng sau đó kích vào nút .
  • Xóa tất cả các breakpoint bằng cách kích vào nút

Tạo điểm dừng có điều kiện (conditional breakpoint)

Thông thường, chương trình sẽ dừng tại hàng nào có đặt breakpoint. Tuy nhiên, nếu hàng này nằm trong một vòng lặp (một hàm đệ quy) và chúng ta lại chỉ muốn chương trình sẽ dừng tại hàng này trong một vòng lặp (hay một lần gọi đệ quy) cụ thể nào đó thì có 2 cách để làm được điều này:

  1. Tạo 1 breakpoint tại hàng muốn dừng sau đó cứ nhấn F5 cho đến khi chương trình chạy đến vòng lặp (hay lần gọi đệ quy) mong muốn. Cách này rất mất công, ví dụ nếu ta muốn dừng tại vòng lặp thứ 99 thì phải nhấn F5 ít nhất 98 lần.
  2. (tiện lợi hơn) Tạo 1 breakpoint tại hàng muốn dừng sau đó kích phải tại breakpoint này và chọn Condition (hình 3). Cửa sổ Breakpoint Condition xuất hiện (hình 3), sau đó bạn chỉ việc nhập điều kiện vào vùng condition. Như ví dụ trong hình 3, tôi muốn chương trình dừng khi i=5j=3.

 
Hình 3

C. Xem giá trị các biến khi debug

Cửa sổ Locals

Để mở cửa sổ Locals, bạn nhấn tổ hợp phím Ctrl+D,L (đè phím Ctrl, gõ D sau đó gõ tiếp L) hoặc chọn DebugWindowsLocals (xem hình 4)


Hình 4

Cửa sổ Watch

Để mở cửa sổ Locals, bạn nhấn tổ hợp phím Ctrl+D,W (đè phím Ctrl, gõ D sau đó gõ tiếp W) hoặc chọn DebugWindowsWatchWatch 1 (xem hình 4). Một chú ý là có đến 4 cửa sổ Watch nên trường hợp có quá nhiều biến cần theo dõi thì có thể mở tiếp một số cửa sổ Watch còn lại để xem.

D. Cho chương trình "chạy từ từ"

Chạy từng lệnh

Cách tiện nhất để chạy từng lệnh là sử dụng phím nóng. Có hai hình thức chạy từng lệnh:

  1. Chạy lướt qua hàm (nhấn phím F10 hoặc chọn DebugStep Over): nếu dòng hiện tại có lời gọi đến một nào nào đó trong chương trình thì nó sẽ "lướt" qua hàm này, nghĩa là nó sẽ "chạy nhanh" qua chứ không đi vào để chạy từng lệnh trong hàm này.
  2. Đi vào hàm (nhấn phím F11 hoặc chọn DebugStep Into): nếu dòng hiện tại có lời gọi đến một nào nào đó trong chương trình thì nó sẽ đi vào để chạy từng lệnh trong hàm này.

Ta dễ thấy rằng, trường hợp dòng hiện tại mà chương trình đang đứng không chứa lời gọi đến một hàm nào khác thì nhấn phím F10 hay F11 là như nhau.

Chạy nhanh ra khỏi hàm

Trường hợp muốn chạy nhanh ra khỏi hàm mà chương trình đang dừng lại, chỉ đơn giản nhấn tổ hợp phím Shift+F11 (đè phím Shift và gõ phím F11) hoặc chọn DebugStep Out.

Dừng chương trình

Khi đang debug chương trình, muốn sửa gì đó trong mã nguồn hay không muốn chạy tiếp nữa thì bạn nhấn Shift+F5 (đè phím Shift và gõ phím F5) hoặc chọn DebugStop Debugging để dừng chương trình.

E. Một số phím nóng cần nhớ

 F5  bắt đầu "chạy" chương trình  F10  chạy từng lệnh (lướt qua hàm) 
 Shift+F5  dừng chương trình  F11  chạy từng lệnh (đi vào qua hàm)
 F9  tạo/hủy một breakpoint   Shift+F11  chạy nhanh ra khỏi hàm hiện tại 

Bình luận (2)

Viết Bình luận
  • @cường

    here

  • cường
    cho em hỏi

    thầy cho em hỏi sao trong microsoft visual C++ 2010 không có cái mục Debug → Windows → Locals và Debug → Windows → Watch như trong hình của thầy ở phía trên vậy thầy,

Viết Bình luận

Đã đóng bình luận