Debugging Tips and Tricks for .NET Developers with Visual Studio


Debugging ứng dụng với Visual Studio 2015 một cách hiệu quả, cải thiện thời gian phát triển sản phẩm và kiểm soát lỗi chặt chẽ.

Bài trước, mình đã giới thiệu công cụ Visual Studio 2015 để khám phá nền tảng dot Net và cross platform với Xamarin được tích hợp trong công cụ này. Như tiêu đề, chúng ta sẽ sơ lược điểm qua Debugging Tips và Tricks với VS.

Trước khi đi vào vấn đề, bạn hãy tải source code demo tại:
https://github.com/Microsoft/vs-diag-samples/tree/master/Project_Archive

và chạy thử để kiểm tra ứng dụng hoạt động!

Demo #1

Với việc biên dịch chương trình bằng Command Promt, chúng ta có thể truyền các giá trị từ command line cho chương trình đó khi nó được thực hiện. Những giá trị này được gọi là tham số dòng lệnh – command line argument, việc này có thể cần thiết và hữu dụng khi bạn thay đổi giá trị nào đó trong chương trình của mình mà không làm thay đổi các đoạn code đã tạo và để flexible hơn, visual studio hỗ trợ chúng ta debug theo cách này mà không cần mở bất cứ command line interface nào.

Solution Explorer –> tại ProjectArchive.WPF, chuột phải vào MainWindows.xaml –> < >View Code F7  –> Ctrl + F, nhập vào: “TitleParameter” –> Enter

dotnettip1

đây là 1 mô tả dễ hình dung hơn cho câu caption phía trên. Với phần demo này chúng ta có 1 flag “/conference” gán cho 1 biến string (TitleParameter ) để hiển thị giá trị khác nhau của TitleParameter. Thực hiện các bước như sau:

Tại Solution Explorer –> Chuột phải vào ProjectArchive.WPF –> Properties –> Chọn Debug –> Trong thuộc tính Command Line Arguments, nhập vào command line parameters: /conference –> F5 để Start Debug.
dotnettip2

Như bạn thấy, kết quả hiện lên trên giao diện ứng dụng WPF với Title là Hello /conference!
Lần này thử nhập vào /conference BuildPeeps  –>F5 lần nữa xem kết quả.
Giá trị mong đợi ở đây là “Hello BuildPeeps!”.
Nhưng kết quả trả về như hình bên dưới – không nhận được giá trị “BuildPeeps”, vậy phải chăng do lỗi logic code ở đâu đó trong mã nguồn?

dotnettip3

Chúng ta sẽ tìm ra bug bằng step by step ngay sau đây!

dotnettip4

Right Click on ProjectArchive.WPF–>Set as StartUp Project–>F10

Trên Menu bar, chọn Debug. Tại đây có 2 chế độ debug gần như nhau (Step Into & Step Over). Chọn Step Over F10 trong phần demo này. Để xem hoạt động diễn ra tiếp theo khi chạy chương trình, nhấn F10.

Locals là 1 cửa sổ hỗ trợ trực quan, hiển thị từng kết quả, biến trả về của các Function, biến. Thay vì rê chuột vào từng hàm, từng biến để nhìn thấy kết quả, thì Locals là sự hỗ trợ đắc lực từ Visual Studio

F10 = Continue

F10

Di chuyển, bỏ qua code line nào đó khi debug bằng 2 cách:
+ c1: Chuột phải vào dòng code muốn chuyển đến–> Set Next Statement Ctrl+Shift+ F10
+ c2: Nhấp giữ mũi tên và drag đến code line muốn chuyển hướng debug

dotnettip6

 

Khi F10 đến dòng code 200, chúng ta có đến hơn 2 function, và để xem nhanh từng hàm chức năng này thực hiện như thế nào: Right click vào code line –> Step Into Specific –> Chọn function muốn phân tích. Demo này bạn hãy chọn StringProvider.GetConference

dotnettip7

Tới đây, tại hàm GetConference(), chuột phải vào dòng conf = args[x]; chọn Run To Cursor – Đây là chức năng hữu dụng, nếu muốn bỏ qua và không debug những đoạn code không cần thiết, không cần phải đặt break point, remove break point hay nhấn F10 liên tục để đến dòng code muốn phân tích.

Trở lại vấn đề: Tại sao giá trị “BuidPeeps” nhập từ Command Line Arguments không được hiển thị?
Nhìn vào Locals windows, có thể thấy “BuidPeeps” là đối số thứ 2, nhưng khi phần tử x đạt giá trị =1 thì lệnh break; đã làm thoát khỏi vòng lặp, như vậy “conf = /conference” thay vì “= BuidPeeps” như mong muốn:
dotnettip8

Để khắc phục, ta sửa trực tiếp dòng code 158 thành conf = args[x+1]; mà không cần dừng quá trình debug. Nhưng giá trị vừa thay đổi không được thực thi, ta phải “quay ngược thời gian”. Chọn Step Out Shift+F11, chức năng này sẽ dừng quá trình đang thực thi và trở lại dòng code trước đó. Xem demo bên dưới.

dotnettip9

Ah! Như vậy, sau khi sửa source code “BuildPeeps” đã hiển thị. Bạn hãy chú ý các bước đã demo. Cửa sổ Call Stack như phần lịch sử, là danh sách các hàm được gọi theo thứ tự thời gian ngược, nghĩa là hàm gọi sau sẽ nằm đầu danh sách, và như bạn đã thấy hiểu quả của Call stack.

Và phần cuối cùng mình muốn review trong phần Demo#1 là Immediate Window

Để hiển thị Immediate Window . Trên menu Visual Studio, chọn Debug –> Windows –> Immediate Ctrl + Alt +I

Immediate Window sử dụng để thực thi câu lệnh, in giá trị biến, bạn có thể nhập vào biểu thức (expressions) nào đó để kiểm tra và thực thi trong quá trình debug ứng dụng, so fast (y)

Đây là 2  nguồn tham khảo về IW

http://stackoverflow.com/questions/794255/how-do-you-use-the-immediate-window-in-visual-studio 
https://msdn.microsoft.com/en-us/library/ms171362(v=vs.100).aspx

Kết thúc. Ở phần Demo#1 này bạn đã biết được 1 vài thủ thuật trong debug mà Visual Studio đã hỗ trợ cho lập trình viên:
dotnettip10

Demo#2

Quay trở lại ứng dụng và build project lần nữa! (press F5) –> Run Tests. Bạn sẽ thấy “Test Results” Failed tại “desktop”.
dotnettip12

Phải debug xem có chuyện gì xảy ra?

– Tại Solution Explorer, trong ProjectArchive.SharedLibrary, mở “AppDataProvider.cs”. Đặt 1 break point tại dòng 37. Click vào “Run Tests” lần nữa.
– Lúc này “decodedType” với giá trị là “Web”, chúng ta có thể nhấn “Continue” để tiếp tục quá trình debug để thấy được value= “mobile” hay  “desktop”, và hãy tưởng tượng nếu bạn phải debug 1 vòng lặp 1 triệu lần và phải nhấn Continue 1 triệu lần để thấy giá trị trả về thì sao. Hãy mở Break point’s setting (rê chuột vào break point) để thiết đặt, tránh điều đó xảy ra.

– Bạn có thể chọn “Conditions” và “Actions”, hãy tick vào “Condition”. Kiểm tra điều kiện đúng của biểu thức, ta quan tâm giá trị của  “decodedType”, nhập vào Text box kế bên và nhấn Enter để save. Bạn có thể add thêm Condition với “Hit Count” – như đã nói, chúng ta không thể nhấn “Continue” 1 triệu lần để test 1 triệu giá trị trả về sau mỗi lần nhấn, thay vào đó hãy dùng Hit Count và nhập vào 1000000 để chạy “continue” 1 triệu lần hihi. Và cuối cùng là “Filter” – cái tên nói lên tất cả, cho phép lọc và kiểm tra theo đối số nhận (MachineName, ProcessId, ProcessName, ThreadId, ThreadName).

– Chọn “Action” – logcat 1 message hiển thị thông báo trong quá trình debug. OK fine, toàn bộ mô tả trên bạn có thể xem hình bên dưới (click vào xem cho rõ)

dotnettip13

Sau khi debug 1 cách vi diệu (link video cuối blog) kết hợp với Immediate Window: code line 37 sẽ được sửa lại thành:

var apps = Data.Applications.Where(a => a.AppType.Equals(decodedType,System.StringComparison.OrdinalIgnoreCase));

Ôi, còn quá nhiều tips cần tham khảo trong video, mình dừng ở đây vậy ô hô hô.

==========================================

Vậy là chúng ta đã hiểu sơ qua 1 vài tips cô Kaycee trình bày trong video (link ở cuối bài viết). Hãy tìm hiểu thêm nhé, tuy demo trên source code này nhưng bạn có thể linh hoạt áp dụng những tips tương tự đã giới thiệu cho chính project của mình. Hiệu quả, an toàn, không bị xi-đa code khi lập trình.

================================================================================

Bài viết review từ video: https://channel9.msdn.com/Events/Build/2016/B806

Bonus: http://visualstudioshortcuts.com/2015


Cảm ơn bạn đã theo dõi blog.
Nhiều ngày tốt lành!

Advertisements

Cho mình biết cảm nhận của bạn nhé

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s