Bài viết này được bạn Nguyễn Thị Linh dịch từ nguồn ScottGu’s Blog.

Hôm nay blog đăng 1 vài mẹo debug hữu ích mà bạn có thể sử dụng với Visual Studio. Những mẹo hay cho hầu hết các developer(người phát triển ứng dụng) sử dụng Visual Studio dường như không biết (mặc dù hầu hết đã có trong sản phẩm). Hi vọng rằng bài viết này sẽ giúp bạn khám phá chúng. Chúng rất dễ học, và có thể giúp bạn tiết kiệm thời gian

Run to Cursor (Chạy với con trỏ)(Ctrl + F10)

Thông thường bạn nhìn mọi người debug ứng dụng bằng cách nhấn vào breakpoint ở đầu dòng và sau đó lại sử dụng F10/F11 để chạy từng bước theo code cho đến đoạn code thực sự muốn debug. Trong một vài trường hợp họ quan sát cẩn thận mỗi câu lệnh khi mà nhấn từng bước (khi dùng F10/F11). Tuy nhiên mọi người chỉ cố nhanh chóng đến dòng code mà họ thực sự quan tâm – trong trường hợp này F10/F11 không phải là cách tốt nhất

Thay vào đó, bạn có thể tận dụng tính năng “chạy con trỏ chuột” được hỗ trợ bở chương trình debug. Đơn giản là đặt vị trí con trỏ trên dòng code mà bạn muốn chạy ứng dụng, sau đó nhấn tổ hợp phím Ctrl + F10.Điều này sẽ chạy ứng dụng đến vị trí dòng bạn muốn debug – tránh việc phải dùng F10/F11 nhiều lần. Nó làm việc ngay cả với dòng code chạy trong các hàm hoặc lớp riêng của chương trình debug hiện tại

Conditional Breakpoints (điều kiện breakpoints)

Một điều phổ biến khác mà chúng ta thường thấy là các trường hợp nơi mà developer đặt breakpoint, chạy ứng dụng, thử đầu vào, nhấn 1 breakpoint, và tự kiểm tra, nếu một vài điều kiện đúng trước khi quyết định kiểm tra thêm. Nếu kịch bản không phù hợp với những gì họ đang có, họ nhấn F5 để tiếp tục ứng dụng, thêm vài đầu vào khác và lặp lại quá trình thủ công

Điều kiện breakpoint của Visual Studio có khả năng cung cấp nhiều cách dễ hơn để xử lý điều này. Điều kiện breakpoint cho phép bạn nhấn(break) chỉ khi nếu 1 vài điều kiện cụ thể mà bạn chỉ định. Chúng giúp bạn tránh việc kiểm tra hoặc bắt đầu lại 1 cách thông thường ứng dụng, và bạn có thể làm cho toàn bộ quá trình debug nhanh hơn rất nhiều theo hướng dẫn sử dụng và đỡ tẻ nhạt.

Làm thế nào để kích hoạt 1 breakpoint có điều kiện

Thiết lập 1 breakpoint có điều kiện rất dễ dàng. Nhấn F9 trong code để đặt 1 breakpoint trên 1 dòng cụ thể


Sau đó kích chuột phải trên breakpoint “vòng tròn màu đỏ” và chọn “Condition”


Nó sẽ hiện ra 1 hộp thoại cho phép bạn chỉ định breakpoint nếu điều kiện đúng. Ví dụ, chúng ta có thể chỉ ra rằng chúng ta muốn break nếu kích thước của danh sách vùng paginatedDinners ít hơn 10 bằng việc viết biểu thức sau:


Bây giờ khi tôi chạy lại ứng dụng và làm 1 cái tìm kiếm, chương trình debug sẽ chỉ chạy nếu tôi thực hiện 1 cái tìm kiếm trả về ít hơn 10 dinners. Nếu mà nhiều hơn 10 dinners(bữa ăn) thì breakpoint sẽ không bị ảnh hưởng.

Hit Count Feature (Tính năng đếm số lượt)

Đôi lúc bạn chỉ muốn break 1 điều kiện số lần đúng. Ví dụ chỉ break 5 lần ít hơn 10 dinners được trả về từ việc tìm kiếm

Bạn có thể kích hoạt bằng cách click chuột phải về breakpoint và chọn lệnh “Hit count”


Sẽ có 1 hộp thoại cho phép bạn chỉ ra breakpoint mà được đếm số lần 1 điều kiện được đáp ứng, hoặc là tất các lần được đáp ứng, hoặc các lần sau n lần xuất hiện


Machine/Thread/Process Filtering (Bộ máy/ luồng/quá trình lọc)

Bạn có thể kích chuột phải trên breakpoint và chọn lệnh “Filter..” để chỉ ra rằng 1 breakpoint chỉ được nhấn nếu xảy ra trên 1 bộ máy cụ thể, hoặc 1 quá trình cụ thể, hoặc 1 luồng cụ thể

TracePoints (theo dõi điểm) – Custom Actions When Hitting a BreakPoint


(tùy chỉnh hoạt động khi nhấn 1 breakpoint)

Một tính năng debug nhiều người không biết là khả năng sử dụng TracePoint. Một TracePoint là 1 breakpoint mà có 1 số hoạt động tùy chỉnh gây ra khi breakpoint được nhấn. Tính năng này đặc biệt hữu dụng khi mà bạn muốn quan sát hành vi trong ứng dụng mà không vi phạm vào trình gỡ lỗi (the debugger)

Tôi sẽ sử dụng 1 ứng dụng Console để chứng minh làm thế nào chúng ta có thể tận dụng lợi thế của TracePoints. Bên dưới là 1 thực hiện đệ quy của Fibonacci sequence ( là dãy vô hạn các số tự nhiên bắt đầu bằng hai phần tử 0 và 1, các phần tử sau đó được thiết lập theo quy tắc mỗi phần tử luôn bằng tổng hai phần tử trước nó)


Trong ứng dụng trên, chúng ta sử dụng Console.Writeline() để đưa ra giá trị dãy đệ quy Fibonacci cuối cùng cho 1 đầu vào cụ thể. Điều gì xảy ra nếu chúng ta muốn quan sát trình tự dãy đệ quy Fibonacci hoạt động trong chương trình debug – mà không dừng việc thực thi của nó? TracePoint giúp bạn dễ dàng làm điều này

Setting up a TracePoint (Thiết lập 1 TracePoint)

Bạn có thể kích hoạt 1 TracePoint bằng cách sử dụng F9 để đặt 1 breakpoint trên 1 dòng code, sau đó kích chuột phải trên breakpoint và chọn lệnh “When Hit..”


Sẽ xuất hiện 1 hộp thoại cho phép bạn chỉ định những gì nên xảy ra khi breakpoint được nhấn


Ở trên chỉ ra rằng bạn muốn in thông báo theo dõi bất cứ lúc nào điều kiện breakpoint được đáp ứng. Bạn muốn giá trị đầu ra của biến x như 1 phần của thông báo. Biến cục bộ có thể tham chiếu sử dụng cú pháp {variableName}. Cũng có lệnh được xây dựng (như $CALLER, $CALLSTACK, $FUNCTION,…) có thể được sử dụng cho ra giá trị chung trong thông báo theo dõi của bạn

Chúng ta cũng có thể tích vào hộp chọn “continue execution” ở dưới cùng – điều này chỉ ra rằng chúng ta không muốn ứng dụng bị ngắt trong chương trình debug. Thay vào đó nó sẽ tiếp tục chạy – với chỉ một sự khác biệt duy nhất rằng thông báo theo dõi tùy chính sẽ cho ra mỗi lần điều kiện breakpoint được đáp ứng

Và bây giờ khi chúng ta chạy ứng dụng sẽ thấy rằng thông báo theo dõi tùy chỉnh tự động hiện ra cửa số “output” của Visual Studio – cho phép chúng ta theo dõi hành động đệ quy của ứng dụng


Bạn có thể lựa chọn wire-up lắng nghe theo dõi tùy chỉnh trong ứng dụng của bạn – trong trường hợp này các thông báo bạn in từ TracePoints sẽ được dẫn ra thay vì cửa sổ đầu ra VS

TracePoint – Running a Custom Macro (Chạy như 1 Custom Macro)

Trong 1 bài nói chuyện tôi đã đưa ra lần trước ở London, 1 vài khán giả yêu cầu liệu nó có thể tự động xuất ra tất cả các biến cụ bộ khi 1 TracePoint được nhấn

Khả năng này không được xây dựng trong Visual Studio – nhưng có thể kích hoạt bằng cách viết 1 Macro(macro là một chương trình con được viết sẵn theo một mục đích nào đó, để thi hành một lệnh , một công việc nào đó theo nguyện vọng của người lập trình) tùy chỉnh trong Visual Studio, và sau đó dẫn 1 TracePoint để gọi đến Macro khi nó được nhận ra. Để kích hoạt điều này, mở Macros IDE trong Visual Studio (Tools->Macros->Macros IDE menu command). Sau đó dưới nút MyMacros của project, chọn 1 module hoặc tạo cái mới (ví dụ: thêm 1 tên là (“UsefulThings”)). Sau đó paste code macro VB sau đây vào module và lưu nó:

 Sub DumpLocals()

    Dim outputWindow As EnvDTE.OutputWindow

    outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutpu.Object

    Dim currentStackFrame As EnvDTE.StackFrame

    currentStackFrame = DTE.Debugger.CurrentStackFrame

  outputWindow.ActivePane.OutputString(“*Dumping Local Variables*” + vbCrLf)

    For Each exp As EnvDTE.Expression In currentStackFrame.Locals

        outputWindow.ActivePane.OutputString(exp.Name + ” = “ +exp.Value.ToString() + vbCrLf)

        Next

    End Sub

Trên đoạn vòng lặp code macro thông qua cụm cấu trúc hiện tại và kiết xuất tất cả biến cục bộ lên cửa sổ đầu ra

Sử dụng DumpLocals Custom Macro

Chúng ta có thể tận dụng lợi thế của macro “DumpLocals” tùy chỉnh bằng cách sử dụng ứng dụng bổ sung đơn giản dưới đây:


Chúng ta sẽ sử dụng F9 để đặt 1 breakpoint trên câu lệnh trả về trong phương thức “Add” ở trên. Sau đó click chuột phải trên breakpoint và chọn lệnh “When hit”

Sẽ có 1 hộp thoại bên dưới. Không như trước nơi mà chúng ta sử dụng hộp lựa chọn “In ra 1 thông báo”(print a message) và quy định bằng tay các biến mà muốn hiển thị đầu ra, lúc này thay vì chọn “Run a macro” và trỏ đến UsefulThings tùy chỉnh. Macro DumpLocals tạo bên dưới:


Chúng ta sẽ giữ hộp đánh dấu “continue execution” để chương trình tiếp tục chạy thậm chí khi TractPoints được nhấn

Runing a Application (chạy 1 ứng dụng)

Bây giờ khi nhấn F5 và chạy ứng dụng, ta sẽ nhìn thầy đầu ra hiện bên dưới trong cửa sổ “output” của Visual Studio khi phương thức Add được gọi. Lưu ý cách mà macro tự động liệt kê tên và giá trị của mỗi biến cục bộ khi TracePoint được nhấn:


Tóm tắt

Chương trình debug Visual Studio vô cùng phong phú. Tôi khuyên bạn nên dành thời gian để thực sự tìm hiểu tất cả các tính năng của nó. Mẹo và thủ thuật ở trên chỉ là một vài trong rất nhiều tính năng nó cung cấp mà hầu hết mọi người không biết.