แบบฝึกหัด - ตรวจสอบตัวแปรและโฟลว์การดําเนินการ

เสร็จสมบูรณ์เมื่อ

มุมมอง RUN และ DEBUG ช่วยให้นักพัฒนามีวิธีง่าย ๆ ในการตรวจสอบตัวแปรและนิพจน์ สังเกตโฟลว์การดําเนินการ และจัดการจุดสั่งหยุดในระหว่างกระบวนการดีบัก

ตรวจสอบส่วนต่างๆ ของมุมมองการเรียกใช้และการแก้ไขจุดบกพร่อง

แต่ละส่วนของมุมมองเรียกใช้และดีบักมีความสามารถเฉพาะ การใช้การรวมกันของส่วนเหล่านี้ในระหว่างกระบวนการดีบักมักจะเป็นประโยชน์

ส่วนตัวแปร

การตรวจสอบสถานะตัวแปรคือสิ่งสําคัญของการดีบักโค้ด การเปลี่ยนแปลงที่ไม่คาดคิดในสถานะตัวแปรมักจะช่วยในการระบุข้อผิดพลาดเชิงตรรกะในโค้ดของคุณ

ส่วน VARIABLES จัดระเบียบตัวแปรของคุณตามขอบเขต ขอบเขต Locals จะแสดงตัวแปรในขอบเขตปัจจุบัน (วิธีการปัจจุบัน)

หมายเหตุ

ส่วนคําสั่งระดับบนสุดของแอปพลิเคชันคอนโซลถือว่าเป็นวิธีการของตนเอง วิธีการ ที่ชื่อว่าMain

คุณสามารถยกเลิกการพับ (ขยาย) ขอบเขตที่แสดงอยู่ได้โดยการเลือกลูกศรทางด้านซ้ายของชื่อขอบเขต คุณยังสามารถคลี่คลายตัวแปรและวัตถุต่างๆ ได้ สกรีนช็อตต่อไปนี้แสดง numbers อาร์เรย์ที่ไม่ได้พับภายใต้ Locals ขอบเขต

สกรีนช็อตที่แสดงตัวแปรที่ไม่ได้พับในส่วนตัวแปรของมุมมองการเรียกใช้และดีบัก

นอกจากนี้ยังสามารถเปลี่ยนค่าของตัวแปรขณะทํางานโดยใช้ส่วน VARIABLES ได้อีกด้วย คุณสามารถดับเบิลคลิกที่ชื่อตัวแปร แล้วจึงป้อนค่าใหม่

ส่วน WATCH

จะเกิดอะไรขึ้นถ้าคุณต้องการติดตามสถานะตัวแปรตลอดเวลาหรือวิธีการที่แตกต่างกัน การค้นหาตัวแปรทุกครั้งอาจเป็นเรื่องน่าเบื่อ และตรงนี้คือจุดที่ส่วน WATCH นั้นมีประโยชน์

คุณสามารถเลือกปุ่ม เพิ่มนิพจน์ (ปรากฏเป็นเครื่องหมายบวก: +) เพื่อใส่ชื่อตัวแปรหรือนิพจน์ที่จะดูได้ อีกวิธีหนึ่งคือ คุณสามารถคลิกขวาที่ตัวแปรในส่วน VARIABLES และเลือกAdd to watch

นิพจน์ทั้งหมดภายในส่วน WATCH จะอัปเดตโดยอัตโนมัติเมื่อเรียกใช้โค้ดของคุณ

เรียกส่วนสแตก

ทุกครั้งที่รหัสของคุณใส่วิธีการจากวิธีอื่น เลเยอร์การโทรจะถูกเพิ่มไปยังสแตกการโทรของแอปพลิเคชัน เมื่อแอปพลิเคชันของคุณซับซ้อนและคุณมีรายการเมธอดที่ยาวการเรียกโดยวิธีการอื่น ๆ สแต็คการเรียกแสดงเส้นทางของการเรียกเมธอด

ส่วน CALL STACK มีประโยชน์เมื่อคุณพยายามค้นหาตําแหน่งต้นทางสําหรับข้อยกเว้นหรือนิพจน์ WATCH ถ้าแอปพลิเคชันของคุณเกิดข้อยกเว้นที่ไม่คาดคิด คุณจะเห็นข้อความในคอนโซลที่มีลักษณะดังต่อไปนี้:

Exception has occurred: CLR/System.DivideByZeroException
An unhandled exception of type 'System.DivideByZeroException' occurred in Debug1.dll: 'Attempted to divide by zero.'
    at Program.<<Main>$>g__WriteMessage|0_1() in C:\Users\howdc\Desktop\Debug1\Program.cs:line 27
    at Program.<<Main>$>g__Process1|0_0() in C:\Users\howdc\Desktop\Debug1\Program.cs:line 16
    at Program.<Main>$(String[] args) in C:\Users\howdc\Desktop\Debug1\Program.cs:line 10

กลุ่มที่เยื้องของ at Program ... บรรทัดใต้ข้อความแสดงข้อผิดพลาดจะเรียกว่าการติดตามสแตก การติดตามสแตกจะแสดงรายการชื่อและจุดเริ่มต้นของทุกเมธอดที่ถูกเรียกก่อนข้อยกเว้น ข้อมูลอาจเป็นเรื่องยากเล็กน้อยในการถอดรหัส เนื่องจากข้อมูลอาจรวมถึงข้อมูลจากรันไทม์ .NET ด้วย ในตัวอย่างนี้ การติดตามสแตกค่อนข้างสะอาดและคุณจะเห็นว่ามีข้อยกเว้นเกิดขึ้นในเมธอดที่ชื่อว่าWriteMessage สแตกมีต้นกําเนิดในเมธอดที่ Mainชื่อว่า ซึ่งเป็นส่วนคําสั่งระดับบนสุดของแอปพลิเคชันคอนโซล

ส่วน CALL STACK สามารถช่วยให้คุณหลีกเลี่ยงความยากลําบากในการถอดรหัสการติดตามสแตกที่กระจัดกระจายอยู่กับข้อมูลรันไทม์ .NET ซึ่งจะกรองข้อมูลที่ไม่ต้องการเพื่อแสดงให้คุณเห็นเฉพาะวิธีการที่เกี่ยวข้องจากรหัสของคุณเองตามค่าเริ่มต้น คุณสามารถคลายสแตกการโทรด้วยตนเองเพื่อค้นหาว่าข้อยกเว้นมาจากที่ใด

ส่วน BREAKPOINTS

ส่วน BREAKPOINTS จะแสดงการตั้งค่าจุดสั่งหยุดปัจจุบัน และสามารถใช้เพื่อเปิดหรือปิดการใช้งานจุดสั่งหยุดเฉพาะในระหว่างเซสชันการดีบัก

กําหนดค่าแอปพลิเคชันของคุณและเปิดใช้งานการกําหนดค่า

เมื่อคุณกําลังทํางานกับแอปพลิเคชันคอนโซลที่อ่านการป้อนข้อมูลของผู้ใช้ คุณอาจต้องอัปเดตไฟล์การกําหนดค่าการเปิดใช้งาน

  1. อัปเดตโค้ดในไฟล์ Program.cs ของคุณดังต่อไปนี้:

    string? readResult;
    int startIndex = 0;
    bool goodEntry = false;
    
    int[] numbers = { 1, 2, 3, 4, 5 };
    
    // Display the array to the console.
    Console.Clear();
    Console.Write("\n\rThe 'numbers' array contains: { ");
    foreach (int number in numbers)
    {
        Console.Write($"{number} ");
    }
    
    // To calculate a sum of array elements, 
    //  prompt the user for the starting element number.
    Console.WriteLine($"}}\n\r\n\rTo sum values 'n' through 5, enter a value for 'n':");
    while (goodEntry == false)
    {
        readResult = Console.ReadLine();
        goodEntry = int.TryParse(readResult, out startIndex);
    
        if (startIndex > 5)
        {
            goodEntry = false;
            Console.WriteLine("\n\rEnter an integer value between 1 and 5");
        }
    }
    
    // Display the sum and then pause.
    Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex)}");
    
    Console.WriteLine("press Enter to exit");
    readResult = Console.ReadLine();
    
    // This method returns the sum of elements n through 5
    static int SumValues(int[] numbers, int n)
    {
        int sum = 0;
        for (int i = n; i < numbers.Length; i++)
        {
            sum += numbers[i];
        }
        return sum;
    }
    
  2. ใช้เวลาสักครู่เพื่อตรวจสอบรหัส

    โปรดสังเกตต่อไปนี้:

    • รหัสระบุอาร์เรย์จํานวนเต็มที่มีตัวเลขห้าตัว
    • รหัสแสดงเอาต์พุตในคอนโซล
    • รหัสจะแจ้งให้ผู้ใช้ป้อนหมายเลของค์ประกอบnเริ่มต้นที่ใช้ในการรวมองค์ประกอบnอาร์เรย์ผ่าน5
    • รหัสจะคํานวณผลรวมในเมธอด แสดงผลลัพธ์ในคอนโซล จากนั้นจึงหยุดชั่วคราว

    หมายเหตุ

    แผง DEBUG CONSOLE ไม่สนับสนุนการป้อนข้อมูลของผู้ใช้จากคอนโซล

  3. บนเมนู ไฟล์ Visual Studio Code ให้เลือก บันทึก

  4. บนเมนู เรียกใช้ ให้เลือก ลบจุดสั่งหยุดทั้งหมด

    ซึ่งจะลบจุดสั่งหยุดใดๆ ที่เหลืออยู่ออกจากแบบฝึกหัดก่อนหน้า

  5. บนมุมมองเรียกใช้และดีบัก เลือกเริ่มการดีบัก

  6. โปรดสังเกตว่ามีข้อผิดพลาดเกิดขึ้นเมื่อมีการดําเนินการตาม Console.Clear(); บรรทัดโค้ด

  7. บนแถบเครื่องมือแก้จุดบกพร่อง เลือกหยุด

  8. สลับไปยังมุมมอง EXPLORER จากนั้นเปิดไฟล์ launch.json ในตัวแก้ไข

  9. อัปเดตค่าของ console แอตทริบิวต์ ดังนี้:

    "console":"integratedTerminal",
    
  10. บนเมนู ไฟล์ ของ Visual Studio Code ให้เลือก บันทึก แล้วปิดไฟล์ launch.json

ตรวจสอบผลลัพธ์ของแอปพลิเคชันและระบุปัญหา

การตรวจทานผลลัพธ์ของแอปพลิเคชันของคุณสามารถแสดงปัญหาเชิงตรรกะที่คุณมองข้ามเมื่อเขียนโค้ดของคุณ

  1. สลับกลับไปยังมุมมองเรียกใช้และดีบัก

  2. บนมุมมองเรียกใช้และดีบัก เลือกเริ่มการดีบัก

    ข้อความที่แสดงในแผง DEBUG CONSOLE แสดงโปรแกรมดีบักเกอร์ที่แนบมากับ Debug101.dll แอปพลิเคชัน

  3. โปรดสังเกตว่าไม่มีข้อความแสดงข้อผิดพลาดปรากฏขึ้น

    การเปลี่ยนค่าของ console แอตทริบิวต์จาก internalConsole ไป เป็น integratedTerminal ในแฟ้มการกําหนดค่าการเปิดใช้ได้แก้ไขข้อผิดพลาดของคอนโซล แต่ในตอนนี้คุณต้องค้นหาคอนโซลที่ประกอบด้วยเอาต์พุตของคุณ

  4. ในพื้นที่แผงด้านล่างตัวแก้ไข สลับจากแผง DEBUG CONSOLE ไปยังแผงเทอร์มินัล

  5. โปรดสังเกตว่าการดําเนินการโค้ดหยุดชั่วคราวที่ข้อความแจ้งให้ผู้ใช้ป้อนค่าสําหรับn

    เอาต์พุตบนแผงเทอร์มินัลควรมีลักษณะดังต่อไปนี้:

    
    The 'numbers' array contains: { 1 2 3 4 5 }
    
    To sum values 'n' through 5, enter a value for 'n':
    
  6. ที่พรอมต์คําสั่ง TERMINAL ให้ป้อน 3

  7. ตรวจทานผลลัพธ์จากแอปพลิเคชัน

    เอาต์พุตบนแผงเทอร์มินัลควรมีลักษณะดังต่อไปนี้:

    
    The 'numbers' array contains: { 1 2 3 4 5 }
    
    To sum values 'n' through 5, enter a value for 'n':
    3
    
    The sum of numbers 3 through 5 is: 9
    press Enter to exit
    
  8. ใช้เวลาหนึ่งนาทีในการพิจารณาค่า sum ที่รายงานของ และค่าขององค์ประกอบอาร์เรย์ 3 ถึง 5 ที่แสดงที่ด้านบนของคอนโซล

    ข้อความระบุว่า: The sum of numbers 3 through 5 is: 9 อย่างไรก็ตาม องค์ประกอบอาร์เรย์ 3 ถึง 5 คือ 3, 4และ5 ผลรวมที่รายงานแล้วไม่ควรเป็น 12 ใช่หรือไม่

    คุณสามารถใช้ส่วนตัวแปรของมุมมองเรียกใช้และดีบักเพื่อตรวจสอบปัญหาได้

ตรวจสอบสถานะตัวแปร

ในบางกรณี เพียงแค่ตรวจสอบสถานะตัวแปรก็เพียงพอที่จะระบุปัญหาเชิงตรรกะในแอปพลิเคชันของคุณ

  1. ตั้งค่าจุดสั่งหยุดบนบรรทัดรหัสต่อไปนี้:

    Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex)}");
    
  2. บนมุมมองเรียกใช้และดีบัก เลือกเริ่มการดีบัก

  3. สลับจากแผง DEBUG CONSOLE ไปยังแผงเทอร์มินัล

  4. ที่พรอมต์คําสั่ง TERMINAL ให้ป้อน 3

    การดําเนินการโค้ดจะหยุดชั่วคราวที่จุดสั่งหยุด

  5. ใช้เวลาสักครู่เพื่อตรวจสอบส่วนตัวแปรของมุมมอง RUN และ DEBUG

    startIndexโปรดสังเกตว่า มีการกําหนดค่าที่คุณป้อน ซึ่งคือ3

  6. เลือก เข้าไปที่

  7. โปรดสังเกตว่าส่วนตัวแปรและเรียกกองซ้อนได้รับการอัปเดต

    ส่วน CALL STACK แสดงว่ามีการย้ายการดําเนินการโค้ดไปยัง SumValues เมธอด แล้ว

    ส่วน VARIABLES ซึ่งแสดงรายการตัวแปรภายในเครื่อง แสดงค่าของจํานวนเต็มn มีการกําหนดค่าพารามิเตอร์ n เมธอด จากอาร์กิวเมนต์ startIndexการเรียกใช้เมธอด ในกรณีนี้ การเปลี่ยนแปลงไปยังชื่อตัวแปรทําให้ชัดเจนว่ามีการส่งผ่านค่า ไม่ใช่ตัวชี้อ้างอิง

    หมายเหตุ

    ในกรณีนี้ คุณสามารถดูโค้ดส่วนใหญ่ของคุณในตัวแก้ไข ดังนั้นคุณอาจไม่จําเป็นต้องใช้ส่วน CALL STACK แต่เมื่อคุณกําลังทํางานกับแอปพลิเคชันขนาดใหญ่ที่มีการเรียกใช้เมธอดที่ซ้อนกันอย่างลึกซึ้ง เส้นทางการดําเนินการที่แสดงในส่วน CALL STACK จะมีประโยชน์อย่างยิ่ง

  8. เลือก ขั้นตอนไปยัง ต่อไปจนกว่าค่าที่sumกําหนดให้กับ จะไม่เป็นอีกต่อไป0

  9. ใช้เวลาสักครู่เพื่อตรวจสอบข้อมูลที่แสดงในส่วนตัวแปร

    คุณควรเห็นรายการต่อไปนี้:

    สกรีนช็อตที่แสดงส่วนตัวแปรของมุมมองการเรียกใช้และดีบัก

    โปรดสังเกตว่าค่าที่กําหนดให้ sum เปลี่ยนจาก 0 ไปยัง4

  10. เมื่อต้องการขยาย numbers อาร์เรย์ ให้เลือก ตัวเลข [int[]]

    สกรีนช็อตที่แสดงองค์ประกอบอาร์เรย์ที่ขยายในส่วนตัวแปรของมุมมองเรียกใช้และดีบัก

  11. โปรดทราบว่ามีการเข้าถึงองค์ประกอบอาร์เรย์โดยใช้หมายเลขดัชนีแบบฐานศูนย์

    ในกรณีนี้ ข้อผิดพลาดทางตรรกะคือความขัดแย้งระหว่างคําแนะนําในอินเทอร์เฟซผู้ใช้และโค้ดพื้นฐาน อินเทอร์เฟซผู้ใช้อ้างอิงถึงรายการอาร์เรย์ 1-5 อย่างไรก็ตาม รหัสใช้ค่าที่ป้อนโดยผู้ใช้เพื่อเข้าถึงองค์ประกอบอาร์เรย์ที่ยึดตามศูนย์ องค์ประกอบอาร์เรย์ที่มีดัชนีของ 3 จัดเก็บค่า ของ4 โค้ดไม่ชดเชยหมายเลขดัชนีแบบฐานศูนย์

  12. เมื่อต้องการยุติเซสชันดีบัก ให้เลือก หยุด

  13. ใช้เวลาสักครู่เพื่อพิจารณาว่าคุณอาจแก้ไขปัญหาได้อย่างไร

    ปัญหานี้สามารถแก้ไขได้ในอินเทอร์เฟซผู้ใช้โดยการแจ้งให้ผู้ใช้ป้อนค่าระหว่าง 0 และ 4 ซึ่งอาจได้รับการแก้ไขในโค้ดโดยการลบ 1 ออกจากค่าที่ป้อน โดยทั่วไปเป้าหมายของคุณควรเป็นส่วนต่อประสานผู้ใช้ที่ชัดเจนและง่ายต่อการติดตาม ในกรณีนี้อาจดีกว่าที่จะอัปเดตโค้ดดังนี้:

    Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex - 1)}");
    

    การเรียกใช้โค้ดที่อัปเดตแล้วจะสร้างเอาต์พุตต่อไปนี้:

    สกรีนช็อตที่แสดงเอาต์พุตหลังจากอัปเดตตรรกะของแอปพลิเคชัน

  14. อัปเดตโค้ดของคุณโดยใช้วิธีการที่แนะนํา แล้วบันทึกไฟล์ Program.cs ของคุณ

  15. ล้างจุดสั่งหยุดของคุณ รันแอพลิเคชันอีกครั้งในตัวแก้ไขจุดบกพร่อง และตรวจสอบว่าผลลัพธ์ที่ตั้งใจไว้จะแสดงใน TERMINAL

    คุณเพิ่งใช้สถานะตัวแปรเพื่อระบุและแก้ไขปัญหาเชิงตรรกะ! ทํางานได้ยอดเยี่ยม

ตรวจสอบนิพจน์นาฬิกา

ส่วน WATCH สามารถใช้เพื่อตรวจสอบนิพจน์ที่ยึดตามตัวแปรอย่างน้อยหนึ่งรายการ

สมมติว่าคุณกําลังทํางานบนแอปพลิเคชันที่ทําการคํานวณตัวเลขในชุดข้อมูล คุณเชื่อว่าโค้ดของคุณจะสร้างผลลัพธ์ที่ไม่น่าเชื่อถือเมื่ออัตราส่วนระหว่างตัวแปรตัวเลขสองตัวมีค่ามากกว่า 5 คุณสามารถใช้ส่วน WATCH เพื่อตรวจสอบอัตราส่วนที่คํานวณได้

  1. อัปเดตไฟล์ Program.cs ด้วยโค้ดต่อไปนี้:

    bool exit = false;
    var rand = new Random();
    int num1 = 5;
    int num2 = 5;
    
    do
    {
        num1 = rand.Next(1, 11);
        num2 = num1 + rand.Next(1, 51);
    
    } while (exit == false);
    
  2. บันทึกไฟล์ Program.cs ของคุณ

  3. ตั้งค่าจุดสั่งหยุดบนบรรทัดรหัสขั้นสุดท้าย

  4. ตั้งค่านิพจน์ WATCH ต่อไปนี้:

    num2 / num1 > 5
    
  5. บนมุมมองเรียกใช้และดีบัก เลือกเริ่มการดีบัก

  6. โปรดสังเกตค่าที่แสดงในส่วน VARIABLES และ WATCH

  7. เลือก ดําเนินการต่อ จนกว่าคุณจะเห็นนิพจน์ WATCH ประเมินเป็นtrue

    ถ้านิพจน์ WATCH ที่มีการประเมินเป็น true ในช่วงการทําซ้ําครั้งแรก ให้เลือก ดําเนินการต่อ อีกสองสามครั้ง หรือจนกว่าคุณจะเห็น true ครั้งที่สอง

  8. ใช้เวลาสักครู่เพื่อพิจารณาว่าส่วน WATCH กําลังใช้งานอย่างไร

    ในสถานการณ์นี้ คุณกําหนดว่าโค้ดของคุณสร้างผลลัพธ์ที่ไม่น่าเชื่อถือเมื่ออัตราส่วนระหว่างตัวแปรตัวเลขสองตัวมีค่ามากกว่า 5 คุณได้สร้างนิพจน์ในส่วน WATCH ที่แสดงถึงเงื่อนไขนี้ ตอนนี้คุณสามารถใช้ส่วน WATCH เพื่อติดตามเงื่อนไขดังกล่าวได้

ปรับเปลี่ยนค่าที่กําหนดให้กับตัวแปรในส่วน VARIABLES

อาจมีบางครั้งที่คุณต้องการสร้างเงื่อนไขทางโปรแกรมด้วยตนเอง ส่วน VARIABLES ของมุมมอง RUN และ DEBUG ช่วยให้คุณสามารถทําสิ่งนี้ได้โดยการเปลี่ยนสถานะของตัวแปรในขณะทํางาน

  1. ใช้เวลาสักครู่เพื่อตรวจสอบโค้ดที่คุณกําลังใช้งาน

    โปรดสังเกตว่ารหัสจะไม่ออกจากdoรอบ เนื่องจากexitจะไม่เป็นtrue นี่ไม่ใช่เงื่อนไขทางโปรแกรมที่คุณ ld จําเป็นต้องเปลี่ยนแปลงในแอปพลิเคชันในโลกแห่งความจริง แต่แสดงถึงความสามารถ

  2. ในส่วน ตัวแปร ให้คลิกexit [bool]ขวา แล้วเลือก ตั้งค่า

    ส่วน VARIABLES ช่วยให้คุณสามารถเปลี่ยนค่าที่กําหนดให้กับตัวแปรในขณะทํางาน ซึ่งจะเป็นประโยชน์เมื่อคุณต้องการดูวิธีการที่โค้ดของคุณตอบสนองต่อเงื่อนไขเฉพาะ

  3. เมื่อต้องการตั้งค่า ของ exit เป็น trueให้พิมพ์ true แล้วกด Enter

    ในกรณีนี้ การเปลี่ยนค่าของ exit เป็น true จะทําให้แอปพลิเคชันปิดเมื่อมีการ while ดําเนินการคําสั่ง

  4. เลือก ดําเนินการต่อ

  5. โปรดสังเกตว่าแผง DEBUG CONSOLE จะแสดงข้อความแจ้งให้คุณทราบว่าโปรแกรมได้ออกจากระบบแล้ว

ยินดีด้วย! คุณได้ใช้ส่วนตัวแปรและนาฬิกาของมุมมองการเรียกใช้และดีบักสําเร็จแล้ว

สรุป

นี่คือสิ่งสําคัญบางอย่างที่ต้องจําจากหน่วยนี้:

  • ตรวจสอบสถานะตัวแปรโดยใช้ส่วนตัวแปรของมุมมอง RUN และ DEBUG
  • ติดตามนิพจน์ตลอดช่วงเวลาหรือวิธีการที่แตกต่างกันโดยใช้ส่วน WATCH ของมุมมอง RUN และ DEBUG
  • ใช้ส่วน CALL STACK ของมุมมอง RUN และ DEBUG เพื่อค้นหาตําแหน่งต้นทางของข้อยกเว้นหรือนิพจน์ WATCH
  • ใช้ส่วน VARIABLES เพื่อเปลี่ยนค่าที่กําหนดของตัวแปรในขณะทํางาน