สอนการดีบักใน Visual Studio 2010

วันนี้ผมจะมาบอกเล่าวิธีที่จะทำให้เราสามารถดีบัคโปรแกรมของเราได้ง่ายๆ โดยการใช้ Visual Studio 2010 นะครับ ซึ่งทริปที่จะแนะนำก็มีด้วยกัน 10 วิธีบางวิธีผู้อ่านอาจจะเคยใช้มาบ้างแล้วนะครับ เรามาเริ่มดูตั้งแต่อันแรกเลยดีกว่าครับ
http://www.facebook.com/PStudioDev
  • Hover mouse to evaluate expression
วิธีนี้คือการที่เราเอาเมาส์ไปวางที่ตัวแปรที่เราต้องการจะดูค่านั่นเองครับ วิธีนี้เป็นวิธีที่ง่ายที่สุด และสดวกที่สุด แต่ในบางครั้งถ้าตัวแปรเรามีการซ้อนกันหลายชั้นมันก็อาจจะไม่สะดวก


  • Change values on-the-fly
วิธีนี้เป็นวิธีที่จะทำให้เราสามารถเปลี่ยนแปลงค่าในตัวแปรที่เรากำลังจะดีบัคอยู่ได้ ยกตัวอย่างเช่นถ้าเราเขียนโปรแกรมให้ rdpCtl.Server = "192.168.10.110" แล้วแต่เราเพิ่งนึกขึ้นได้ระหว่างโปรแกรมว่าที่จริงแล้วต้องเป็น IP 192.168.10.200 เราก็สามารถที่จะเปลี่ยนค่าในตัวแปรนั่นได้ทันทีเลย ไม่จำเป็นต้องรันโปรแกรมใหม่อีกครั้งหนึ่ง โดยเราสามารถเปลี่ยนค่าได้โดยเอาเมาส์ไปคลุมจุดที่เราต้องการจะเปลี่ยน เมื่อเปลี่ยนเสร็จให้กด Enter เพียงเท่านี้เราก็สามารถเปลี่ยนค่าได้ตามต้องการแล้วครับ

  • Set next statement
วิธีนี้สามารถทำให้เราข้ามบางบรรทัดของโค็ดที่เราไม่ต้องการจะรันได้เช่น ถ้าเรามีโค็ดว่ามีการตรวจสอบตัวแปรตัวหนึ่งว่าถ้าเป็นจริงให้รันต่อไป แต่ถ้าเป็นเท็จจะต้องออกจากฟังกชั่นนั่นไปทันที แต่จริงๆ แล้วเราต้องการดีบัคว่าถ้าตัวแปรตัวนั่นยังคงเป็นเท็จก็ยังให้สามารถรันโปรแกรมต่อไปได้ ถ้าเราต้องการทำอย่างนี้เราจำเป็นที่จะต้องแก้โค็ดและ Compile ใหม่ทำให้เสียเวลา แต่ถ้าเราใช้ Set next statement จะทำให้เราไม่จำเป็นต้อง Compile อะไรใหม่เลย

วิธีการก็เพียงง่ายๆ แค่ลากลูกศรสีเหลือง (บรรทัดที่ซึ่งกำลังรันอยู่) ไปบรรทัดที่เราต้องการจะให้รันเป็นบรรท้ดต่อไปเท่านั่นเองครับ

  • Edit and continue
วิธีนี้ก็จะคล้ายๆ กับอันก่อนหน้านี้เพียงแต่ว่าบางครั้งเราต้องการที่จะคอมเมนต์โค็ดบางส่วนออกในระหว่างที่เราดีบัคพอดี เราก็สามารถทำได้เลยโดยไม่จำเป็นที่จะต้องรันโปรแกรมอีกครั้ง ยกตัวอย่างเช่นจากด้านล่างในขฯะที่ดีบัคโปรแกรมแล้วเราต้องการเอาโค็ดในการตรวจสอบค่าตัวแปร running ออกเราก็สามารถทำได้เลยขณะที่เรากำลังอยู่ที่บรรทัด bool running = false; เพียงเท่านี้ก็ทำให้เราไม่มีโค็ดการตรวจสอบ false อยู่แล้วครับ

  • Watch window
ด้วยหน้าต่าง Watch window สามารถทำให้เราดีบัคหรือดูค่าในตัวแปรต่างๆ ได้เหมือนกับการเอาเมาส์ไป Over ตัวแปร (วิธีที่ 1) นั่นเองเพียงแต่จะใช้เยอะเมื่อเราต้องการดีบัคตัวแปรหลายๆ ตัวในเวลาเดียวกันนั่นเอง เพราะว่าถ้าเอาเมาส์ไป Over หลายๆ ตัวแปรคงไม่สะดวกนักนนะครับ

สำหรับวิธีเอาหน้าตา Watch window ออกมาก็ง่ายๆ ครับตามรูปด้านล่างเลย



  • Conditional breakpoints
ด้วยวิธีนี้จะทำให้คุณสะดวกมากเวลาดีบัคโปรแกรมที่มันต้องวนลูป เช่นถ้าเรามีลูป for แล้วมีการเพิ่มค่า i ไปเรื่อย แต่เราต้องการดีบัคว่าตอนที่ค่า i = 100 เพียงอย่างเดียวเท่านั่น ถ้าเราไม่มี Conditional breakpoints เราก็จะต้องกดปุ่ม F10 หรือ F11 ถึง 99 ครั้งกันเลยทีเดียว

แต่มันจะง่ายมากถ้าเราใช้ Conditional breakpoints ในการสร้าง breakpoints โดยเราคลิกขวาที่จุด breakpoints ของเรา


จากนั่นเลือก Condition... แล้วใส่ค่า i ที่เราต้องการ


เมื่อเราลองรันโปรแกรมดูก็จะเห็นว่า breakpoints จะทำงานเมื่อค่า i = 100 พอดี



จากหน้าตอนที่คลิกขวาจะเห็นได้นะครับว่ายังมี Options หลายหย่างให้เราใช้งานเลยครับไม่ว่าจะเป็น Location, Hit Count ....... ลองเอาไปปรับใช้กันดูนะครับ
  • Memory window
ผู้อ่านคงคุณกับการดีบัคโดยการเอาเมาส์ไปว่าง Over และการใช้ Watch window กันแล้วช่ายมั้ยครับ โดนทั่วไปสองอย่างนี้ก็เพียงพอต่อการเขียนโปรแกรมแล้ว แต่ทว่าในงานโปรแกรมบางอย่างที่มีความซับซ้อนหรือต้องยุ่งเกียวกับ Hardware การดีบัคแบบ 2 วิธีนั่นอาจจะไม่เพียงพอ บางครับเราต้องการรู้ว่าข้อมูลที่อยู่ใน Memory ระหว่าง 0x00AAA - 0xFFFFF มีค่าอะไรอยู่บ้าง ในกรณีนี้เราจะต้องใช้ Memory window ในการดูค่าเหล่านั่น

เราสามารถเปิด Memory window ได้โดย



เราสามารถลากตัวแปรที่เราต้องการรู้มาใส่ใน Memory window ได้เลยนะครับง่ายมาก ยกตัวอย่างเช่นผมลาก rdpCtl.Server มาใส่ใน Memory window จากนั่นเราก็จะเห็นค่าใน Memory แล้วละครับว่ามันมีค่า 192.168.10.110 อยู๋จริงๆ

  • Go To Definition
ด้วยวิธีนี้ทำให้เราสามารถรู้ได้ว่าตัวแปรที่เรากำลังดีบัคอยู่นั่นเป็น ตัวแปรชนิดอะไร หรือ Type อะไร ในโปรแกรมที่ใหญ่หรือมีโค็ดมากๆ จะเป็นการยากอย่างมากในการหาว่า Type อะไรเพราะโค๊ดมันเยอะมากจริงๆ ยกตัวอย่างเช่นถ้าเราดีบัคโปรแกรมอยู่แล้วมาเจอตัวแปร rdpCtl ซึ่งเราไม่รู้ว่าตัวแปรตัวนี้มี Type เป็นอะไร มันอาจจะทำให้เราดีบัคโปรแกรมได้ยากขึ้น แต่ถ้าเรามี Go To Definition เราก็สามารถรู้ได้ว่า rdpCtl เป็นตัวแปรชนิด Class AxMSTSCLib.AxMsTscAxNotSafeForScripting

วิธีการใช้งานก็ง่ายมากครับ เพียงคลิกเมาส์ตรงตัวแปรที่เราต้องการจะรู้จากนั่น คลิกขวาเลือก Go To Definition หรือ กด F12 ก็ได้ครับ


  • Threads window with stacks
สำหรับคนที่เขียนโปรแกรมโดยยใช้ Thread บ่อยๆ วิธีนี้น่าจะมีประโยช์นอย่างมากครับ เพราะจำทำให้เรารู้ว่าแต่ละ Thread ตอนนี้ทำงานอะไรอยู๋บ้างมี Call stack เป็นยังไงบ้าง


เราสามารถเปิด Tread window ได้โดย


เมื่อเราลองรันโปรแกรมที่เป็น Thread ดูก็จะได้ Call stack ของ Thread นั่นๆ

  • Call Hierarchy
ในบางครั้งการเขียนโปรแกรมที่ซับซ้อนและขนาดใหญ่มีโค๊ดเยอะๆ ถ้าเราต้องการรู้ว่า Function นี้โดนเรียกโดยใครมั่ง มันเป็นอะไรที่ยากมากที่เราจะรู้ได้หมด ทำให้เราไม่แน่ใจว่า Function ที่เรากำลังจะแก้นั่น ถ้าแก้ไปแล้วจะมีผลกะทบอะไรกับโค็ดส่วนอื่นหรือเปล่า แต่ถ้าเราใช้ Call Hierarchy ก็จะง่ายมากเพราะมันจะแสดงให้เราเห็นเลยว่า Function โดนเรียกที่ไหนบ้าง เราก็แค่ตามไปดูใน Function นั่นๆ ว่าถ้าเราแก้ไปแล้วจะมีผลอะไรบ้างหรือเปล่า

การเปิดใช้งานก็แค่เพียง


เช่นถ้าโค็ดเรามี Function ชื่อว่า Loop แล้วโดนเรียกที่ Function btnConnect_Click เมื่อเราใช้งาน Call Hierarchy (คลิกขวาที่ Function ที่เราต้องการรู้ เช่น Loop) ก็จะได้ประมาณนี้

ผลลัพธ์ก็จะได้ประมาณนี้



ถ้าอ่านแล้วชอบอย่าลืมช่วยกด Like ที่ http://www.facebook.com/PStudioDev ด้วยนะครับ ขอบคุณครับ

1 comments:

This comment has been removed by the author.