แบบฝึกหัด - ตรวจสอบตัวแปรและโฟลว์การดําเนินการ
มุมมอง 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 จะแสดงการตั้งค่าจุดสั่งหยุดปัจจุบัน และสามารถใช้เพื่อเปิดหรือปิดการใช้งานจุดสั่งหยุดเฉพาะในระหว่างเซสชันการดีบัก
กําหนดค่าแอปพลิเคชันของคุณและเปิดใช้งานการกําหนดค่า
เมื่อคุณกําลังทํางานกับแอปพลิเคชันคอนโซลที่อ่านการป้อนข้อมูลของผู้ใช้ คุณอาจต้องอัปเดตไฟล์การกําหนดค่าการเปิดใช้งาน
อัปเดตโค้ดในไฟล์ 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; }ใช้เวลาสักครู่เพื่อตรวจสอบรหัส
โปรดสังเกตต่อไปนี้:
- รหัสระบุอาร์เรย์จํานวนเต็มที่มีตัวเลขห้าตัว
- รหัสแสดงเอาต์พุตในคอนโซล
- รหัสจะแจ้งให้ผู้ใช้ป้อนหมายเลของค์ประกอบ
nเริ่มต้นที่ใช้ในการรวมองค์ประกอบnอาร์เรย์ผ่าน5 - รหัสจะคํานวณผลรวมในเมธอด แสดงผลลัพธ์ในคอนโซล จากนั้นจึงหยุดชั่วคราว
หมายเหตุ
แผง DEBUG CONSOLE ไม่สนับสนุนการป้อนข้อมูลของผู้ใช้จากคอนโซล
บนเมนู ไฟล์ Visual Studio Code ให้เลือก บันทึก
บนเมนู เรียกใช้ ให้เลือก ลบจุดสั่งหยุดทั้งหมด
ซึ่งจะลบจุดสั่งหยุดใดๆ ที่เหลืออยู่ออกจากแบบฝึกหัดก่อนหน้า
บนมุมมองเรียกใช้และดีบัก เลือกเริ่มการดีบัก
โปรดสังเกตว่ามีข้อผิดพลาดเกิดขึ้นเมื่อมีการดําเนินการตาม
Console.Clear();บรรทัดโค้ดบนแถบเครื่องมือแก้จุดบกพร่อง เลือกหยุด
สลับไปยังมุมมอง EXPLORER จากนั้นเปิดไฟล์ launch.json ในตัวแก้ไข
อัปเดตค่าของ
consoleแอตทริบิวต์ ดังนี้:"console":"integratedTerminal",บนเมนู ไฟล์ ของ Visual Studio Code ให้เลือก บันทึก แล้วปิดไฟล์ launch.json
ตรวจสอบผลลัพธ์ของแอปพลิเคชันและระบุปัญหา
การตรวจทานผลลัพธ์ของแอปพลิเคชันของคุณสามารถแสดงปัญหาเชิงตรรกะที่คุณมองข้ามเมื่อเขียนโค้ดของคุณ
สลับกลับไปยังมุมมองเรียกใช้และดีบัก
บนมุมมองเรียกใช้และดีบัก เลือกเริ่มการดีบัก
ข้อความที่แสดงในแผง DEBUG CONSOLE แสดงโปรแกรมดีบักเกอร์ที่แนบมากับ
Debug101.dllแอปพลิเคชันโปรดสังเกตว่าไม่มีข้อความแสดงข้อผิดพลาดปรากฏขึ้น
การเปลี่ยนค่าของ
consoleแอตทริบิวต์จาก internalConsole ไป เป็น integratedTerminal ในแฟ้มการกําหนดค่าการเปิดใช้ได้แก้ไขข้อผิดพลาดของคอนโซล แต่ในตอนนี้คุณต้องค้นหาคอนโซลที่ประกอบด้วยเอาต์พุตของคุณในพื้นที่แผงด้านล่างตัวแก้ไข สลับจากแผง DEBUG CONSOLE ไปยังแผงเทอร์มินัล
โปรดสังเกตว่าการดําเนินการโค้ดหยุดชั่วคราวที่ข้อความแจ้งให้ผู้ใช้ป้อนค่าสําหรับ
nเอาต์พุตบนแผงเทอร์มินัลควรมีลักษณะดังต่อไปนี้:
The 'numbers' array contains: { 1 2 3 4 5 } To sum values 'n' through 5, enter a value for 'n':ที่พรอมต์คําสั่ง TERMINAL ให้ป้อน 3
ตรวจทานผลลัพธ์จากแอปพลิเคชัน
เอาต์พุตบนแผงเทอร์มินัลควรมีลักษณะดังต่อไปนี้:
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ใช้เวลาหนึ่งนาทีในการพิจารณาค่า
sumที่รายงานของ และค่าขององค์ประกอบอาร์เรย์ 3 ถึง 5 ที่แสดงที่ด้านบนของคอนโซลข้อความระบุว่า:
The sum of numbers 3 through 5 is: 9อย่างไรก็ตาม องค์ประกอบอาร์เรย์ 3 ถึง 5 คือ3,4และ5ผลรวมที่รายงานแล้วไม่ควรเป็น 12 ใช่หรือไม่คุณสามารถใช้ส่วนตัวแปรของมุมมองเรียกใช้และดีบักเพื่อตรวจสอบปัญหาได้
ตรวจสอบสถานะตัวแปร
ในบางกรณี เพียงแค่ตรวจสอบสถานะตัวแปรก็เพียงพอที่จะระบุปัญหาเชิงตรรกะในแอปพลิเคชันของคุณ
ตั้งค่าจุดสั่งหยุดบนบรรทัดรหัสต่อไปนี้:
Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex)}");บนมุมมองเรียกใช้และดีบัก เลือกเริ่มการดีบัก
สลับจากแผง DEBUG CONSOLE ไปยังแผงเทอร์มินัล
ที่พรอมต์คําสั่ง TERMINAL ให้ป้อน 3
การดําเนินการโค้ดจะหยุดชั่วคราวที่จุดสั่งหยุด
ใช้เวลาสักครู่เพื่อตรวจสอบส่วนตัวแปรของมุมมอง RUN และ DEBUG
startIndexโปรดสังเกตว่า มีการกําหนดค่าที่คุณป้อน ซึ่งคือ3เลือก เข้าไปที่
โปรดสังเกตว่าส่วนตัวแปรและเรียกกองซ้อนได้รับการอัปเดต
ส่วน CALL STACK แสดงว่ามีการย้ายการดําเนินการโค้ดไปยัง
SumValuesเมธอด แล้วส่วน VARIABLES ซึ่งแสดงรายการตัวแปรภายในเครื่อง แสดงค่าของจํานวนเต็ม
nมีการกําหนดค่าพารามิเตอร์nเมธอด จากอาร์กิวเมนต์startIndexการเรียกใช้เมธอด ในกรณีนี้ การเปลี่ยนแปลงไปยังชื่อตัวแปรทําให้ชัดเจนว่ามีการส่งผ่านค่า ไม่ใช่ตัวชี้อ้างอิงหมายเหตุ
ในกรณีนี้ คุณสามารถดูโค้ดส่วนใหญ่ของคุณในตัวแก้ไข ดังนั้นคุณอาจไม่จําเป็นต้องใช้ส่วน CALL STACK แต่เมื่อคุณกําลังทํางานกับแอปพลิเคชันขนาดใหญ่ที่มีการเรียกใช้เมธอดที่ซ้อนกันอย่างลึกซึ้ง เส้นทางการดําเนินการที่แสดงในส่วน CALL STACK จะมีประโยชน์อย่างยิ่ง
เลือก ขั้นตอนไปยัง ต่อไปจนกว่าค่าที่
sumกําหนดให้กับ จะไม่เป็นอีกต่อไป0ใช้เวลาสักครู่เพื่อตรวจสอบข้อมูลที่แสดงในส่วนตัวแปร
คุณควรเห็นรายการต่อไปนี้:
โปรดสังเกตว่าค่าที่กําหนดให้
sumเปลี่ยนจาก0ไปยัง4เมื่อต้องการขยาย
numbersอาร์เรย์ ให้เลือก ตัวเลข [int[]]
โปรดทราบว่ามีการเข้าถึงองค์ประกอบอาร์เรย์โดยใช้หมายเลขดัชนีแบบฐานศูนย์
ในกรณีนี้ ข้อผิดพลาดทางตรรกะคือความขัดแย้งระหว่างคําแนะนําในอินเทอร์เฟซผู้ใช้และโค้ดพื้นฐาน อินเทอร์เฟซผู้ใช้อ้างอิงถึงรายการอาร์เรย์ 1-5 อย่างไรก็ตาม รหัสใช้ค่าที่ป้อนโดยผู้ใช้เพื่อเข้าถึงองค์ประกอบอาร์เรย์ที่ยึดตามศูนย์ องค์ประกอบอาร์เรย์ที่มีดัชนีของ
3จัดเก็บค่า ของ4โค้ดไม่ชดเชยหมายเลขดัชนีแบบฐานศูนย์เมื่อต้องการยุติเซสชันดีบัก ให้เลือก หยุด
ใช้เวลาสักครู่เพื่อพิจารณาว่าคุณอาจแก้ไขปัญหาได้อย่างไร
ปัญหานี้สามารถแก้ไขได้ในอินเทอร์เฟซผู้ใช้โดยการแจ้งให้ผู้ใช้ป้อนค่าระหว่าง 0 และ 4 ซึ่งอาจได้รับการแก้ไขในโค้ดโดยการลบ 1 ออกจากค่าที่ป้อน โดยทั่วไปเป้าหมายของคุณควรเป็นส่วนต่อประสานผู้ใช้ที่ชัดเจนและง่ายต่อการติดตาม ในกรณีนี้อาจดีกว่าที่จะอัปเดตโค้ดดังนี้:
Console.WriteLine($"\n\rThe sum of numbers {startIndex} through {numbers.Length} is: {SumValues(numbers, startIndex - 1)}");การเรียกใช้โค้ดที่อัปเดตแล้วจะสร้างเอาต์พุตต่อไปนี้:
อัปเดตโค้ดของคุณโดยใช้วิธีการที่แนะนํา แล้วบันทึกไฟล์ Program.cs ของคุณ
ล้างจุดสั่งหยุดของคุณ รันแอพลิเคชันอีกครั้งในตัวแก้ไขจุดบกพร่อง และตรวจสอบว่าผลลัพธ์ที่ตั้งใจไว้จะแสดงใน TERMINAL
คุณเพิ่งใช้สถานะตัวแปรเพื่อระบุและแก้ไขปัญหาเชิงตรรกะ! ทํางานได้ยอดเยี่ยม
ตรวจสอบนิพจน์นาฬิกา
ส่วน WATCH สามารถใช้เพื่อตรวจสอบนิพจน์ที่ยึดตามตัวแปรอย่างน้อยหนึ่งรายการ
สมมติว่าคุณกําลังทํางานบนแอปพลิเคชันที่ทําการคํานวณตัวเลขในชุดข้อมูล คุณเชื่อว่าโค้ดของคุณจะสร้างผลลัพธ์ที่ไม่น่าเชื่อถือเมื่ออัตราส่วนระหว่างตัวแปรตัวเลขสองตัวมีค่ามากกว่า 5 คุณสามารถใช้ส่วน WATCH เพื่อตรวจสอบอัตราส่วนที่คํานวณได้
อัปเดตไฟล์ 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);บันทึกไฟล์ Program.cs ของคุณ
ตั้งค่าจุดสั่งหยุดบนบรรทัดรหัสขั้นสุดท้าย
ตั้งค่านิพจน์ WATCH ต่อไปนี้:
num2 / num1 > 5บนมุมมองเรียกใช้และดีบัก เลือกเริ่มการดีบัก
โปรดสังเกตค่าที่แสดงในส่วน VARIABLES และ WATCH
เลือก ดําเนินการต่อ จนกว่าคุณจะเห็นนิพจน์ WATCH ประเมินเป็น
trueถ้านิพจน์ WATCH ที่มีการประเมินเป็น
trueในช่วงการทําซ้ําครั้งแรก ให้เลือก ดําเนินการต่อ อีกสองสามครั้ง หรือจนกว่าคุณจะเห็นtrueครั้งที่สองใช้เวลาสักครู่เพื่อพิจารณาว่าส่วน WATCH กําลังใช้งานอย่างไร
ในสถานการณ์นี้ คุณกําหนดว่าโค้ดของคุณสร้างผลลัพธ์ที่ไม่น่าเชื่อถือเมื่ออัตราส่วนระหว่างตัวแปรตัวเลขสองตัวมีค่ามากกว่า 5 คุณได้สร้างนิพจน์ในส่วน WATCH ที่แสดงถึงเงื่อนไขนี้ ตอนนี้คุณสามารถใช้ส่วน WATCH เพื่อติดตามเงื่อนไขดังกล่าวได้
ปรับเปลี่ยนค่าที่กําหนดให้กับตัวแปรในส่วน VARIABLES
อาจมีบางครั้งที่คุณต้องการสร้างเงื่อนไขทางโปรแกรมด้วยตนเอง ส่วน VARIABLES ของมุมมอง RUN และ DEBUG ช่วยให้คุณสามารถทําสิ่งนี้ได้โดยการเปลี่ยนสถานะของตัวแปรในขณะทํางาน
ใช้เวลาสักครู่เพื่อตรวจสอบโค้ดที่คุณกําลังใช้งาน
โปรดสังเกตว่ารหัสจะไม่ออกจาก
doรอบ เนื่องจากexitจะไม่เป็นtrueนี่ไม่ใช่เงื่อนไขทางโปรแกรมที่คุณ ld จําเป็นต้องเปลี่ยนแปลงในแอปพลิเคชันในโลกแห่งความจริง แต่แสดงถึงความสามารถในส่วน ตัวแปร ให้คลิก
exit [bool]ขวา แล้วเลือก ตั้งค่าส่วน VARIABLES ช่วยให้คุณสามารถเปลี่ยนค่าที่กําหนดให้กับตัวแปรในขณะทํางาน ซึ่งจะเป็นประโยชน์เมื่อคุณต้องการดูวิธีการที่โค้ดของคุณตอบสนองต่อเงื่อนไขเฉพาะ
เมื่อต้องการตั้งค่า ของ
exitเป็นtrueให้พิมพ์ true แล้วกด Enterในกรณีนี้ การเปลี่ยนค่าของ
exitเป็นtrueจะทําให้แอปพลิเคชันปิดเมื่อมีการwhileดําเนินการคําสั่งเลือก ดําเนินการต่อ
โปรดสังเกตว่าแผง DEBUG CONSOLE จะแสดงข้อความแจ้งให้คุณทราบว่าโปรแกรมได้ออกจากระบบแล้ว
ยินดีด้วย! คุณได้ใช้ส่วนตัวแปรและนาฬิกาของมุมมองการเรียกใช้และดีบักสําเร็จแล้ว
สรุป
นี่คือสิ่งสําคัญบางอย่างที่ต้องจําจากหน่วยนี้:
- ตรวจสอบสถานะตัวแปรโดยใช้ส่วนตัวแปรของมุมมอง RUN และ DEBUG
- ติดตามนิพจน์ตลอดช่วงเวลาหรือวิธีการที่แตกต่างกันโดยใช้ส่วน WATCH ของมุมมอง RUN และ DEBUG
- ใช้ส่วน CALL STACK ของมุมมอง RUN และ DEBUG เพื่อค้นหาตําแหน่งต้นทางของข้อยกเว้นหรือนิพจน์ WATCH
- ใช้ส่วน VARIABLES เพื่อเปลี่ยนค่าที่กําหนดของตัวแปรในขณะทํางาน