สำหรับ Computer Science แล้วคำว่า Stack นั้นหมายถึงโครงสร้างของข้อมูลชนิดหนึ่งที่มีลักษณะคือ
- เก็บข้อมูลได้เป็นชั้นๆ (เหมือนกับการวางมันฝรั่งแผ่นซ้อนๆกันไปเรื่อยๆ)
- การที่ข้อมูลเข้า Stack เรียกว่า Push และการเอาข้อมูลออกเรีนกว่า Pop
- ข้อมูลที่เก็บไว้นั้นเป็นแบบที่หลังได้ออกก่อน (เช่น เวลาเราจะต่อชั้นของมันฝรั่งเราจะทับแผ่นบนสุดของก่อนหน้านั้น จากนั้นมันฝรั่งแผ่นบนสุดจะถูกเอาไปกินก่อนเสมอ)
ส่วน Call Stack นั้นคือ ลำดับการเรียกของ Function/Method ของ Code โดยที่เก็บข้อมูลในแบบ Stack
Call Stack นี้สำคัญมากในการวิเคราะห์หรือการไล่ workflow เพื่อทางการแก้ไขข้อผิดพลาดของโปรแกรม เพราะจะช่วยให้เราเห็นว่า Function หรือว่า Code จุดที่เราสนใจนั้นมีลำดับการเรียกมาได้ยังไงกัน
มาดูกันเลยดีกว่า
ผมมี Code ตัวอย่างหน้าตาแบบนี้ครับ
Code นี้ไม่มีอะไรมาก คือมี Class Logger เพื่อทำหน้าที่เขียนข้อความลงบน Console
คำถามคือเวลาโปรแกรมนี้ทำงานมีนั้น มันมีลำดับการทำงานยังไงบ้างจนกระทั่งมาถึงการเขียนหน้าจอลง Console ในบรรทัดที่ 24
ซึ่งนี่แหละครับ Call Stack จะช่วยเราได้
1. ผมทำการตั้ง Break Point ไว้หลังจากที่มันเขียนข้อความเสร็จนะครับ
2. ลอง Debug กันเลยครับ F5 จัดไป
จะทำให้ Code เราหยุดที่บรรทัดที่ 24 ตามที่คิดไว้ แต่ตอนนี้เราจะไม่รู้เลยว่า Code มาถึงจุดนี้ได้ยังไง
ไปที่ Debug เมนูข้างบน Windows > Call Stack
เราก็จะเป็นหน้าต่าง Call Stack พร้อมกับลำดับชื่อ Functions ที่มีการเรียกจากล่างขึ้นบน
จากตัวอย่างนี้ตำแหน่งปัจจุบันคือสีเหลืองซึ่งก็คือ Logger.doLog()
และเราจะรู้ลำดับการเรียกของ Code จาก Call Stack (ดูจากล่างขึ้นบน) คือ Program.Main() ซึ่งเป็น Entry Point หลัก -> Logger.StartLog() -> Logger.doLog()
นี่แหละครับขุมพลังของ Call Stack
แต่ช้าก่อนเรายังสามารถเลือกดู Code ใน function ต่างๆใน Stack ได้จากการ Double Click นะครับ
ซึ่งจะทำให้มีลูกศรเขียวๆขึ้นมา
และทำให้เราเห็น Code ของ จุดที่เรียก Function นั้นๆ ด้วยครับ
สุดท้ายเราก็รู้ว่า Code เรามาถึงจุด Break Point นี้ได้ยังไง กันแล้วนะครับ 🙂
Debugging Series:
2 thoughts on “Debug – รู้ว่า code เรามาถึงจุดนี้ได้ยังไงกับ Call Stack”