Debug – แอบส่องค่าตัวแปรต่างๆด้วย Watch (และ Autos, Locals)

ถ้าต้องยกว่าอะไรคือหัวใจหลักของการ Debug ผมก็คงต้องยกให้ความสามารถที่เรา ดูค่าของตัวแปรหรือ Object ได้ในขณะที่โปรแกรมนั้นกำลังทำงานอยู่ เพราะมันช่วยให้เราสามารถเข้าใจปัญหาได้เร็วขึ้นมาก ว่าทำไมโปรแกรมถึงทำงานได้ไม่ตรงที่เราคาดหวังไว้

ความสามารถนี้ Debugger ยอดนิยมต่างๆมีให้เราครับ ผ่านหน้าต่าง Watch รวมทั้ง Autos และ Locals

มาลุยกันเลยครับ ผมมี Code แบบนี้ ซึ่งหลักๆก็คือ รับค่าจาก Keyboard จากนั้นก็จะแสดงผลบนหน้าจอว่า User พิมพ์อะไรเข้ามา มีความยาวกี่ตัวอักษร และเวลาเมื่อไหร่

using System;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         Console.WriteLine("Type some keys please");
         var ireader = new InputReader();
         ireader.Capture();
         Console.WriteLine("User Input : {0} | Length : {1} | at {2}", ireader.Data, ireader.Length, ireader.Time.ToShortTimeString());
      }
   }

   class InputReader
   {
      public string Data { get; set; }
      public int Length { get; set; }
      public DateTime Time { get; set; }
      public void Capture()
      {
         Data = Console.ReadLine();
         Length = Data.Length;
         Time = DateTime.Now;
      }
   }
}

ลองรันกันก่อนรอบนึงครับ ผลจะออกมาเป็นแบบนี้

run

ที่นี้เรามาตั้ง Break Point  ไว้ที่บรรทัดที่ 12 กันครับ ซึ่งจะหยุดหลังจากที่ User พิมพ์อะไรเข้ามาแล้ว Enter

run_1

หยุดแล้วครับหลังจากพิมพ์ว่า “Debuggerrrrrrrr!!!!@”

run_2

ที่นี้ถ้าเราอยากดูว่าตอนที่โปรแกรมมันทำงานจริงๆแล้วมันเก็บค่าอะไรอยู่

มาที่เมนูนี้เลยครับ Debug > Windows > Watch, Autos, Locals ทำการเปิดทั้ง 3 หน้าต่างนี้

watch_menu

โดยปกติแล้วหน้าต่างพวกนี้จะอยู่บริเวณนี้ครับ (ปรับได้ที่หลังตามสะดวก)

watch_windows.png

Watch

หน้าต่างนี้ถือเป็นไฮไลท์ของเรา เพราะเราสามารถพิมพ์ชื่อตัวแปรใส่ไปในช่อง Name ได้เลยครับแล้วมันจะทำการแสดงค่าออกมา
1. ลองใส่ ireader ดูเราก็จะเห็นค่าของ Object นี้ทั้งหมด รวมทั้ง Properties ด้วย

watch_win1

2. เท่านั้นยังไม่พอครับ เราสามารถใส่ expression ได้ครับ เช่น ireader.Length > 0 ซึ่งจากตัวอย่างมันก็ return ค่าเป็น true ให้เราครับ

watch_win2

Autos

สำหรับคนที่ขี้เกียจเพิ่มตัวแปรเอง ก็ใช้หน้าต่าง Autos ซึ่งจำทำการแสดงตัวแปรทั้งหมดใน Memory ของ Scope นั้นๆ จนกระทั่งมาถึง Code บรรทัดที่ทำการ Break ในเคสนี้ก็จะเห็นตัวแปรประมาณนี้

auto_win

Locals

คล้ายๆกับ Autos แต่จะแสดงเฉพาะตัวแปรที่มีกาประกาศหรือสร้างใน Scope เท่านั้น

เช่น args นั้นจะถูกประกาศตอนที่ Main() method ถูกเรียก
และ ireader นั้นถูกประกาศและสร้างจาก new InputReader();

locals_win

มาถึงตรงนี้ก็จะเห็นว่าเมื่อรวม Break Point, Steps (Into, Over, Out) และ Watch ก็ทำให้เราไล่ Code พร้อมทั้งดูตัวแปรต่างๆในขณะที่โปรแกรมทำงานได้ หวังว่าจะมีประโยชน์นะครับ

แต่…ความสามารถของ Debugger ยังไม่หมดเท่านั้นครับ

Edit and Continue

เรายังสามารถแก้ไขค่าในตัวแปรแล้วให้มันทำงานต่อได้ด้วยโดยการ double click ที่ Value ในช่องของหน้าต่าง Watch, Autos, Locals

watch_editing.png

แก้เป็น “hey dude anurocha!”

watch_editing2
ตัวแปรที่ถูกแก้ไขค่าจะเป็นสีแดง

ที่นี้ก็ลอง F5 เพื่อ Continue ดูครับจะเห็นว่ามัน Write ค่า ireader.Data เป็นค่าที่เราแก้ไข

watch_edit_run.png

ณ จุดๆนี้เป็นอันจบพื้นฐานการ Debug ที่จะช่วยให้ทุกท่านทำงานได้อย่างง่ายขึ้นนะครับ

*รูป Featured Image จาก The Lord of the Rings

Advertisements

Leave a Reply

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 )

Connecting to %s